New project NodeMCU_Neopixel integrated

epvpn
kln 3 years ago
parent 482d79a994
commit 30b7a68edd
  1. 118
      content/projekt/NodeMCU_Neopixel.md
  2. BIN
      static/images/NodeMCU_Neopixel/MASTER_script.jpg
  3. BIN
      static/images/NodeMCU_Neopixel/NodeMCU_Neopixel.jpg
  4. BIN
      static/images/NodeMCU_Neopixel/NodeMCU_Neopixel.webm
  5. BIN
      static/images/NodeMCU_Neopixel/font_sample1.jpg
  6. BIN
      static/images/NodeMCU_Neopixel/font_sample2.jpg
  7. BIN
      static/images/NodeMCU_Neopixel/font_vorlage.jpg
  8. BIN
      static/images/NodeMCU_Neopixel/overview.jpg

@ -0,0 +1,118 @@
---
title: NodeMCU Neopixel
author: kaqu
status: Aktiv
difficulty: einfach
time: ~1h
date: 2019-11-14
image: /images/NodeMCU_Neopixel/overview.jpg
keywords: NodeMCU,ESP8266,ESP32,Lua,Neopixel,Font-Design
---
## Motivation ##
Phail hat eine Lampe gebaut (s. anderes Projekt). Hierfür fehlte
zunächst etwas, mit dem man Text anzeigen kann. Mit einem einfachen
Lua-Script und der WS2812 Bibliothek der NodeMCU sollte so etwas
leicht herstellbar sein.
{{< fluid_img alt="Showtime" src="/images/NodeMCU_Neopixel/NodeMCU_Neopixel.jpg" >}}
## Planung ##
Die Lampe besteht aus einer Kette Neopixel. Diese sind aufgeteilt
in einzelne Ringe à 16 Stück. Die Tücke für dies Vorhaben liegt
im Versatz der LEDs. Die aktuelle Lampenmatrix ist also wie folgt
aufgebaut (von oben nach unten gibt es insgesamt 20 Ringe - es würde
aber auch mit z.Bsp. 10 Ringen funktionieren):
###Ring#:Indizes in Neopixelkette ... ###
20:305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320
...
10:145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,
9: 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,
8:113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,
7: 097,098,099,100,101,102,103,104,105,106,107,108,109,110,111,112,
6:081,082,083,084,085,086,087,088,089,090,091,092,093,094,095,096,
5: 065,066,067,068,069,070,071,072,073,074,075,076,077,078,079,080,
4:049,050,051,052,053,054,055,056,057,058,059,060,061,062,063,064,
3: 033,034,035,036,037,038,039,040,041,042,043,044,045,046,047,048,
2:017,018,019,020,021,022,023,024,025,026,027,028,029,030,031,032,
1: 001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,016,
Für den Lampenversatz von Ring zu Ring braucht es einen speziellen
Font (ein Test mit 'Schrägstellen' eines herkömmlichen Fonts ergab
gruselige Resultate ...).
## Font-Design ##
In der Font-Erstellung liegt die Hauptarbeit in diesem Projekt.
Dazu habe ich ganz traditionell eine Leermatrix mit LibreOffice Draw
gemalt und als Vorlage für die ersten 127 Zeichen benutzt (ebenfalls
im Draw nach Gefühl 'gemalt').
{{< fluid_img alt="Font Vorlage" src="/images/NodeMCU_Neopixel/font_vorlage.jpg" >}}
{{< fluid_img alt="Fontbeispiel 1" src="/images/NodeMCU_Neopixel/font_sample1.jpg" >}}
{{< fluid_img alt="Fontbeispiel 2" src="/images/NodeMCU_Neopixel/font_sample2.jpg" >}}
Anschließend werden die Pixel einzeln ausgezählt, zunächst binär, dann hex.
Für den hier vorgesehenen 7x9 Font werden je Zeichen 9 Bytes mit 7 Bits
verwendet (Bits 7-1, Bit0 wird nicht verwendet).
Die Hex-Werte werden in einer Beschreibungsdatei gesammelt (eigentlich
ein 'misbrauchtes' C-Sourcefile aus einem anderen Projekt). Mittels
eines kleinen (Lua-)Scripts wird daraus ein Binärfile ('np_codes.bin')
auf dem PC erzeugt und zur NodeMCU hochgeladen.
## Font-Anzeige ##
Um ein leidlich sanftes Durchschieben des Textes zu erreichen, wird
mit einem vergrößerten Puffer gearbeitet. Dies ermöglicht das verdeckte
Laden und Einblenden eines neuen Zeichens. Durch zyklisches Schieben
wird jetzt das neue Zeichen (und alle anderen Zeichen) langsam (Spalte
für Spalte) in den sichtbaren Bereich geschoben.
|Ring|Indizes in |('double buffer') |Neopixelkette ... |
|:---|:-------------------------|:---------------------------------------------------------------|:--------------------------|
|20|571,572,573,574,575,576,577,|578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,|594,595,596,597,598,599,600|
|...|...|...|...|
|10|271,272,273,274,275,276,277,|278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,|294,295,296,297,298,299,300,|
|9|241,242,243,244,245,246,247, |248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,|264,265,266,267,268,269,270,|
|8|211,212,213,214,215,216,217, |218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,|234,235,236,237,238,239,240,|
|7|181,182,183,184,185,186,187, |188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,|204,205,206,207,208,209,210,|
|6|151,152,153,154,155,156,157, |158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,|174,175,176,177,178,179,180,|
|5|121,122,123,124,125,126,127, |128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,|144,145,146,147,148,149,150,|
|4|091,092,093,094,095,096,097, |098,099,100,101,102,103,104,105,106,107,108,109,110,111,112,113,|114,115,116,117,118,119,120,|
|3|061,062,063,064,065,066,067, |068,069,070,071,072,073,074,075,076,077,078,079,080,081,082,083,|084,085,086,087,088,089,090,|
|2|031,032,033,034,035,036,037, |038,039,040,041,042,043,044,045,046,047,048,049,050,051,052,053,|054,055,056,057,058,059,060,|
|1|001,002,003,004,005,006,007, |008,009,010,011,012,013,014,015,016,017,018,019,020,021,022,023,|024,025,026,027,028,029,030,|
Die Zeichen werden jetzt ganz rechts geladen (Indizes Quadrat 24-30 bis 264-270 für die Ringe 1-9).
Ring 10 wird für eine doppelt so schnell umlaufende 'Spur' genutzt.
Ring 11-19 wird analog mit einer zweiten Textmeldung geladen, in Ring 20 gibt es dann noch eine 'Spur'.
Das Schieben geschieht dann nach links, jeweils um eine Spalte (also zu Indizes 23,53,83 etc. bis 593).
## Hier noch ein Demo-Filmchen ... ##
{{< fluid_img alt="Demo" src="/images/NodeMCU_Neopixel/NodeMCU_Neopixel.webm" >}}
## Erweiterungen ##
Sofern die NodeMCU Firmware mit Multicast-Erweiterungen genutzt wird,
kann der NodeMCU-Client auf einfache Weise mit anzuzeigenden Texten versorgt
werden.
Hier wird z.Bsp. ein Lua-Script auf einem (PC-)Server ausgeführt, das einen
Heise RSS-Feed mitliest und die jeweils 2 aktuellsten Meldungen an alle
Multicast-Clients sendet. Im vorliegenden Beispiel erscheinen sie also oben (Ring
11-19) bzw. unten (Ring 1-9).
{{< fluid_img alt="Master" src="/images/NodeMCU_Neopixel/MASTER_script.jpg" >}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Loading…
Cancel
Save