ESP8266 mit OLED Display in Blinddeckel

Begonnen von tomster, 11 März 2016, 13:52:13

Vorheriges Thema - Nächstes Thema

tomster

Danke für Deine Rückmeldung.

Ich habe auch meine Bedenken hinsichtlich der Qualität/ Lebensdauer der Displays. Wie bereits geschrieben, habe ich bei meinen beiden Displays vertikale "Leerstreifen = Blind spots", die eine vernünftige Anzeige der Werte verhindern. Ich hab bei meinem Lieferanten zwar schon einen Garantie-Case aufgemacht, aber noch keine Rückmeldung. Zudem habe ich bei einem anderen Hersteller nach der reinen Displayeinheit inkl. FPC als Ersatzteil angefragt. Dieses hat genau die gleichen Maße, wie das Display von NewHaven und käme evtl. als Austausch in Frage.  Auch ich halte uns hier auf dem Laufenden.
Bringt ja Nichts, wenn man sich viel Arbeit macht und dann die Hardware nach kurzer Zeit ausfällt. Auch wenn ich noch keine wirklich Alternative zu unseren OLEDs im Bezug auf Displaygröße, Farbe, etc. gefunden habe...

wingfighter

#91
Hallo

So, am Sonntag Abend noch die aktuelle Version zum Testen.  ;)

Wie schon in meinem letzten Post geschrieben, habe ich jetzt das ESP8266_Basic-Template von Pf@nne (https://forum.fhem.de/index.php/topic,50238.0) eingebaut und um eine zweite Seite erweitert.
Wie in seinem Thread beschrieben, kann man den ESP per Handy über den intern aktiven Accesspoint konfigurieren, um dann im zweiten Schritt den Rest der Einstellungen über einen Browser zu erledigen. Die nötige IP wird ja während des ersten Schrittes angezeigt.

Auf der neu hinzugekommenen Seite zwei können die Bezeichnungen und Maßeinheiten für Screen 1-4 eingestellt werden. Außerdem werden die aktuellen Messwerte dort zur Kontrolle angezeigt.
Als Einheiten können im Moment "natürlich" nur °C und % angegeben werden, da ja zurzeit kein kompletter Zeichensatz implementiert ist.

Für die Funktion des aktuellen Sketches ist nunmehr auch das ESP8266_Basic-Template erforderlich. Allerdings nicht das Originale, sondern eine von mir erweiterte Version.
In der ZIP-Datei im Anhang befindet sich das aktuelle Web-Interface-basierende Sketch sowie das besagte Template. Beides findet sich ebenfalls auf GitHUB. Das Template muss in das Verzeichnis "...Users\<username>\Documents\Arduino\libraries\" kopiert werden. Da sollten auch die restlichen individuell installierten Libraries liegen.

In dem Template werden die MQTT-Publishs und -Subscribes automatisch zusammen gesetzt. U.a wird auch der interne Name des ESP-Moduls verwendet, der aber in der Web-Konfiguration angepasst werden kann.
Daraus ergeben sich für die Konfiguration in FHEM einige Änderungen.

Hier mal ein Beispiel:


define SB.TempHum MQTT_DEVICE
attr SB.TempHum IODev mqtt
attr SB.TempHum stateFormat state
attr SB.TempHum subscribeReading_Luftfeuchte ESP8266_12345678/Sensor/humidity/H1
attr SB.TempHum subscribeReading_Temperatur ESP8266_12345678/Sensor/temperature/T1

define TR.Temperatur.mqtt MQTT_BRIDGE TR.Temperatur.Luftfeuchte
attr TR.Temperatur.mqtt IODev mqtt
attr TR.Temperatur.mqtt publishReading_temperature ESP8266_12345678/Display/NHD_1.69/Screen_0
attr TR.Temperatur.mqtt publishReading_humidity ESP8266_12345678/Display/NHD_1.69/Screen_1



In meinem letzten Post hatte ich auch geschrieben, dass zumindest bei meinem Display das Festlegen eines Fensters und die Ausgabe nur in diesem Bereich nicht funktioniert. Die Programmierung der vier Register fürht dazu, dass die Anzeige eingefroren wird. Daher habe ich diese Funktion (FillArea) jetzt direkt im Sketch realisiert.
Vielleicht kann  ja Jemand mal in einem Test-Sketch ausprobieren, ob das ein grundsätzliches Problem ist oder ich nur einen Denkfehler hatte oder mein Display einen Schaden hat.

Und nun erst einmal viel Spaß beim Testen.

Viele Grüße
wingfighter

tomster

Bei mir mosert Arduino, dass es ArduinoJson.h nicht finden kann. Bevor ich 'n falsches File ziehe: brauchst Du eine bestimmte Version, oder tut's die von bblanchon?

wingfighter


tomster

#94
So, nun bin ich dazugekommen, die neue Firmware zu Flashen. Läuft einwandfrei.

Für andere Tester vielleicht noch kurz zur Erläuterung:

Ich musste ein paar Libraries nachinstallieren:
ArduinoJson-master
OneWire-master
Arduino-Temperature-Control-Library-master

Das Default-Passwort für die SSID des ESPs lautet ESP8266config

@wingfighter
Ich hab Mal ein bisschen nach Wettericons gesucht und mit der Robotofont gespielt. Dabei dachte ich, dass es vielleicht einfacher ist, wenn man für die Wettericons ebenfalls einen Fontsatz und keine Graphiken verwendet. Vielleicht kann man ja sogar einen Fontsatz implementieren, der dann dynamisch in der Größe angepasst werden kann, anstatt jede Ziffer/Buchstabe im HEX-Code angeben zu müssen...
Dieser Fontsatz hier gefällt mir eigentlich nicht schlecht (und hat mit dem "Tornadosymbol" auch gleich etwas für meine Windwarnung dabei):
https://github.com/kickstandapps/WeatherIcons

Die Frage wird nur sein, ob der ESP noch genug Speicher hat um entweder einen Fontsatz oder alle Icons im Sketch unterzubrigen, oder ob man nicht doch lieber dynamisch per MQTT Graphiken publisht. Dazu kann ich als Laie nicht viel sagen.

Die Robotofont passt bei meiner Anforderung (möglichst groß, aber nicht so breit) mit den Standardparametern nicht auf's Display. Ich benötige ja im schlechtesten Fall 5 Stellen + Einheit (z.B. -14.4°). Das geht sich auf meinem Testmockup in Photoshop am Besten bei einer Schriftgröße des Temperaturwerts von 65px (Roboto Light wegen Erkennbarkeit) - allerdings nur, wenn ich die Laufweite auf 50% verringere. Sprich man muss die einzelnen Ziffern näher zusammenrücken. Dafür habe ich die Luftfeuchte in eine Extrazeile gepackt. Vom Design wollte ich es lieber ohne viel Farbe machen. Man kann aber einzelne Bereiche sicher recht leicht (vielleicht sogar wert-abhängig) mit Farbe versehen, indem man halt z.B. das Tornadoicon einfach rot anzeigen lässt.

Zudem sollte vielleicht das Intervall des Wechsels der einzelnen Screens anpassbar sein. Ich fände 5 Sekunden weniger "hektisch"... ;-)

wingfighter

Hallo tomster

Ich habe mich mal mit der Speicherung im Dateisystem des ESP beschäftigt.
Dank Pf@nnes Template gibt es dafür auch schon die passenden Funktionen.
Ich denke, es wird das einfachste sein, wenn wir speicherintensive Daten in das Dateisystem auslagern und bei Bedarf von dort lesen.
Dann sind wir bein der Art der verwendeten Grafiken und auch der Schriftzeichen flexibel.
Die von Dir genannte Seite mit den Wettersymbolen und dem Roboto-ähnlichen Font enthält "leider" nur echte Fontdateien. Ich denke, die auszulesen ist noch einmal eine andere Baustelle.
Daher würde ich dafür plädieren, für jedes verwendete Zeichen und dann - je nach verfügbarem Speicherplatz - auch für verschiedene Fonts, die Hex-Codierung als Datei zu hinterlegen.
Und in derselben Weise können wir dann auch die BMP's - nur dafür habe ich im Moment eine Möglichkeit des byteweisen Lesens und damit Schreibens in den Display-Speicher gefunden (danke Rince) - in verschiedener grafischer Ausprägung hinterlegen.
Als Dateiname wäre dann der Wetter-Symbol-Name sinnvoll (z.B. claudy.bmp, partly_cloudy.bmp etc.). Und wenn dann per MQTT ein 'claudy' oder 'sunny' oder 'raining' etc. an den ESP gesendet wird, kann man daraus den BMP-Dateinamen ermitteln und aus dem Dateisystem des ESP laden und anzeigen.

Für die Screen-Wiederholrate werde ich auf der zweiten Config-Seite eine Spalte einfügen, in der man je Screen die Anzeigedauer auswählen kann. Dann kann jeder die Anzeige -"Hektik" individuell steuern. ;-)

Bezüglich Deiner Font-Idee könntest Du ja dennoch so vorgehen, wie Du es beschrieben hast.
Einfach die Zahlen von 0-9 und die nötigen Sonderzeichen - also "- . °C %" - nebeneinander in PS in einen Bildstreifen schreiben und die Größe und Laufweite so einstellen, dass -99.9 °C auf 160 Pixel Breite passt. Besser noch -00.0°C, weil Nullen in den meisten Fonts die breiteste Ausprägung haben.
Ich kann im Sketch einstellen wie breit die Buchstaben sind. Sie sollten aber einheitlich breit sein, damit ich alle Zeichen mit der selben Schleife in den Speicher schreiben kann.
Konvertieren kannst Du die einzelnen Zeichen mit dem folgenden Tool: http://en.radzio.dxp.pl/bitmap_converter/LCDAssistant.zip
Du würdest mir sehr helfen, wenn Du das Erzeugen der Hex-Arrays Deines Lieblingsfonts für mich übernehmen könntest.

Ich teste jetzt erst einmal ob die Idee mir der Speicherung der Wettersymbole, Auslesen und in den Displayspeicher schreiben umsetzbar ist.

Gruß
wingfighter

tomster

ZitatBezüglich Deiner Font-Idee könntest Du ja dennoch so vorgehen, wie Du es beschrieben hast.
Einfach die Zahlen von 0-9 und die nötigen Sonderzeichen - also "- . °C %" - nebeneinander in PS in einen Bildstreifen schreiben und die Größe und Laufweite so einstellen, dass -99.9 °C auf 160 Pixel Breite passt. Besser noch -00.0°C, weil Nullen in den meisten Fonts die breiteste Ausprägung haben.
Ich kann im Sketch einstellen wie breit die Buchstaben sind. Sie sollten aber einheitlich breit sein, damit ich alle Zeichen mit der selben Schleife in den Speicher schreiben kann.
Konvertieren kannst Du die einzelnen Zeichen mit dem folgenden Tool: http://en.radzio.dxp.pl/bitmap_converter/LCDAssistant.zip
Du würdest mir sehr helfen, wenn Du das Erzeugen der Hex-Arrays Deines Lieblingsfonts für mich übernehmen könntest.

Mach ich! Ich hab deshalb nach Font-Dateien gesucht, weil man dann eine vernünftige Basis hat, um die Schrift vor und zurück bis zur fertigen "Endgröße" in HEX umzuwandeln.
Das mit "Bildern" zu machen fände ich fast zu umständlich. Ich mach das mit dem hier.
Die einzelnen Buchstaben/ Ziffern mit fester Breite zu codieren ist aber blöde, weil dann z.B. bei einem Punkt eine ziemlich Platzverschwendung stattfindet...

wingfighter

#97
Mit dem Punkt hast Du recht.
Das ist auch jetzt schon das einzige Zeichen, welches ich gesondert behandle, damit der Abstand nicht zu groß wird.
Alternativ wäre es aber eine Möglichkeit, in den ersten beiden Bytes des Hex-Arrays die Dimension - also Anzahl x-Pixel, Anzahl y-Pixel - zu schreiben, dann kann man beim Übertragen die Schleifen entsprechend anpassen.
Schau mal, ob das Konverter-Tool das hergibt.

tomster

#98
Die jeweilige Breite direkt in's HEX-Array zu schreiben ist mir nicht gelungen. Aber "mein" Tool schreibt ein Array const FONT_CHAR_INFO , welches die jeweilige Breite der Chars angibt. Reicht das auch?


const uint_8 robotoLt_48ptBitmaps[] =
{
// @0 '-' (19 pixels wide)
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0xFF, 0xFF, 0xE0, // ###################
0xFF, 0xFF, 0xE0, // ###################
0xFF, 0xFF, 0xE0, // ###################
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   
0x00, 0x00, 0x00, //                   

// @141 '.' (5 pixels wide)
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0x00, //     
0xF8, // #####
0xF8, // #####
0xF8, // #####
0xF8, // #####
0xF8, // #####

// @188 '0' (28 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0x00, 0xFF, 0xE0, 0x00, //         ###########         
0x03, 0xFF, 0xF8, 0x00, //       ###############       
0x07, 0xFF, 0xFE, 0x00, //      ##################     
0x0F, 0x80, 0x3F, 0x00, //     #####         ######   
0x1F, 0x00, 0x0F, 0x00, //    #####            ####   
0x3E, 0x00, 0x07, 0x80, //   #####              ####   
0x3C, 0x00, 0x03, 0xC0, //   ####                #### 
0x78, 0x00, 0x03, 0xC0, //  ####                 #### 
0x78, 0x00, 0x01, 0xE0, //  ####                  ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x00, 0xE0, // ####                    ###
0xF0, 0x00, 0x00, 0xE0, // ####                    ###
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xE0, // ####                    ###
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0x78, 0x00, 0x01, 0xE0, //  ####                  ####
0x78, 0x00, 0x03, 0xC0, //  ####                 #### 
0x3C, 0x00, 0x03, 0xC0, //   ####                #### 
0x3E, 0x00, 0x07, 0x80, //   #####              ####   
0x1F, 0x00, 0x0F, 0x80, //    #####            #####   
0x0F, 0xC0, 0x3F, 0x00, //     ######        ######   
0x07, 0xFF, 0xFE, 0x00, //      ##################     
0x03, 0xFF, 0xF8, 0x00, //       ###############       
0x00, 0xFF, 0xE0, 0x00, //         ###########         

// @376 '1' (15 pixels wide)
0x00, 0x0E, //             ###
0x07, 0xFE, //      ##########
0xFF, 0xFE, // ###############
0xFF, 0xFE, // ###############
0xFE, 0x1E, // #######    ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####
0x00, 0x1E, //            ####

// @470 '2' (28 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0x00, 0xFF, 0xF0, 0x00, //         ############       
0x03, 0xFF, 0xFC, 0x00, //       ################     
0x07, 0xFF, 0xFE, 0x00, //      ##################     
0x0F, 0x80, 0x3F, 0x00, //     #####         ######   
0x1F, 0x00, 0x0F, 0x80, //    #####            #####   
0x3E, 0x00, 0x07, 0x80, //   #####              ####   
0x3C, 0x00, 0x03, 0xC0, //   ####                #### 
0x78, 0x00, 0x03, 0xC0, //  ####                 #### 
0x78, 0x00, 0x03, 0xC0, //  ####                 #### 
0x70, 0x00, 0x01, 0xC0, //  ###                   ### 
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0x00, 0x00, 0x01, 0xC0, //                        ### 
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x07, 0x80, //                      ####   
0x00, 0x00, 0x07, 0x80, //                      ####   
0x00, 0x00, 0x0F, 0x00, //                     ####   
0x00, 0x00, 0x0F, 0x00, //                     ####   
0x00, 0x00, 0x1E, 0x00, //                    ####     
0x00, 0x00, 0x3C, 0x00, //                   ####     
0x00, 0x00, 0x78, 0x00, //                  ####       
0x00, 0x00, 0x78, 0x00, //                  ####       
0x00, 0x00, 0xF0, 0x00, //                 ####       
0x00, 0x01, 0xE0, 0x00, //                ####         
0x00, 0x03, 0xC0, 0x00, //               ####         
0x00, 0x07, 0xC0, 0x00, //              #####         
0x00, 0x0F, 0x80, 0x00, //             #####           
0x00, 0x1F, 0x00, 0x00, //            #####           
0x00, 0x1E, 0x00, 0x00, //            ####             
0x00, 0x3C, 0x00, 0x00, //           ####             
0x00, 0x78, 0x00, 0x00, //          ####               
0x00, 0xF0, 0x00, 0x00, //         ####               
0x01, 0xF0, 0x00, 0x00, //        #####               
0x03, 0xE0, 0x00, 0x00, //       #####                 
0x03, 0xC0, 0x00, 0x00, //       ####                 
0x07, 0x80, 0x00, 0x00, //      ####                   
0x0F, 0x00, 0x00, 0x00, //     ####                   
0x1E, 0x00, 0x00, 0x00, //    ####                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x7C, 0x00, 0x00, 0x00, //  #####                     
0x7F, 0xFF, 0xFF, 0xF0, //  ###########################
0x7F, 0xFF, 0xFF, 0xF0, //  ###########################
0x7F, 0xFF, 0xFF, 0xF0, //  ###########################

// @658 '3' (28 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0x00, 0xFF, 0xF0, 0x00, //         ############       
0x03, 0xFF, 0xFC, 0x00, //       ################     
0x07, 0xFF, 0xFE, 0x00, //      ##################     
0x0F, 0xC0, 0x3F, 0x00, //     ######        ######   
0x1F, 0x00, 0x0F, 0x80, //    #####            #####   
0x3C, 0x00, 0x07, 0xC0, //   ####               ##### 
0x7C, 0x00, 0x03, 0xC0, //  #####                #### 
0x78, 0x00, 0x03, 0xC0, //  ####                 #### 
0x70, 0x00, 0x01, 0xE0, //  ###                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x07, 0xC0, //                      ##### 
0x00, 0x00, 0x07, 0x80, //                      ####   
0x00, 0x00, 0x1F, 0x00, //                    #####   
0x00, 0x00, 0xFE, 0x00, //                 #######     
0x00, 0x7F, 0xF8, 0x00, //          ############       
0x00, 0x7F, 0xF0, 0x00, //          ###########       
0x00, 0x7F, 0xFC, 0x00, //          #############     
0x00, 0x00, 0x3F, 0x00, //                   ######   
0x00, 0x00, 0x0F, 0x80, //                     #####   
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x00, 0xE0, //                         ###
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xE0, 0x00, 0x00, 0xF0, // ###                     ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xE0, // ####                    ###
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0x78, 0x00, 0x03, 0xE0, //  ####                 #####
0x7C, 0x00, 0x03, 0xC0, //  #####                #### 
0x3E, 0x00, 0x0F, 0x80, //   #####             #####   
0x1F, 0x80, 0x1F, 0x80, //    ######          ######   
0x0F, 0xFF, 0xFF, 0x00, //     ####################   
0x03, 0xFF, 0xFC, 0x00, //       ################     
0x00, 0xFF, 0xF0, 0x00, //         ############       

// @846 '4' (32 pixels wide)
0x00, 0x00, 0x00, 0x00, //                                 
0x00, 0x00, 0x0F, 0x80, //                     #####       
0x00, 0x00, 0x0F, 0x80, //                     #####       
0x00, 0x00, 0x1F, 0x80, //                    ######       
0x00, 0x00, 0x1F, 0x80, //                    ######       
0x00, 0x00, 0x3F, 0x80, //                   #######       
0x00, 0x00, 0x7F, 0x80, //                  ########       
0x00, 0x00, 0x77, 0x80, //                  ### ####       
0x00, 0x00, 0xF7, 0x80, //                 #### ####       
0x00, 0x01, 0xE7, 0x80, //                ####  ####       
0x00, 0x01, 0xE7, 0x80, //                ####  ####       
0x00, 0x03, 0xC7, 0x80, //               ####   ####       
0x00, 0x07, 0xC7, 0x80, //              #####   ####       
0x00, 0x07, 0x87, 0x80, //              ####    ####       
0x00, 0x0F, 0x07, 0x80, //             ####     ####       
0x00, 0x0F, 0x07, 0x80, //             ####     ####       
0x00, 0x1E, 0x07, 0x80, //            ####      ####       
0x00, 0x3C, 0x07, 0x80, //           ####       ####       
0x00, 0x3C, 0x07, 0x80, //           ####       ####       
0x00, 0x78, 0x07, 0x80, //          ####        ####       
0x00, 0xF0, 0x07, 0x80, //         ####         ####       
0x00, 0xF0, 0x07, 0x80, //         ####         ####       
0x01, 0xE0, 0x07, 0x80, //        ####          ####       
0x03, 0xC0, 0x07, 0x80, //       ####           ####       
0x03, 0xC0, 0x07, 0x80, //       ####           ####       
0x07, 0x80, 0x07, 0x80, //      ####            ####       
0x07, 0x00, 0x07, 0x80, //      ###             ####       
0x0F, 0x00, 0x07, 0x80, //     ####             ####       
0x1E, 0x00, 0x07, 0x80, //    ####              ####       
0x1E, 0x00, 0x07, 0x80, //    ####              ####       
0x3C, 0x00, 0x07, 0x80, //   ####               ####       
0x78, 0x00, 0x07, 0x80, //  ####                ####       
0x7F, 0xFF, 0xFF, 0xFF, //  ###############################
0xFF, 0xFF, 0xFF, 0xFF, // ################################
0xFF, 0xFF, 0xFF, 0xFF, // ################################
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       
0x00, 0x00, 0x07, 0x80, //                      ####       

// @1034 '5' (27 pixels wide)
0x00, 0x00, 0x00, 0x00, //                           
0x1F, 0xFF, 0xFF, 0x80, //    ###################### 
0x1F, 0xFF, 0xFF, 0x80, //    ###################### 
0x1F, 0xFF, 0xFF, 0x80, //    ###################### 
0x1E, 0x00, 0x00, 0x00, //    ####                   
0x1C, 0x00, 0x00, 0x00, //    ###                     
0x1C, 0x00, 0x00, 0x00, //    ###                     
0x1C, 0x00, 0x00, 0x00, //    ###                     
0x1C, 0x00, 0x00, 0x00, //    ###                     
0x1C, 0x00, 0x00, 0x00, //    ###                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x38, 0x00, 0x00, 0x00, //   ###                     
0x38, 0x00, 0x00, 0x00, //   ###                     
0x38, 0x0F, 0x00, 0x00, //   ###       ####           
0x38, 0xFF, 0xF0, 0x00, //   ###   ############       
0x39, 0xFF, 0xFC, 0x00, //   ###  ###############     
0x7F, 0xFF, 0xFE, 0x00, //  ######################   
0x7F, 0xC0, 0x7F, 0x00, //  #########       #######   
0x7E, 0x00, 0x1F, 0x80, //  ######            ###### 
0x7C, 0x00, 0x0F, 0x80, //  #####              ##### 
0x78, 0x00, 0x07, 0xC0, //  ####                #####
0x70, 0x00, 0x03, 0xC0, //  ###                  ####
0x10, 0x00, 0x03, 0xC0, //    #                  ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0x70, 0x00, 0x03, 0xC0, //  ###                  ####
0x78, 0x00, 0x03, 0xC0, //  ####                 ####
0x78, 0x00, 0x07, 0xC0, //  ####                #####
0x3C, 0x00, 0x07, 0x80, //   ####               #### 
0x3E, 0x00, 0x0F, 0x00, //   #####             ####   
0x1F, 0x80, 0x3F, 0x00, //    ######         ######   
0x0F, 0xFF, 0xFE, 0x00, //     ###################   
0x03, 0xFF, 0xF8, 0x00, //       ###############     
0x00, 0xFF, 0xE0, 0x00, //         ###########       

// @1222 '6' (28 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0x00, 0x7F, 0xF8, 0x00, //          ############       
0x01, 0xFF, 0xFF, 0x00, //        #################   
0x03, 0xFF, 0xFF, 0x00, //       ##################   
0x07, 0xE0, 0x0E, 0x00, //      ######         ###     
0x0F, 0x80, 0x00, 0x00, //     #####                   
0x1F, 0x00, 0x00, 0x00, //    #####                   
0x3E, 0x00, 0x00, 0x00, //   #####                     
0x3C, 0x00, 0x00, 0x00, //   ####                     
0x78, 0x00, 0x00, 0x00, //  ####                       
0x78, 0x00, 0x00, 0x00, //  ####                       
0x70, 0x00, 0x00, 0x00, //  ###                       
0xF0, 0x00, 0x00, 0x00, // ####                       
0xF0, 0x00, 0x00, 0x00, // ####                       
0xF0, 0x00, 0x00, 0x00, // ####                       
0xF0, 0x00, 0x00, 0x00, // ####                       
0xF0, 0x00, 0x00, 0x00, // ####                       
0xF0, 0x00, 0x00, 0x00, // ####                       
0xF0, 0x1F, 0xE0, 0x00, // ####       ########         
0xF0, 0xFF, 0xF8, 0x00, // ####    #############       
0xF1, 0xFF, 0xFE, 0x00, // ####   ################     
0xF3, 0xE0, 0x7F, 0x00, // ####  #####      #######   
0xF7, 0x00, 0x0F, 0x80, // #### ###            #####   
0xFE, 0x00, 0x07, 0xC0, // #######              ##### 
0xFC, 0x00, 0x03, 0xC0, // ######                #### 
0xF8, 0x00, 0x03, 0xE0, // #####                 #####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x01, 0xE0, // ####                   ####
0xF0, 0x00, 0x00, 0xE0, // ####                    ###
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0x70, 0x00, 0x00, 0xE0, //  ###                    ###
0x78, 0x00, 0x01, 0xE0, //  ####                  ####
0x78, 0x00, 0x01, 0xE0, //  ####                  ####
0x3C, 0x00, 0x03, 0xC0, //   ####                #### 
0x3C, 0x00, 0x03, 0xC0, //   ####                #### 
0x1E, 0x00, 0x07, 0x80, //    ####              ####   
0x0F, 0x00, 0x0F, 0x80, //     ####            #####   
0x0F, 0xC0, 0x3F, 0x00, //     ######        ######   
0x03, 0xFF, 0xFE, 0x00, //       #################     
0x01, 0xFF, 0xF8, 0x00, //        ##############       
0x00, 0x7F, 0xE0, 0x00, //          ##########         

// @1410 '7' (29 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0xFF, 0xFF, 0xFF, 0xF8, // #############################
0xFF, 0xFF, 0xFF, 0xF8, // #############################
0xFF, 0xFF, 0xFF, 0xF8, // #############################
0x00, 0x00, 0x00, 0x78, //                          ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x01, 0xE0, //                        #### 
0x00, 0x00, 0x03, 0xC0, //                       ####   
0x00, 0x00, 0x07, 0x80, //                      ####   
0x00, 0x00, 0x07, 0x80, //                      ####   
0x00, 0x00, 0x0F, 0x00, //                     ####     
0x00, 0x00, 0x1E, 0x00, //                    ####     
0x00, 0x00, 0x1E, 0x00, //                    ####     
0x00, 0x00, 0x3C, 0x00, //                   ####       
0x00, 0x00, 0x38, 0x00, //                   ###       
0x00, 0x00, 0x78, 0x00, //                  ####       
0x00, 0x00, 0x70, 0x00, //                  ###         
0x00, 0x00, 0xF0, 0x00, //                 ####         
0x00, 0x00, 0xE0, 0x00, //                 ###         
0x00, 0x01, 0xE0, 0x00, //                ####         
0x00, 0x01, 0xC0, 0x00, //                ###           
0x00, 0x03, 0xC0, 0x00, //               ####           
0x00, 0x03, 0x80, 0x00, //               ###           
0x00, 0x07, 0x80, 0x00, //              ####           
0x00, 0x07, 0x80, 0x00, //              ####           
0x00, 0x07, 0x00, 0x00, //              ###             
0x00, 0x0F, 0x00, 0x00, //             ####             
0x00, 0x0F, 0x00, 0x00, //             ####             
0x00, 0x0F, 0x00, 0x00, //             ####             
0x00, 0x0E, 0x00, 0x00, //             ###             
0x00, 0x1E, 0x00, 0x00, //            ####             
0x00, 0x1E, 0x00, 0x00, //            ####             
0x00, 0x1E, 0x00, 0x00, //            ####             
0x00, 0x1E, 0x00, 0x00, //            ####             
0x00, 0x1C, 0x00, 0x00, //            ###               
0x00, 0x1C, 0x00, 0x00, //            ###               
0x00, 0x1C, 0x00, 0x00, //            ###               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               
0x00, 0x3C, 0x00, 0x00, //           ####               

// @1598 '8' (29 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0x00, 0x7F, 0xF8, 0x00, //          ############       
0x01, 0xFF, 0xFE, 0x00, //        ################     
0x07, 0xFF, 0xFF, 0x00, //      ###################     
0x0F, 0xE0, 0x1F, 0x80, //     #######        ######   
0x1F, 0x80, 0x07, 0xC0, //    ######            #####   
0x1E, 0x00, 0x03, 0xE0, //    ####               ##### 
0x3E, 0x00, 0x01, 0xE0, //   #####                #### 
0x3C, 0x00, 0x01, 0xF0, //   ####                 #####
0x3C, 0x00, 0x00, 0xF0, //   ####                  ####
0x38, 0x00, 0x00, 0xF0, //   ###                   ####
0x78, 0x00, 0x00, 0xF0, //  ####                   ####
0x78, 0x00, 0x00, 0xF0, //  ####                   ####
0x78, 0x00, 0x00, 0xF0, //  ####                   ####
0x38, 0x00, 0x00, 0xF0, //   ###                   ####
0x3C, 0x00, 0x00, 0xF0, //   ####                  ####
0x3C, 0x00, 0x00, 0xE0, //   ####                  ### 
0x1E, 0x00, 0x01, 0xE0, //    ####                #### 
0x1E, 0x00, 0x03, 0xC0, //    ####               ####   
0x0F, 0x80, 0x07, 0xC0, //     #####            #####   
0x07, 0xC0, 0x0F, 0x80, //      #####          #####   
0x03, 0xFC, 0xFF, 0x00, //       ########  ########     
0x00, 0xFF, 0xFC, 0x00, //         ##############       
0x00, 0xFF, 0xF8, 0x00, //         #############       
0x03, 0xFF, 0xFE, 0x00, //       #################     
0x07, 0xE0, 0x1F, 0x80, //      ######        ######   
0x0F, 0x00, 0x07, 0xC0, //     ####             #####   
0x1E, 0x00, 0x01, 0xE0, //    ####                #### 
0x3C, 0x00, 0x00, 0xF0, //   ####                  ####
0x78, 0x00, 0x00, 0xF0, //  ####                   ####
0x78, 0x00, 0x00, 0x78, //  ####                    ####
0x70, 0x00, 0x00, 0x78, //  ###                     ####
0xF0, 0x00, 0x00, 0x78, // ####                     ####
0xF0, 0x00, 0x00, 0x38, // ####                      ###
0xF0, 0x00, 0x00, 0x38, // ####                      ###
0xF0, 0x00, 0x00, 0x38, // ####                      ###
0xF0, 0x00, 0x00, 0x78, // ####                     ####
0xF0, 0x00, 0x00, 0x78, // ####                     ####
0x78, 0x00, 0x00, 0x78, //  ####                    ####
0x78, 0x00, 0x00, 0xF8, //  ####                   #####
0x7C, 0x00, 0x00, 0xF0, //  #####                  ####
0x3E, 0x00, 0x01, 0xF0, //   #####                #####
0x1F, 0x00, 0x07, 0xE0, //    #####             ###### 
0x0F, 0xC0, 0x0F, 0xC0, //     ######          ######   
0x07, 0xFF, 0xFF, 0x80, //      ####################   
0x03, 0xFF, 0xFE, 0x00, //       #################     
0x00, 0x7F, 0xF8, 0x00, //          ############       

// @1786 '9' (28 pixels wide)
0x00, 0x00, 0x00, 0x00, //                             
0x00, 0xFF, 0xE0, 0x00, //         ###########         
0x01, 0xFF, 0xF8, 0x00, //        ##############       
0x07, 0xFF, 0xFE, 0x00, //      ##################     
0x0F, 0xC0, 0x3F, 0x00, //     ######        ######   
0x1F, 0x00, 0x0F, 0x80, //    #####            #####   
0x1E, 0x00, 0x07, 0x80, //    ####              ####   
0x3C, 0x00, 0x03, 0xC0, //   ####                #### 
0x7C, 0x00, 0x03, 0xC0, //  #####                #### 
0x78, 0x00, 0x01, 0xE0, //  ####                  ####
0x78, 0x00, 0x01, 0xE0, //  ####                  ####
0xF0, 0x00, 0x00, 0xE0, // ####                    ###
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0xF0, 0x00, 0x00, 0xF0, // ####                    ####
0x78, 0x00, 0x00, 0xF0, //  ####                   ####
0x78, 0x00, 0x01, 0xF0, //  ####                  #####
0x7C, 0x00, 0x01, 0xF0, //  #####                 #####
0x3E, 0x00, 0x03, 0xF0, //   #####               ######
0x1F, 0x00, 0x0F, 0xF0, //    #####            ########
0x1F, 0x80, 0x1E, 0xF0, //    ######          #### ####
0x0F, 0xF1, 0xFC, 0xF0, //     ########   #######  ####
0x03, 0xFF, 0xF8, 0xF0, //       ###############   ####
0x01, 0xFF, 0xE0, 0xF0, //        ############     ####
0x00, 0x3F, 0x80, 0xF0, //           #######       ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xF0, //                         ####
0x00, 0x00, 0x00, 0xE0, //                         ###
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x01, 0xE0, //                        ####
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x03, 0xC0, //                       #### 
0x00, 0x00, 0x07, 0x80, //                      ####   
0x08, 0x00, 0x1F, 0x80, //     #              ######   
0x0E, 0x00, 0x3F, 0x00, //     ###           ######   
0x0F, 0xFF, 0xFE, 0x00, //     ###################     
0x0F, 0xFF, 0xF8, 0x00, //     #################       
0x01, 0xFF, 0xE0, 0x00, //        ############         

// @1974 '°' (16 pixels wide)
0x00, 0x00, //                 
0x0F, 0xF0, //     ########   
0x1F, 0xF8, //    ##########   
0x3F, 0xFC, //   ############ 
0x78, 0x1E, //  ####      ####
0x70, 0x0E, //  ###        ###
0x70, 0x06, //  ###         ##
0x60, 0x07, //  ##          ###
0xE0, 0x07, // ###          ###
0x60, 0x07, //  ##          ###
0x70, 0x0E, //  ###        ###
0x70, 0x0E, //  ###        ###
0x3C, 0x3E, //   ####    #####
0x3F, 0xFC, //   ############ 
0x1F, 0xF8, //    ##########   
0x07, 0xE0, //      ######     
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
0x00, 0x00, //                 
};

const FONT_CHAR_INFO robotoLt_48ptDescriptorsBlock0[] =
{
{3, 0}, // -
{1, 141}, // .
{0, 0}, // /
{4, 188}, // 0
{2, 376}, // 1
{4, 470}, // 2
{4, 658}, // 3
{4, 846}, // 4
{4, 1034}, // 5
{4, 1222}, // 6
{4, 1410}, // 7
{4, 1598}, // 8
{4, 1786}, // 9
};

const FONT_CHAR_INFO robotoLt_48ptDescriptorsBlock1[] =
{
{2, 1974}, // °
};

const FONT_CHAR_INFO_LOOKUP robotoLt_48ptBlockLookup[] =
{
{'-', '9', &robotoLt_48ptDescriptorsBlock0},
{'°', '°', &robotoLt_48ptDescriptorsBlock1},
};

const FONT_INFO robotoLt_48ptFontInfo =
{
'-', //  Start character
'°', //  End character
2, //  Width, in pixels, of space character
robotoLt_48ptBlockLookup, //  Character block lookup
NULL, //  Character descriptor array
robotoLt_48ptBitmaps, //  Character bitmap array
};

wingfighter

Ja, ich denke, eines dieser zusätzlichen Arrays können wir dafür nutzen.

wingfighter

#100
Immer wieder sonntags.... ;-)

In der letzten Woche gab es eine Menge Neuerungen und Änderungen an dem NHD-1.69160128-Sketch.
Die möchte ich allen Interessierten natürlich gern zur Verfügung stellen. Natürlich sind noch diverse Dinge zu erledigen und sicher tauchen auch noch Fehler auf. Dafür sind wir ja in der Version noch weiter unter 1.0. ;-)

Folgende Änderungen und neue Funktionen sind eingeflossen:


  • Der RobotLight-Font, wie ihn sich tomster gewünscht hat, ist jetzt der Standard für die Darstellung der Messwerte. Dazu nutze ich jetzt das von tomster vorgeschlagene Tool http://www.eran.io/the-dot-factory-an-lcd-font-and-image-generator/. Dabei kommen zwar völlig andere Arrays raus. Aber wenn wir jetzt noch etwas testen wollen, kann das Sketch damit umgehen, weil ich mir die Metrik aus dem Info-Array hole, welches zusammen mit dem Zeichensatz erstellt wird. Einzig dem C musste ich ein Pixel weg nehmen, sonst hätte es in der Breite nicht auf das Display gepasst. Den restlichen Text werde ich auch mal mit robootLight in 10 oder 11 testen,
  • Es gibt jetzt Wettersymbole, die im Moment beispielhaft in der Anzeigerotation mit eingebaut sind. Zur Zeit verwende ich freie Symbole von http://www.iconarchive.com/tag/weather. Die sind für tomsters Geschmack sicher viel zu bunt. ;-) Aber auch da ist das Sketch so ausgelegt, das jederzeit andere Symbole verwendet werden können. Es gibt im Deklarationsbereich des Sketches  ein Array (weatherIconFileName) in dem zurzeit max. 30 Dateinamen hinterlegt werden können.
    Mehr zu den Icons weiter unten
  • Im Zusammenhang mit der Frage, wie die Dateien auf den ESP kommen, habe ich vor gehabt, dass Web-Portal zu erweitern. Dazu hätte sich das Demo-Sketch FSBrowser angeboten, dass u.a. genau dafür die Funktionen liefert. Allerdings - so habe ich nach Rücksprache mit Pf@nne erfahren - ist es nicht so einfach, solche Klassen orientierten Funktionen in andere Klassen (WebServer) sauber einzubinden. Die Rede ist von Callback- und Lamdafunktionen in C++. An der Stelle wird es dann sehr speziell, so dass ich einen anderen Weg gesucht habe. Im Moment ist die FSBrowser-Klasse im Sketch eingebunden. Das bedeutet aber, dass eine zweite WebServer-Instanz aktiviert wird. Da wir für die Konfiguration schon den Port 80 nutzen, habe ich diese auf den Port 81 gelegt. Aber das scheint den ESP zu überfordern. Mehr dazu gleich...
  • Offen ist noch geblieben, wie im letzten Post angekündigt, den einzelnen Screens eine eigene Anzeigedauer konfigurierbar zur Verfügung zu stellen. Aber ich denke, das werde ich im Laufe der Woche nachholen können.
  • Auch die Ausgestaltung der Screens mit den Wettersymbolen durch Beschreibungen wie "heute", "Morgen", "Übermorgen" etc. folgt in der nächsten Version


Damit Ihr das auch alles testen könnt, sind ein paar Voraussetzungen notwendig.
Das Sketch benötigt natürlich irgendwo die Symbole, die je nach Vorhersage irgendwo gespeichert und geladen werden müssen.
Dazu nutze ich den internen Speicher des ESP.
Es gibt nun min. zwei Verfahren, um die Dateien, die ich im Anhang mit in die ZIP-Dateien gepackt habe, auf den ESP zu übertragen.
Eine habe ich oben schon erwähnt. Unter http://<IP-Adresse-ESP>:81/edit kommt Ihr in den FSBrowser. Dort können die BMP-Dateien einzeln hochgeladen werden. Bei mir hatte der ESP damit aber diverse Performance-Probleme. Je nach Eurer Rückmeldung werde ich diese Variante dann auch wieder entfernen.
Die Implementierung der Funktionen aus der FSBrowser-Klasse in den vorhandenen WebServer in das Template ESP8266_Basic, habe ich auskommentiert. Wenn sich jemand mit Callback- und Lamda-Funktionen auskennt, wäre ich ihm natürlich dankbar, wenn wir diese Variante zum Laufen bekommen. Das wäre allemal eleganter und vielleicht auch performanter.

Der zweite Weg ist die Übertragung der BMP's aus der Arduino-IDE heraus. Dazu ist folgendes Addon erforderlich: https://github.com/esp8266/arduino-esp8266fs-plugin
Dieses Tool überträgt alle Dateien, die in einem Verzeichnis ../data unterhalb des Sketch-Verzeichnisses liegen in das Filesystem des ESP. Dazu empfehle ich, das Sketch einmal 
laufen zu lassen, weil dann das Filesystem auf dem ESP angelegt wird. (Wer die vorhergehenden Versionen mit Web-Interface schon genutzt hat, bei dem ist das schon erledigt.)
Diese Java-Tool hat aus meiner Sich für unsere Zwecke einen entscheidenden Nachteil. Es überträgt neben dem Ordner ../data auch das Binary des aktuellen Sketches. Das dauert recht lange und ist für unsere Zwecke nicht notwendig.
Man kann das Tool anpassen, da die Quellen offen liegen. Aber die Baustelle wollte ich nicht auch noch aufmachen.

Wenn die Dateien an den ESP bertragen worden sind, wird als quasi Platzhalter das Sonnensysmbol nach der Anzeige der Temperaturen und Luftfeuchte angezeigt.

Nun wäre das Ganze natürlich ohne Anbindung an einen Wetterdienst auch ziemlich zwecklos. Deshalb habe ich das MQTT-Protokoll bemüht und im Pf@nne-Template eine Erweiterung eingebaut, damit die Vorhersagen für die nächsten 5 Tage entgegen genommen und angezeigt werden können.

Dazu sind in FHEM natürlich ein paar Definitionen nötig. Das Weather-Modul nutzt die Yahoo-API um an das aktuelle Wetter zu gelangen. Also muss diese Modul als erstes konfiguriert werden.

# Wetter von Yahoo (123456 = DeinOrt, 600=alle 600 Sekunden (10min) Yahoo abfragen, de=Sprache Deutsch)
define Wetter Weather 123456 600 de
attr Wetter event-on-update-reading temperature,humidity,pressure,wind_speed,wind_chill,wind_direction,fc1_code,fc2_code,fc3_code,fc4_code,fc5_code,fc6_code


Die ID für Euern Ort könnt Ihr hier ermitteln: http://woeid.rosselliot.co.nz/

Damit bei Veränderungen die notwendigen Readings aktualisiert werden, muss fc[1..n]_code hier angegeben werden. In diesen Readings steht der zweistellige Wettercode, den ich im Sketch auswerte. Die Definition ist zu finden unter: https://developer.yahoo.com/weather/documentation.html#codes. Die Tabelle habe ich aber auch im Sketch hinterlegt. Die Beziehung zwischen Code und Dateiname wird in einem switch...case in der Funktion "void selectWeatherIcon(int day)" hergestellt. Mangels ausreichend unterschiedlicher Icons werden hier einige Codes auf ein Symbol gemappt.

Im zweiten Schritt muss dann noch die Definition für die MQTT-Publishs eingetragen werden.
Das sieht dann z.B. wie folgt aus:

define SB.Wetter.mqtt MQTT_BRIDGE Wetter
attr SB.Wetter.mqtt IODev mqtt
attr SB.Wetter.mqtt publishReading_fc1_code ESP8266_12345678/Weather/Forecast/Day_0
attr SB.Wetter.mqtt publishReading_fc2_code ESP8266_12345678/Weather/Forecast/Day_1
attr SB.Wetter.mqtt publishReading_fc3_code ESP8266_12345678/Weather/Forecast/Day_2
attr SB.Wetter.mqtt publishReading_fc4_code ESP8266_12345678/Weather/Forecast/Day_3
attr SB.Wetter.mqtt publishReading_fc5_code ESP8266_12345678/Weather/Forecast/Day_4
attr SB.Wetter.mqtt publishReading_fc6_code ESP8266_12345678/Weather/Forecast/Day_5
attr SB.Wetter.mqtt stateFormat transmission-state


Die Häufigkeit der Aktualisierung ist natürlich relativ gering. Mann kann aber in dem Weather-Objekt per Hand (FHEM-GUI) eine Update des Wetters anstoßen.
Im Moment  wird auf dem Display aber nur Day_0 angezeigt. Den Rest implementiere ich. Eventuell mache ich es auch auf der Konfigurations-Seite [de]aktivierbar .

Im Anhang findet Ihr die Version V.0.30 des Sketches und die BMP's in dem passenden Unterverzeichnis für die Anzeige der Wettersymbole.

Noch ein Hinweis für die Schreibweise der Temperatur: Das °-Zeichen stammt aus dem erweiterten ASCII-Zeichensatz. Es lässt sich nach meiner Erfahrung nicht sauber verarbeiten. Deshalb verwende ich in den Konfigurationen statt dessen immer den '*'. Der Stern wird beim Anzeigen gegen die Darstellung  des ° ausgetauscht. Diese Lösung halte ich momentan für einen gangbaren Ansatz. Ansonsten muss ich tiefer in die Codierung des °-Zeichens einsteigen.

Nun erst einmal viel Spaß und Erfolg beim Testen.
Freue mich natürlich über Feedback.

Viele Grüße
wingfighter


tomster

#101
Servus wingfighter!

Hut ab! Schaut nach umfangreichen Arbeiten aus... Vielen Dank dafür!

Ich hab mir grad Mal den Sketch heruntergeladen. Neben dem Gefühl, dass die Einträge für den von Dir genutzten DHT22 wohl umfangreicher geworden sind (zumindest musste ich mehr auskommentieren, um die Fehlermeldungen beim Kompilieren zu minimieren), hänge ich wohl noch an (mindestens) einer Stelle.
Du schreibst:
Zitat
Die Implementierung der Funktionen aus der FSBrowser-Klasse in den vorhandenen WebServer in das Template ESP8266_Basic, habe ich auskommentiert.
Genau dazu bekomme ich aber noch eine Fehlermeldung, Highlight im Arduino IDE = Zeile 1921:
exit status 1
'class ESP8266_Basic' has no member named 'MyWeatherIcon'


Zudem noch der Anstoss zu einer Diskussion hinsichtlich der Wetter-Icons:
Ich habe auf meinem FHEM Yahoo wieder rausgeschmissen, weil die Server gelegentlich nicht zu erreichen sind und für meinen Standort am Berg keine vernünftigen Werte zur Verfügung stehen. Zudem nutzt wohl jeder ein anderes Modul und es wäre schade, wenn "unser" Display nur Yahoo anzeigen könnte. Wir sollten uns daher einen "Modus Vivendi" einfallen lassen, der eine flexible Nutzung der Wetterfunktion bietet, ohne viel Modifikationen am Sketch selbst tätigen zu müssen. Dummerweise geben aber die jeweiligen Module (respektive die dahinterliegenden Webseiten) unterschiedliche "Werte" zurück. So bekommt man Mal z.B. "partly cloudy" und manchmal eben auch "partlycloudy" ausgegeben.
Um den Änderungsaufwand am Sketch zumindest in Verbindung mit den user-gewünschten Iconsets gering zu halten, würde ich eine durchgängige Linie bei der Namenskonvention der Icons fahren. Evtl. könnten man dann eine Konfigurationsmaske wie bei den Einheiten der Sensorwerte machen (siehe angehängtes Bild).
Klar, könnte man auch in FHEM direkt machen, aber ich dachte halt...

Eine Möglihckeit auf dem ESP ein Samba-Share einzubinden und von dort die Icons zu holen gibt es nicht, oder?

Ich komm diese Woche leider nur sporadisch zum Weitertesten, aber wenn ich noch irgendwas übernehmen soll, lass es mich (im rahmen meiner begrenzten Fähigkeiten) wissen.


wingfighter

Hallo tomster

OK, die Fehlermeldung deutet darauf hin, dass die Erweiterungen in dem ESP8266_Basic-Template nicht greifen. Und da fallen mir auch gleich meine Sünden ein. Ich habe die aktuelle Version des Templates schlicht vergessen mit in die ZIP-Datei zu packen. Sorry.
Das hole ich nachher nach. So gegen 16:30 bin ich wieder an meinem Rechner und hänge die Dateien an meinen Post von gestern Abend an. ;-(

Über Yahoo-Wetter habe ich in der Tat auch schon eher schlechte Dinge, was die Vorhersage-Genauigkeit angeht, gehört. Daher wäre eine Alternative auf jeden Fall eine gute Idee.
Mir war auch schon aufgefallen, dass für die Benennung der Wettersituationen die verschiedensten Begriffe verwendet werden. Daher war ich auch froh, das in den von mir im Moment verwendeten Feldern numerische Codes übertragen werden.
Eventuell verwenden diese Codes auch andere Wetterdienste mit der selben Bedeutung. Dan bräuchte wir nichts zu ändern.
Hast Du einen Vorschlag, welcher alternative Dienst im FHEM einbindbar ist? Ich kenne nur das erwähnte Modul.

Bezüglich des Dateiuploads gibt es noch eine Klasse, die sich HTTPUploader nennt. Ich werde mal prüfen, ob wir die verwenden können. Ich glaube, Pf@nne hat die in seinem Template schon implementiert um das OTA-Update darüber zu realisieren.

Viele Grüße
wingfighter



tomster

Ich hab schon diverse Wetter-Module ausprobiert: Yahoo, JSON-Readings und Wunderground, Proplanta, etc.
So richtig passt zwar bei mir keines, aber genau darum möchte ich ja "unser" Display so flexibel wie möglich gestalten.
Und "durchgängige" Codes sind mir bis jetzt sowieso noch nicht untergekommen...

U. A. auch daher der Ansatz mit dem Mapping auf dem ESP. Man kann damit für egal welches Device, bzw. Reading angezeigt werden soll, das entsprechende Icon hinterlegen.
Das auch vor dem Hintergrund, dass es vielleicht auch Anwendungsfälle gibt, bei denen gar kein Wettericon, sondern vielleicht ein Schlüssel, etc. in Abhängigkeit eines beliebigen Sensorreadings angezeigt werden soll. Man müsste dann natürlich auch komma-/ semikolonspearierte Arrays zulassen, z.B.
partlycloudy.bmp -> partly cloudy;partlycloudy;partlycloudynight oder eben leicht bewölkt oder so.
Wenn jemand ein Reading auswerten will, dass z.B. ein "12" ausgibt, dann würde das so ebenfalls gehen. 

Im Bezug auf den HTTP-Upload stellt sich mir immer noch die Frage, wieviel Speicher denn im ESP noch zur Verfügung steht. Nicht, dass das "Image platzt"...
Von daher wäre vielleicht ein Samba-Share (z.B. auf dem FHEM-Server) oder ein MQTT-Publish eines ganzen Bildes auch ein Ansatz, den man ernsthaft diskutieren sollte. Dafür hängt mein Ar*** aber code-seitig ein bisschen zu weit unten ;-) Ich hab keine Ahnung, was mit Pf@nneOS so alles geht...


wingfighter

OK. Ist natürlich eine Frage, an welche Stelle in dem Wetterinformationsprozess die Schnittstelle für die Auswertung gesetzt wird.
Je früher in dem Prozess solche sehr unterschiedlichen Informationen, die dasselbe meinen standardisiert werden, um so mehr weitere Teilprozesse kann ich mit der eindeutigen Information versorgen.
Daher ist es nicht der allerbeste Absatz, das Abfangen unterschiedlichster Ausdrücke für dasselbe Wetter erst im ESP zu realisieren.
Solche Konstrukte mit Semikolon sind natürlich auch nicht ganz trivial auszuwerten. Aber zum Glück gibt es auch eine Regex-Libraray für den Arduino. Damit könnte es funktionieren.

Wie ich geschrieben hatte, überträgt das Upload-Modul der IDE ja auch das bin-File. Und das hat im Moment etwas über 3 MB. Also zumindest in dem 12E-Modul kann von Speicherknappheit  noch nicht  die Rede sein. ;-)

Und wie versprochen, habe ich jetzt die aktualisierte Version von Pf@nnes ESP8266_Basic an meinen Post von gestern Abend angehängt. Dafür werde ich mir mal eine Versionierung einfallen lassen müssen. Im Moment steht immer noch V 0.200 unter den WebTabellen.