WLAN Lufttemperatur und -feuchte Logger mit grafischer Darstellung für ESP8266

Im folgenden Projekt habe ich einen Sensor für Luftfeuchtigkeit und Temperatur mit einem ESP8266 zusammengebaut. Herausgekommen ist ein WLAN-basierter Temperatur und Feuchtesensor, der ein Logfunktion für 24 Stunden mitbringt und eine grafische Darstellung realisiert. Für die aktuelle Zeit ist eine Abfrage des NIST Zeitservers per NTP integriert. Es werden keine Cloud-Dienste verwendet. Alle Daten bleiben lokal.
TH_log_Screenshot_Main

Das Ziel des Projekts war weiterhin, eine grafische Darstellung zu realisieren ohne einen cloudbasierten Dienst wie thingspeak o.ä. zu nutzen. Die Daten bleiben komplett im lokalen Netz. Es muss auch nicht jeder Nutzer einen eignen Accounts o.ä. anlegen. Für die grafische Darstellung werden die Google Chart APIs verwendet. Damit lassen sich sehr effizient ansprechende Grafiken und Graphen erzeugen – obwohl man eine vergleichsweise kurze html Seite verwendet. Dieses Vorgehen habe ich bisher noch nicht für den ESP8266 gesehen – deshalb der explizite Hinweis darauf.
TH_Log_Screenshot_Chart

Selbst Nachbauen:
Ihr braucht nur einen ESP8266 und einen Temperatur und Luftfeuchtesensor AM2301 (auch als DHT21 bekannt). Beides gibt es für jeweils unter 3€ bei ebay aus China. Die Schaltung ist so trivial, dass ich sie erst gar nicht aufmale. Der GPIO2 des ESP8266 wird mit dem gelben Datenkabel des AM2301 verbunden. Rot geht an 3,3V, schwarz an Masse.
AM2301_Front AM2301_Back
Für die Programmierung des ESP8266 und die entsprechende Erweiterung der Arduino Entwicklungsumgebung für den ESP findet Ihr hier Hinweise (klick).

Den Sourcecode für den Temperatur und Feuchter Logger habe ich hier hinterlegt; inkl. verbesserter NTP Abfrage (11/2015): ESP_TH_Logger_V2
(erste Version hier, falls sie jemand sucht: ESP_TH_Logger)

In der ESP_TH_Logger.ino müsst Ihr noch den Namen Eures WIFIs und das Passwort eintragen. Das war es auch schon. Danach solltet Ihr nach ca. 20-30 Sekunden auf per Browser auf den ESP zugreifen können. Nach ca. 1. Minute sollte auch die erste Messung vorliegen. Einfach per Browser auf http://IP-DIE-DER-ESP-IM-NETZ-HAT (also z.B. http://192.168.178.41) zugreifen.

In der ESP_TH_Logger.ino kann man auch noch den Zeitraum einstellen, der geloggt werden soll. Der Code ist auf 24h eingestellt. Das RAM des ESP8266 erlaubt uns ca. 1800 Logeinträge zu halten. Es wird also alle ca. 50 Sekunden eine Messung durchgeführt und gespeichert. Wer den Zeitraum ändern möchte, muss den #define MEAS_SPAN_H suchen. Der Speicher wird rolierend adressiert, so dass immer die letzten 24h (oder was auch immer definiert ist) vorliegen.

Von der Hautpseite kommt man per Link auf die Unterseiten mit einer grafischen Darstellung des Temperatur- und Feuchteverklaufs (Bilder s.o.). Weiterhin ist eine tabellarischen Darstellung verfügbar.
TH_log_Screenshot_Table
Diese Unterseiten haben eine längere Ladezeit von ca. 10 Sekunden. Das liegt daran, dass bis zu 100kB übertragen werden müssen und der ESP8266 mit 10-20kB pro Sekunde nicht der schnellste Renner ist.

Ihr bekommt Fehlermeldungen beim Übersetzen oder die Zeit wird über NTP nicht erfasst? – Macht gegebenenfalls ein Update Eurer ESP/Arduino Erweiterung.

Ergänzung (09.06.2015):
Aufgrund eines Hinweises von Nick (siehe Kommentare) konnten wir Meßfehler nachweisen, wenn DHT11 oder DH21 (vermutlich auch DHT21) zu nahe am ESP8266 liegen. Vermutlich koppeln HF Felder des ESP8266 in den analogen Meßteil des DHT ein. Bei einem DHT21 konnte ich eine systematische Abweichtung von +1,5 Grad Celsius und -3% rel. Feuchte nachweisen. Eine Distanz von ca. 10cm scheint auszureichen, um das Problem zu vermeiden. Die Messwerte meines DHT21 stimmen dann mit den Werten meiner Wetterstation (WH3080) überein.

Der Code:
Der Code ist zwar lang aber an sich nicht kompliziert. Der AM2301 läuft über die Standard DHT Bibliothek, die man auch über die IDE herunterladen und einbinden kann (Adafruit DHT sensor library Version 1.0.0). Man muss nur einen Timingparameter (Parameter 3) passend einstellen. Die Routinen für NTP und die Erzeugung eines lesbaren Strings aus dem NTP Timestamp sind in den Dateien time_ntp.cpp/.h zu finden.
Wie schon erwähnt wird für die Darstellung der Grafiken die Google Chart API genutzt. Die Dokumentation von Google dazu ist sehr gut. Ich habe die Google Beispiele etwas angepasst und dann in den C++ Code eingebaut.

Dazu noch ein kleiner Tipp. Man muss längere html Code-Fragmente in C++ kompatible Strings verwandeln. Das kann man manuell machen; das ist aber fehleranfällig und nervig. Hier gibt es einen kleinen, aber feinen Online Konvertierungsdienst (Haken bei „split output into multiple lines“ wegnehmen):
http://tomeko.net/online_tools/cpp_text_escape.php?lang=en
Es gibt weiterhin eigentlich nur zu beachten, dass der cpp-Präprozessor bei zu langen Zeilen irgendwann streikt und Fehler wirft. Dann muss man die Zeile eben etwas kürzen und auf mehrere Zeilen verteilen.

Weiterhin ist bei der Programmierung zu beachten, dass man nicht beliebig lange Strings zusammenbauen kann. Das RAM des ESP8266 im im Vergleich zu einem Arduino zwar groß (ca. 30kB frei), aber für eine größere Website viel zu klein. Deshalb werden die langen Tabellen für die Unterseiten in 1kB Blöcken übertragen. Auf diese Weise muss die Website nie vollständig im RAM des ESP8266 liegen.
Dieser Streaming-„Trick“ hat aber einen Nachteil. Es soll ein gültiger HTTP 1.1 Header erzeugt werden. Dieser Header muss die Länge der folgenden Website exakt enthalten. Deshalb erzeugt der Code die langen Tabellen zweimal. Beim ersten Mal wird die Länge ausgerechnet und der String verworfen. Nachdem der Header übertragen wurde, wird die Tabelle dann ein zweites Mal erzeugt und gestreamt. Da der ESP8266 mit 80MHz läuft, ist das aber kein Problem.

Erwähnenswert ist sonst noch, dass man nicht den kompletten Speicher mit Arrays belegen darf. Man muss ca. 8-10kB frei lassen, damit für Stack und die Low-Level Wifi Funktionen noch genügend Speicher frei ist. Der Wert von 10kB im Code ist experimentell ermittelt.

Ansonsten hoffe ich, dass der Code selbsterklärend ist. Falls Ihr Fragen habt, hinterlasst einfach einen Kommentar.

205 Gedanken zu „WLAN Lufttemperatur und -feuchte Logger mit grafischer Darstellung für ESP8266

  1. Henk Hoekstra

    Hello ,
    I got an error by compile the program
    Arduino: 1.6.5 Hourly Build 2015/05/24 09:48 (Windows 8.1), Board: „Arduino Nano, ATmega328“
    ESP_TH_Logger.ino:54:28: fatal error: user_interface.h: No such file or directory
    compilation terminated.
    Error compiling.
    This report would have more information with
    „Show verbose output during compilation“
    enabled in File > Preferences.

    Can you tell me what I am doing wrong?

    Regrads,
    Henk

    Antworten
    1. ST Artikelautor

      I am wondering about the Board: Arduino Nano. The code is made for the ESP8266.
      Please install the extension for ESP8266 for the IDE and set the board to ESP8266.

      The user_interface.h should exist within the SDK files for the ESP8266
      C:\Users\User\Documents\Arduino\hardware\arduino-esp8266-master\tools\sdk\include

      Antworten
  2. MacSteven

    Hi,

    vielen Dank für die schöne Umsetzung. Ich habe mit meinem Nachbau nur ein Problem: Ich bekomme nur ganzzahlige Werte (ohne Nachkommastellen) für Temperatur und Feuchtigkeit und kann den Fehler nicht finden. Den Code habe ich unverändert verwendet, nur die Angaben für mein WLAN eingetragen.
    Meine Konfiguration:
    ESP8266-01 mit DHT11 und der DHT-Bibliothek von Adafruit.
    Eventuell ist ja die Lib verkehrt, welche hast Du genommen?
    Für Hilfe wäre ich echt dankbar,

    Gruß, MacSteven

    Antworten
  3. MacSteven

    OK, Problem gefunden: Der DHT11 liefert keine Nachkommastellen. Muss ich mir doch einen DHT22 kaufen…

    Antworten
    1. ST Artikelautor

      Danke für den Hinweis. Jetzt wissen wir, dass es auch mit dem DHT11 läuft und DHT21 (s.o.) Nachkommastellen liefert. Damit dürfte auch der DHT22 mit Nachkommastellen laufen; vielleicht kann das ja noch ein Leser bestätigen.

      Antworten
  4. MacSteven

    Der DHT22 kommt am Mittwoch, vielleicht kann dann am Wochenende danach etwas dazu sagen.

    BTW: Hast Du schon einmal den ESP8266 ohne Umweg über LUA mit Prowl eingesetzt (Push-Benachrichtigungsdienst)?

    Antworten
    1. ST Artikelautor

      Erfolgreich eingesetzt habe ich Pushbullet. Pushbullet läßt sich über pushingbox.com nutzen. Da kann man mittels http mittels GET eine Push Nachricht auf dem Mobiltelefon auslösen. Man muss also auf dem ESP nur eine http Seite mit Pfad anfordern. Fertig.
      Prowl habe ich nie probiert.

      Antworten
  5. MacSteven

    OK, der DHT22 liefert Nachkommastellen (genauer gesagt: 1 Nachkommastelle sowohl bei Temperatur als auch bei Feuchtigkeit),ausprobiert mit der Standardbibliothek für den DHT.

    Wärest Du eventuell bereit, Deine Sketche mit Pushbullet online zu stellen? Ich habe bisher keinen Erfolg gehabt und würde gerne einen Push-Dienst einsetzen. Unser Wäschetrockner steht im Keller und soll seine „Fertig!“-Meldung per Push liefern. Vielen Dank schon einmal!

    Antworten
    1. ST Artikelautor

      Ich schreibe mal was zu Pushbullet zusammen, wenn ich dazu komme. Die Konfiguration von pushingbox ist ein wenig trickreich. Der ESP Sketch ist nichts weiter als die Sketche, die eine HTTP Seite öffnen (GET).

      Antworten
  6. MacSteven

    Noch eine Frage: Der ESP8266 stürtzt immer nach ca. 1 Stunde ab und fängt von vorne an. Möglicherweise ein Speicherproblem: Mein ESP8266-01 hat „nur“ 512k RAM. Wieviel RAM hattest Du zur Verfügung? Ich habe gelesen, dass einige OLIMEX-Boards mit deutlich größerem RAM ausgestattet sind.

    Antworten
    1. ST Artikelautor

      Kann ich Dir gar nicht sagen. Ich habe immer ESP-01 Boards bei dem nächst besten China Lieferanten auf ebay bestellt. Bisher waren die alle gleich. Der Sketch läuft jedenfalls bei mir bisher stabil. Er zeigt im Webinterface immer so ca. 7-8kB freies RAM an und ca. 1800 Datenpunkte. Wie sieht das bei Dir aus?

      Antworten
  7. MacSteven

    Danke erst einmal im Voraus für Pushbullet!

    Zum RAM: Ich bekomme zunächst ca. „18k frei“ angezeigt, was sich mit jedem Aufruf der Seite ändert (meist verringert). Die Zahl der Datenpunkte ist meist so um die 1800, ich meine aber, die Zahl würde sich auch ändern.

    Zum Testen habe ich mal die Größe des freizuhaltenden RAMs im Sketch auf ca. 20000 verdoppelt und die Stunden auf 12 halbiert. Damit ist es die Nacht durch stabil gelaufen.
    Aber auch externe Störungen durch Spikes auf der Versorgung mag ich nicht ausschließen. Ich werde daher am WE den Steckbrettaufbau mal in etwas Solides umbauen (Lochrasterplatine) und dann wieder berichten.

    Antworten
    1. ST Artikelautor

      Es könnte sein, dass wir unterschiedliche SDK Versionen verwenden. Da scheint ja ein Memory Leak vorzuliegen.
      Das SDK ist das Kit, das Espressif herausgibt, um den ESP zu programmieren. Das SDK wird von der Arduino IDE Erweiterung genutzt. Schau bitte mal nach, welche SDK Version Du nutzt. Die Versionsinfo liegt in dieser Datei:
      C:\Users\User\Documents\Arduino\hardware\esp8266-Arduino-master\esp8266\sdk\version

      Dort steht bei mir: 1.0.1_15_05_04_p1
      Ergo verwende ich die SDK Version 1.0.1

      Antworten
  8. MacSteven

    Danke füe den Hinweis! Ich gabe die Info heute morgen nicht so schnell gefunden – ich habe einen Mac und da ist der Pfad anders.
    Zusätzlich habe ich den Reseteingang mal direkt auf + gelegt und die Versorgungsspannung dicht am ESP mit einem 270uF-Elko zusätzlich gepuffert. Mal sehen, was dabei herauskommt.
    Eine Korrektur noch: Die Anzeige der Zahl der Datenpunkte ist konstant.

    Antworten
  9. MacSteven

    Die Hardwaremassnahmen scheinen sich positiv ausgewirkt zu haben. Die Speicheranzeige bleibt nahezu bei 18k, das „Rollen“ der Daten und Anzeige funktioniert auch.
    Trotzdem werde ich noch die Version der SDK prüfen.

    Antworten
  10. Nick

    Hallo Stefan,

    erstmal vorweg, tolles Projekt! Ich hab Dein Projekt nachgebaut, allerdings mit einem DHT11. Funktioniert auf den ersten Blick, aber manche Werte reißen regelmäßig aus. Hast Du nen Tipp wo ich mit der Suche anfangen sollte?
    Hier ein Screenshot vom Chart, da sieht man recht gut was ich meine.

    herzliche Grüße, Nick

    Antworten
  11. ST Artikelautor

    Hallo Nick,
    diesen Effekt habe ich noch nicht gesehen – und ich verwende keinen DHT11. Da ist ja auch eine deutlich erkennbare Periodizität in den Messwerten – und der Fehler erzeugt massive Änderungen der Messwerte.

    Also kann ich auch nur vermuten:
    Da die Kommunikation zwischen DHT und ESP mit Onewire läuft und eine Checksumme bei Onewire im Spiel ist, schließe ich einen Fehler in der Übertragung mal aus.
    1. Ist die Spannung am DHT stabil? – Ist das verwendete Netzteil stabil? – Probiere es mal mit einer anderen Spannungsversorgung.
    2. Hast Du einen Arduino zur Hand? – Tritt das Problem dort auch auf, wenn Du mit dem Arduino den DHT regelmäßig abfragst? – Z.B. mit dem Beispiel das bei der DHT Lib dabei ist.
    3. Hast Du eventuell einen zweiten DHT11 zur Hand; so könnten wir einen Fehler im Sensor ausschließen.

    Gruss Stefan

    Antworten
    1. Nick

      Hallo Stefan,

      hab Deine Tipps befolgt, Netzteil tausch, hab auch nen Pufferkondensator reingehangen, keine Änderung. Der DHT läuft am Arduino ohne Probleme. Ich hab dann mal den Oszi an die Stromversorgung vom DHT gehangen, hin und wieder konnte man einen Spannungsabfall von etwa 0,1V sehen, aber ziemlich zufällig. Sowas hab ich mal bei Lautsprechern in der Nähe von Handies beobachtet. Ich hab dann einfach mal den DHT auf dem Steckbrett 6-7cm weiter entfernt vom ESP platziert und siehe da – alles gut!
      Also hackt das WLAN dem DHT ins Gedärm bevor der ne Checksumme berechnet.
      Ich konnt leider nichts darüber finden mit wieviel Milliwatt der ESP sendet, aber ich vermute nicht mit den in Deutschland üblichen 100mW sondern eher mit 1000mW wie es in anderen Ländern üblich ist.

      grüße, Nick

      Antworten
      1. ST Artikelautor

        Das ist eine interessante Beobachtung. Ich tippe mal darauf, dass der ESP in den analogen Messteil reinfunkt. Was zu Deiner Beobachtung passt: In dem Projekt zur Markisensteuerung musste ich den Abstand zwischen ESP und einem 433Mhz Empfänger maximieren.
        Bei dem von mir verwendeten DHT21 muss ich das mal nachprüfen; ich habe da ein relativ langes Kabel zwischen ESP und DHT. Ich melde mich dazu nochmal.

        P.S.: Die Sendeleistung dürfte eher 100mW sein. Der ESP nimmt für 1W Sendeleistung nicht genug Strom auf – und es gibt meines Wissens kein Land, in dem 1W bei 2,4GHz im WLAN erlaubt sind. In den USA dürfen es 125mW sein – und die erlauben meines Wissens die höchste Sendeleistung.

        Antworten
        1. ST Artikelautor

          Ich habe das mal mit dem DHT21 nachgestellt. Der Effekt scheint in ähnlicher Form aufzutreten. Ich habe die Distanz zwischen DHT21 und ESP8266 verringert und den ESP auf den DHT gelegt. Sofort steigt die Temperatur um ca. 1,5 Grad an und die Feuchtigkeit fällt um 3%. Die Messwerte sind jetzt konstant auf anderem Niveau. Vergrößere ich die Distanz dann wieder auf ca. 10cm fallen die Messwerte sofort wieder auf die vorherigen Werte zurück.
          –> Danke Dir für den Hinweis. Ich nehme das in dem obigen Beitrag als Info auf.

          Antworten
  12. MacSteven

    Ich glaube, ich habe -neben Schwankungen in der Versorgungsspannung – noch einen weiteren Grund für die Abstürze gefunden: Greift man innerhalb kurzer Zeit sehr oft auf das Gerät zu, sinkt der freie Speicher rasant. Lässt man dann eine größere Pause, erhöht sich der freie Speicher wieder. Offensichtlich wird von den FW-Routinen beim Zugriff benötigter temporärer Speicher zu langsam wieder freigegeben. Seitdem ich die Zugriffe reduziert habe, läuft due Kuste stabil.
    BTW: Meine SDK hat die Version 1.0.1 . Ich weiss noch nicht, wie ich die 1.1. installieren kann.

    Antworten
    1. ST Artikelautor

      Den Effekt mit den schnellen Zugriffen kann ich auch nachvollziehen. Ich hatte experimentell 10k als freien Speicher ermittelt (#define KEEP_MEM_FREE 10240). Damit konnte ich den ESP bei mir nicht mehr destabilisieren (Win7 + Chrome); da ist aber jeder Browser etwas anders.

      SDK 1.1 –> selbst integrieren oder warten, bis ein neues Paket für die ESP-Unterstützung in der Arduino IDE released wird.

      Antworten
  13. Martin

    Hallo Stefan,
    da steckt sichtbar jede menge Arbeit drin, Respekt! Dein Projekt hat mir ein gutes Stück weiter geholfen. Vielen Dank!
    Ich war am Anfang etwas erschrocken, das es nur möglich sein sollte 1800 Datenpunkte zu speichern, was für meine Anwendung zu wenig wäre. Nach dem überfliegen deines Codes ist mir aufgefallen das du pro Datenpunkt 96 bit verwendest (gesamt 168k bit) aber ohne Abstriche machen zu müssen mit 32 bit auskommen könntest. Für die Darstellung von Temperatur und Luftfeuchte reichen je 16 bit und deine Zeitintervalle sind regelmäßig, so das die Zeit rekonstruiert werden kann. Somit währe die dreifache Aufzeichnungszeit möglich (bei minütlichen Intervallen fast vier Tage).
    Reduziert man die Auflösung auf 0,5 Grad bzw. Prozent (8 bit) und geht auf 5 min Intervalle (variablen Zeitraum hast du ja schon eingebaut) kann man 37 Tage speichern ohne das die Diagramme auf einem Handydisplay wesentlich an Detail verlieren. Die Genauigkeit der Sensoren gibt eh nicht mehr her 😀

    Bitte nicht als Kritik auffassen sondern als konstruktiver Beitrag. 😉

    Gruß Martin

    Antworten
    1. ST Artikelautor

      Hallo Martin,

      stimmt – die Datenhaltung kann man definitiv optimieren. Für die meisten Leute sollten ca. 1800 Datenpunkte ausreichen und daher habe ich das nicht weiter getrieben. Außerdem werden die Ladezeiten für die Webseiten dann nochmals deutlich länger.

      Für die Darstellung der Temperatur gibt es die Werte von -40,0 bis 80,0 Grad Celsius. Macht 1200 Möglichkeiten. Für die Feuchtigkeit sind es 1000 Werte. Ohne jegliche Einbuße in der Genauigkeit sollte das mit 21 Bit (–> ln2(1200*1000) ) machbar sein. Weiterhin müsste man auch nicht unbedingt den exakten Zeitpunkt der Werterfassung mitloggen. Ich mache das eigentlich nur, weil ich nicht exakt garantieren kann, dass die Messwerte komplett äquidistant sind, weil Abfragen der Webseiten das Logging verzögern können.
      Nimmt man diese Optimierungen (21 Bit vs 96 Bit) zusammen, sollte sogar mehr als das 4,5-fache an Zeitpunkten drin sein.
      Wenn man es dann noch weiter treiben wollte, könnte man die Differenz zwischen den Messungen ablegen und nicht den Absolutwert. Damit sind die meisten Einträge fast Null, weil sich meistens nur wenig ändert. Diesen Array müsste man sehr effizient mit einer einfachen Kompression wie heatshrink o.ä. packen können. Damit sollte nochmal ein Faktor 2-3 drin sein.

      Gruss Stefan

      Antworten
  14. MacSteven

    Es gibt noch die Möglichkeit, den Olimex MOD-WIFI-ESP8266-DEV (siehe Ama***) zu verwenden. Dort sind satte 2MB Speicher eingebaut, 4x so viel wie im Basismodell, außerdem sind mehr Ports verfügbar. Kostet derzeit 6,95€.

    Antworten
    1. Martin

      Hallo MacSteven,

      du meinst das SPI-Flash? Dafür müsste man aber z.B. das SPIFFS nutzen (Über die EEPROM Implementierung sind nur 4kB Flash verfügbar). Dort sollte auch im Moment noch mehr Platz sein als die ca. 21kB RAM welche momentan belegt werden. Die Olimex Module sind keine Option für mich, da eine Lieferung ESP-03 und ESP-07 aus China unterwegs ist :D. Stefans Vorschlag der Komprimierung hört sich momentan verlockend an, vor allem wenn man im Browser per JS dekomprimiert. Er hat schon recht, das es nichts bringt mehr Daten zu sammeln, wenn man sie nicht vernünftig ausliefern kann. Komfortabel wär das SPIFFS um die Daten z.B. im JSON-Format in eine Datei abzulegen. Eventuell ist es ja bald einsatzbereit.

      Hier gibt es eventuell einen kleinen Hack: SPIFFS

      Gruß Martin

      Antworten
  15. MacSteven

    Hallo Martin,

    dass nur 4k verfügbar sind wusste ich nicht. Aber es gibt wohl I2C-Treiber, wie wäre es dann mit einem 64k-I2C SRAM oder FRAM? Meinst Du, das wäre realisierbar? Optimal wäre eine SD-Karte (weil entnehmbar und am PC auslesbar), aber da habe ich noch keinen Treiber gefunden.

    Antworten
    1. Martin

      Hier gibt es mehr Infos zur Aufteilung des Flash:
      Flash Split for 512K chips

      Da werden auch 20k für EEPROM reserviert obwohl nur 4k verwendet werden. Wenn man den reduziert und dann noch etwas vom Platz für die Sketches abzweigt bekommt man schnell >100kB :D. Der Platz ist da, kann aber momentan nicht verwendet werden.

      Aktuell finde ich es schon Interessant bei meiner Wetterstation die Daten von letztem Jahr als Vergleich zu sehen. Das man diese Funktion komplett für kleinstes Geld embedded haben könnte hat für mich schon großen Reitz. Bei solch alten Daten muss dann die Auflösung nicht so hoch sein, halbstündlich reicht locker. Das sind dann etwa 4-6kB pro Monat…

      Oh je, schon wieder ein Projekt.

      Gruß Martin

      Antworten
        1. ST Artikelautor

          Die richtige Lösung für eine größere Datenmenge ist sicherlich die SD Karte. Insbesondere wenn der Wunsch in Richtung einer Wetterstation geht. Die typischen Wetterstationen können allerdings auch nicht sehr viele Daten halten.
          Ich habe eine Wetterstation online (https://thesen.eu/wetter). Da ist aber ein Raspberry Pi dahinter, um die Messwerte zu verwalten und die html Seiten zu erzeugen. Wenn so etwas das Ziel ist, sprengt es m.E den Rahmen eines ESP8266 in Bezug auf RAM als auch CPU.
          Den ESP sehe ich da eher als Enabler für einen Wireless Sensor mit etwas Cache für die Messungen.

          Antworten
  16. Paul

    Hi, schönes Beispielprojekt !
    Werd mich wohl auch mal mit dem ESP beschäftigen, scheint mir doch ganz interessant zu sein das Bauteil.
    Frage: Wo hast du die beiden Anzeige Instrumente für die Webseite her, selbst gemacht ? Wenn die mit einer freien Lizenz sind, würd ich sie gerne auch verwenden.

    Gruß Paul

    Antworten
    1. ST Artikelautor

      Die Anzeigen sind wie oben erwähnt Google Chart Objects. Das bedeutet, dass die vom ESP erzeugte Website ziemlich simpel ist. Die nötigen Daten werden als Javascript Array erzeugt. Der Java Code für die grafischen Elemente wird dann von google aus dem Internet in den Browser geladen. Dieser rendert wiederum die Grafiken.
      Auf diese Weise haben wir die Möglichkeit komplexe Objekte im Browser zu rendern und der ESP muss nur einige Bytes schicken. Weiterer Vorteil: Die Daten bleiben lokal – nichts geht in irgendeine Cloud.
      Das Copyright der Google Chart Objects liegt bei Google 🙂 – sie dürfen kostenfrei eingesetzt werden.

      Gruss Stefan

      Antworten
      1. Paul

        Hey,
        Danke für die schnelle Antwort.

        PS: werde sicher öfter bei dir reinschauen. ?

        Grüße Paul
        ( noch in Urlaub)?

        Antworten
  17. Greece2001

    Tolles Projekt, leider fehlt die „user_interface.h“. Wo kann man die denn finden ?
    ESP8266 lib. ist installiert, „…hardware\esp8266-Arduino-master\esp8266\sdk\version“ gibt es jedoch nicht.
    Gruß + Dank, Greece2001

    Antworten
  18. Greece2001

    Hab’s entspr. der Anleitung
    „Auf https://github.com/esp8266/arduino die arduino-esp8266-master.zip herunterladen. Das im Zip enhaltene Verzeichnis arduino-esp8266-master im Windows Dokumenten Verzeichnis unter Arduno\hardware (typischerweise C:\Users\User\Documents\Arduino\hardware) ablegen. Damit nix schief geht: Das Verzeichnis arduino-esp8266-master liegt dann in Arduino\hardware“
    versucht.
    Das Zip-File heisst aber nicht „arduino-esp8266-master.zip“ sondern „Arduino-esp8266.zip“, das Verzeichnis „arduino-esp8266-master“ gibt es darin auch nicht. Habe aber alles enstpr. umbenannt.
    Nach Start gibt es den o.g. Board-Typ „generic ESP8266“ nicht in der Auswahlliste.
    Im Verzeichnis „hardware“ gibt es nun das Verzeichnis „arduino-esp8266-master“ (weil entspr. umbenannt), darin wieder das Verzeichnis „hardware“ sowie „libraries“, „docs“, „build“, „arduino-core“, „arduino-builder“, „app“ und „.settings“.
    Entweder bin ich zu blöd oder es sind unterschiedliche Versionen von der Erweiterung ?
    Gibt es noch ein paar Tips dazu ?
    Gruß + Dank, Greece2001

    Antworten
    1. ST Artikelautor

      Es kann sein, dass in dem Github.com Projekt der Name der zip Datei geändert wurde. Die Installation ist auch dort beschrieben.
      Die zip Datei herunterladen und so auspacken, dass das Verzeichnis Hardware in Documents im Arduino Verzeichnis liegt. Dann die Arduino IDE neu starten. Es muss eine halbwegs aktuelle Version der IDE sein (1.6.x vermutlich).
      Ich habe das auf 3 Rechnern mit Windows 7 und 8.1 so gemacht und es hat jedes Mal geklappt.
      Ich hoffe es klappt auch bei Dir so.

      Antworten
  19. Greece2001

    So, habe nach Anleitung über den Boardmanager installiert:
    Start Arduino and open Perferences window.
    Enter http://arduino.esp8266.com/package_esp8266com_index.json into Additional Board Manager URLs field. You can add multiple URLs, separating them with commas.
    Open Boards Manager from Tools > Board menu and install esp8266 platform (and don’t forget to select your ESP8266 board from Tools > Board menu after installation).

    Das hat auch funktioniert, jetzt kann ich das generic ESP8266 auswählen.

    Habe dann aus der ZIP-Datei den Inhalt us dem Verzeichnis „Hardware“ in das Verzeichnis „Hardware“
    unter documents… (s.u.) kopiert.
    C:\Users\XX\Documents\Arduino\hardware
    Dann IDE neu gestartet.

    Nun aber gibt’s gleich ’ne neue Fehlermeldung:
    „C:\Users\XX\Documents\Arduino\libraries\ESP8266wifi-master/ESP8266wifi.h:23:26: fatal error: avr/pgmspace.h: No such file or directory
    #include “

    Was mache ich nun wieder falsch ?!

    Antworten
    1. ST Artikelautor

      Keine Ahnung. Bei mir klappt es auf 3 Rechnern. Such doch mal die fehlenden Includes im Dateisystem. Vermutlich ist irgendwas mit den Pfaden falsch.

      Antworten
      1. ST Artikelautor

        Ich habe das Ganze jetzt nochmal mit der Arduino IDE 1.6.5 und dem Boardmanageransatz nachvollzogen. Ich kann den Code problemlos übersetzen.
        Die alte ESP Erweiterung habe ich vorher entfernt: Das hardware Verzeichnis im Arduino Verzeichnis löschen.

        Antworten
    1. ST Artikelautor

      Da scheinen zwei Probleme vorzuliegen:
      1. Uhrzeit – das könnte an der SDK Version liegen. Espressif hat da herumgefixt. Oder aber der ESP kommt einfach nicht ins Internet. Von letzerem gehe ich mal aus. Also SDK Version. Der Pfad hängt von Deine PC ab; sollte ab in etwa so sein:
      C:\Users\Stefan\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.4-673-g8cd3697\tools\sdk
      Darin ist eine Datei „version“. Was steht da drin? – 1.0.1…? – Wenn es älter ist, wird die Abfrage des Zeitservers nicht klappen.

      2. DHT Sensor. Hast Du den selben DHT Sensor genommen oder einen anderen? – Ggf musst Du einen anderen DHT im Code entsprechend eintragen. Es könnte auch sein, dass Du mit der Einstellung 160MHz übersetzt hast. Nimm mal 80MHz.

      Gruss Stefan

      Antworten
        1. ST Artikelautor

          Dann haben wir ja schon mal einen Unterschied identifiziert. Du hast die neuere SDK Version von Espressif genommen. Ich würde mal stark darauf tippen, dass die Probleme daher kommen. Der schnellste Fix für Dich dürfte ein Downgrade der SDK Version sein.
          Generell sollten wir aber versuchen die Unterschiede zu kapieren. Laut Changelog hat Espressif auch mit dem SDK 1.2 wieder an UDP gedreht. Das könnte die NTP/Zeitprobleme erklären. Das sollten wir aber kurz bei Seite legen.

          Zu den Temperaturmessungen. Du könntest probieren mit dem Parameter 3 in den folgenden Zeilen zu spielen:
          // init DHT; 3rd parameter = 16 works for ESP8266@80MHz
          DHT dht(DHTPIN, DHTTYPE,16);
          Der Parameter definiert Wartezeiten in der DHT Library; ggf mal mit einen anderen Wert. Versuch mal eine 20.

          Wenn ich dazu komme, werde ich auch mal auf die neuere SDK Version gehen und sehen, ob ich das nachvollziehen kann.

          Gruss Stefan

          Antworten
          1. Torsten

            Danke für deine Tips 🙂 Bis auf die Uhrzeit hauts schonmal hin. Sind aber exakt 2 Stunden, kann man bestimmt noch wo einstellen.
            Durch meine x Versuche kann ich gar nicht sagen was nun den Erfolg brachte.
            Wenn ich es nachvollziehen kann, werde ich es hier mal schreiben.

          2. ST Artikelautor

            Dann hast Du alles ans laufen bekommen. Prima. Die Uhrzeit ist UTC (steht auch dran ;-)) und damit by design im Sommer 2h hinter der Uhrzeit. Ich habe mir die Umrechnung in die deutsche Zeit erspart, weil ich kein Codesniplet für eine Sommer-/Winterzeitumrechnung hatte.

          3. ST Artikelautor

            Ich habe heute auf die SDK Version 1.2 upgedated. Der Code läuft (mit dem Wert 16 oder 20 auf dem dritten Parameter – egal).
            Mit dem SDK 1.2 steht etwas weniger RAM zur Verfügung. Und unter allen SDK Versionen gilt: Bis zur Erfassung des ersten Messwerts wird als Temperatur / Feuchtigkeit / Uhrzeit Unsinn angezeigt. Es kann also bis zu 5 Min dauern, bis etwas Sinnvolles im Webinterface steht.
            Ggf einfach den Messzeitraum in den #defines von 168 (Stunden) auf 6 reduzieren. Dann wird ca. alle 15 Sekunden ein Wert erfasst.

  20. Martin

    Ein wirklich tolles Projekt und eine super Arbeit!

    Habe nur ein Problem. Wenn man auf der html-Seite die Grafik auswählt erscheint nur der Text und keine Grafik. Die Tabelle und die Starseite werden richtig ausgegeben.

    VG Martin

    Antworten
    1. ST Artikelautor

      Sind in der Tabelle sinnvolle Zahlenwerte drin? – Wenn die Verbindung zum Sensor wackelig ist, steht teilweise NaN (not a number) drin. Damit kann das Google Script nix anfangen.
      Ansonsten schau mal den Quellcode der html Seite an, der auf der Grafikseite erzeugt wird.

      Antworten
    1. ST Artikelautor

      OK. Danke für die Rückmeldung. Eigentlich müßte ich mal eine Abfrage einbauen, welche die NaNs abfängt und dafür auf der Seriellen etwas „meckert“ 🙂

      Antworten
      1. Har

        Gutentag, ich haette das gleiche Problem. Ich habe im Sketch Wifi-Mode von Wifi-STA in Wifi-AP geaendert und das wirkt . Ich weiss noch nicht ob das andere konzequenzen hat…

        Antworten
  21. Roland

    Hallo,

    tolles Projekt!
    Dummereweise habe ich mein Arduino Plugin auf die Version 2.0.0 upgeradet.
    Seit dem bekomme ich keine Antwort mehr vom NTP.
    Ist das Problem bekannt, bzw. gibt es sogar eine Lösung?

    Besten Dank

    Antworten
  22. ST

    Die 2.0.0 hat ads SDK 1.3.0 an Board. Ich habe das damit nachvollzogen. NTP geht, ist aber offenbar nicht mehr so zuverlässig beim ersten Aufruf. Das hier fixt das Problem; ist auch oben als V2 eingestellt:

    Suche diese Zeile: sendNTPpacket(timeServer); // send an NTP packet to a time server
    Den folgenden Code ersetzen bis zu dieser Zeile hier; diese Zeile bleibt erhalten: if(!cb)

    int cb, count=0;
    do
    {
    sendNTPpacket(timeServer); // send an NTP packet to a time server
    delay(1000);
    cb = udp.parsePacket();
    count++;
    }while (!cb || count>10);

    Dadurch wird der NTP Request bis zu 10 Mal wiederholt. Da UDP Pakete auch verloren gehen können, macht das auch durchaus Sinn.

    Antworten
  23. Markus

    Hallo

    Herzlichen Dank, dass Du deinen Code zur Verfügung stellst.
    Das ist wirklich clever gemacht und läuft stabil
    Ist es sehr aufwendig noch ein Barometer (BMP 180) hinzuzufügen ? Das wäre natürlich noch perfekt
    Ich freue mich auf weitere tolle Projekte

    Gruss Markus

    Antworten
    1. ST Artikelautor

      Prima, dass es klappt. Freut mich. Ein BMP180 sollte kein Problem sein. Läuft mit 3.3V und es gibt Berichte über eine prinzipielle Funktion mit der Nodemcu Firmware. Es sollte also auch mit der Arduino IDE Variante gehen.
      Auf Aliexpress gibt es den zum Bmp180 kompatiblen GY68 für unter einen Euro. Ich hab mal welche bestellt.

      Antworten
      1. Markus

        Hallo

        Den BMP 180 läuft problemlos am ESP 12E

        #include
        #include

        Adafruit_BMP085 bmp;

        void setup() {
        Serial.begin(9600);
        if (!bmp.begin()) {
        Serial.println(„Could not find a valid BMP085 sensor, check wiring!“);
        while (1) {}
        }
        }

        void loop() {
        Serial.print(„Temperature = „);
        Serial.print(bmp.readTemperature());
        Serial.println(“ *C“);

        Serial.print(„Pressure = „);
        Serial.print(bmp.readPressure());
        Serial.println(“ Pa“);

        Serial.print(„Pressure at sealevel = „);
        Serial.print(bmp.readSealevelPressure(440)/100.00);
        Serial.println(“ hPa“);

        Serial.println();
        delay(1000);
        }

        Toll wäre auch noch eine 3h Tendenzanzeige

        Gruss Markus

        Antworten
  24. Torsten

    Hallo
    wollte mal die verbesserte Version ausprobieren und diese gleichzeitig ohne Router betreiben (Access Point).
    Ein tausch von
    // WiFi.begin(ssid, password);
    WiFi.softAP(ssid, password);
    scheint aber nicht zulangen 🙁

    Antworten
    1. ST Artikelautor

      Ich bin gerade rechnerlos unterwegs. Deshalb kann ich nicht in die Codes schauen.
      Sieh Dir mal das Code Beispiel für den HTTP Webserver an und vergleiche ihn mit dem geänderten Beispiel für den Access Point.

      Antworten
        1. Markus

          Nein, damit ich auch von unterwegs auf meine Wetterdaten zugreifen kann.
          Ich hätte da noch ein HP welche ich ev verwenden kann

          Gruss Markus

          Antworten
          1. ST Artikelautor

            Wenn der ESP8266 an einem normalen DSL Anschluss hängt, gibt es mehrere Möglichkeiten.
            Per Portforwarding Port 80 auf Port 80 des Esp. Oder falls Dein Router das kann per VPN.

  25. Lorenz

    Hallo zusammen.

    Bin heute zufällig euren Blog gefunden. Ich programmiere den ESP8266 unter LUA das hier ja nicht
    verwendet wird. Aber ich denke ich habe trotzdem eine gute Info für euch bezüglich Flash-Speicher.
    Meine ESP-03 Module die ich vor einem Jahr gekauft habe hatten einen 4Mbit Flash Speicher, ergo 512 Kbyte Flash Speicher.
    ESP-03 Module die ich vor 8 Wochen in China bestellt habe zeigen mir jetzt einen 8Mbit Flash Speicher. Hier wären ca. 500Kbyte Speicher für eure Daten zum Aufzeichnen vorhanden.
    Vor 4 Wochen habe ich einen ESP-12e bestellt und dieser hat einen 4Mbyte Flash Speicher verbaut.
    Keine dieser Speichergrößen hat der China Händler in seiner Beschreibung angegeben. Die handeln einfach damit ohne zu wissen was sie verkaufen.
    Wie auch immer, neuere Module scheinen mehr Flash Speicher zu haben.
    Derzeit läuft bei mir eine Bestellung über 8Mbit Flash Module von Winbond. Ich werde versuchen ob ich diese auf meinen ESP-03 Modulen zum laufen bringen kann. Dadurch hätte ich auch mehr Speicher.

    LG Lorenz

    Antworten
      1. Lorenz

        Hallo zusammen,

        hat funktioniert.
        Kleines Problem war dass meine bestellten Flash Bausteine etwas breiter
        in der Abmessung sind. Nach etwas kürzen der Beine und umbiegen habe ich es dann aber doch geschafft dass der Flash Baustein passt. Jetzt läuft mein ESP-03 „old version“ mit einem 8Mbit Flash. Das bedeutet für euch dass ihr etwa 500kbyte Flash Speicher für die erfassten Daten habt.

        Wenn ich jedoch den Aufwand vom Bestellen bis zum Umlöten ansehe so denke ich dass ein bestellen von einem neuen ESP-03 mit mehr Speicher einfacher ist. Bei den Preisen in China von ca. 2 -3 Euro pro ESP-03 ist das zu verkraften.

        Antworten
  26. Frank

    Das ist mal wieder ein tolles Projekt. Ich habe es mit einem ESP-01 aufgebaut, dessen Speicher mit einem winbond 25Q32FV auf 4MB erweitert wurde. Alles funktioniert soweit. Was mich wundert, ist, dass trotz des üppigen Speichers die Anzahl der maximalen Datenpunkte „nur“ mit 2848 angegeben wird. Muss vielleicht noch irgend eine Einstellung verändert werden? Die Einstellungen der Arduino IDE habe ich so vorgenommen: https://www.dropbox.com/s/w7nkr8njfqm3cbl/ESP%20Einstellungen%20in%20IDE.jpg?dl=0

    Frank

    Antworten
    1. ST

      Die Sache ist ganz einfach: Der Code legt nichts im Flash ab, sondern behält alles im RAM. Es macht absolut Sinn, das Flash als Speicher für solche Zwecke zu nehmen. Müsste man aber mal reinkodieren…

      Gruss Stefan

      Antworten
  27. Roland

    Hallo,

    habe immer noch Probleme mit dem NTP.
    Mit der neuen SDK kann ich beliebig oft Pakete schicken –> keine Antwort.
    Mit der alten SDK klappt’s auf Anhieb.

    Übrigens: Die Durchführung von max. 10 Abfragen in der V2 müsste folgendermaßen lauten:

    }while (!cb && count<10);

    Gruß
    Roland

    Antworten
    1. ST

      Die while Sache stimmt natürlich. Muss ich fixen.
      Warum es bei Dir nicht geht, ist mir nicht klar. Bei mir klappt es bei 10 Tests auch 10 Mal.

      Gruss Stefan

      Antworten
  28. Roland

    Hallo!

    Hat sich geklärt.
    Scheinbar gab’s eine Mischung verschiedener Bibliotheken.
    Habe die komplette ESP Hardware entfernt und anschließend neu installiert.
    Jetzt klappt’s auch mit dem NTP.

    Beste Grüße
    Roland

    Antworten
  29. Frank

    Hat jemand das Projekt auf einem ESP8266-12E laufen? Ich habe es auf dem ESP-01 installiert und alles läuft wie gewünscht. Installiere ich es auf einem ESP-12E, dann loggt sich dieser nicht in das Wlan ein. (Die Hardware ansich läuft mit anderen Beispielsketchen, wie Blink und Server) Die Vorgehensweise ist identisch und der Sketch ebenso. An einem Dreher im Passwort oder SSID kann es also nicht liegen. Gibt es evtl. Probleme mit der Version der Firmware? Welche nutzt ihr? Ich habe es mit der IDE 1.6.4 und 1.6.5 probiert. Gemäß der Versionsdatei lautet diese bei der IDE 1.65 „1.3.0_15_08_10_p1“.

    Frank

    Antworten
  30. Frank

    Da die Beispielsketche funktionieren, schließe ich ein Hardwareproblem aus. Ich nutze zum Flashen des ESP diesen Programmierer: http://www.forum-raspberrypi.de/Thread-projekt-esp8266-programmierer-version-2-0
    Der ESP-12E sitzt auf dieser Platine (leicht modifizierte Version 2.0B mit SPX): http://www.forum-raspberrypi.de/Thread-projekt-esp8266-adapter-mit-on-board-spannungsversorgung-zum-einbau-in-projekt?pid=183387#pid183387
    Das sieht dann so aus: https://www.dropbox.com/s/3agjum33bpzcfnt/ESP%20Board%20unten.jpg?dl=0
    https://www.dropbox.com/s/2rf60fa5p5x53fb/ESP%20Board%20oben.jpg?dl=0

    Sollte jemand Interesse daran haben, bitte melden. Ich habe noch verschiedene Platinen hier liegen.

    Nach stundenlanger Suche ist das Problem inzwischen gelöst. Ich habe den ältesten aller Tricks angewendet. Strom aus / Strom an (an der FritzBox) und schon lief alles…

    Frank

    Antworten
  31. Stephan Berger

    Frohes Neues Jahr!

    @Deine Antwort vom 03.06.15: Hattest Du schon Gelegenheit, etwas über pushbullet zusammen zu schreiben? Ich krieg’s nicht hin…

    Gruß Stephan

    Antworten
    1. ST Artikelautor

      Hallo Stephan,

      Du hast Recht. Ich habe das immer noch nicht zusammen geschrieben. Die Zeit…
      Ich habe eine ESP Steckdose gebaut, die mit einem MiniPro und einem ACS712 den Stromverbrauch einer Waschmaschine analyisert und mit eine Pushnachricht schickt, wenn der Waschvorgang beendet ist.

      In aller Kürze – und wenn Du nicht weiter kommst, melde Dich.

      Gruss Stefan

      Account bei Pushingbox anlegen.
      Bei Pushingbox den API Code von Pushbullet hinterlegen.

      Mit dem Code von Pushingbox das hier nutzen; dabei sind für den Titel und die Nachricht jeweils Variablen hinterlegt:
      void sendToPushingBox(const char *pcID,const char *pcTitle, const char *pcMessage)
      {
      //http://api.pushingbox.com/pushingbox?devid=YOUR_SCENARIO_ID&title=Waschmaschine%20fertig&message=Laufzeit%20107%20Minuten

      char serverName[] = „api.pushingbox.com“;

      client.stop();
      if (client.connect(serverName,80))
      {
      client.print(„GET /pushingbox?devid=“);
      client.print(pcID);
      client.print(„&title=“);
      client.print(pcTitle);
      client.print(„&message=“);
      client.print(pcMessage);
      client.print(“ HTTP/1.1\r\nHost: „);
      client.print(serverName);
      client.print(„\r\nAccept: */*\r\nUser-Agent: Mozilla/4.0 (compatible; esp8266; Windows NT 5.1)\r\n\r\n“);
      }
      }

      Antworten
  32. Frank

    Ein frohes neues Jahr allen Bastlern und denen, die diese „ertragen“ müssen 😉

    Inzwischen habe ich einen weiteren ESP mit dem Sensor ausgestattet und in meinem Büro installiert. Dort wird außerhalb der Arbeitszeit das Wlan abgestellt. Ich war sehr erstaunt, dass das deaktivierte Wlan dazu führt, dass auch keine Daten mehr aufgezeichnet werden. Ist das so gewollt oder eher ein Bug?

    Frank

    Antworten
    1. ST Artikelautor

      Hallo Frank,

      der Effekt kommt aus dem Design des Codes. Er ist einfach nicht dafür gedacht, dass jemand das WLAN ausmacht. Wenn die WiFi Verbindung abreisst, versucht der Code die WiFi Verbindung wieder herzustellen. Der ESP hängt dann in der while() Schleife in der Funktion WiFiStart fest, bis das WLAN wieder angeht. Dann wird auch nix geloggt.
      Du müsstest Du Deinen Usecase den Code umbauen. Nehmen wir mal an. dass Du alle 10 Sekunden einen Datenpunkt aufnimmst. Dann müsstest Du die while() Schleife nach 5-7 Sekunden verlassen und den darauf folgenden Code überspringen. Damit wird die main() Funktion wieder regelmäßig aufgerufen und es sollte klappen.

      Gruss Stefan

      Antworten
  33. Roman

    Hallo alle miteinander!
    Als Erstes möchte ich ein GROSSES Lob an den Autor aussprechen! Dieses Projekt ist echt toll.
    Ich habe bereits einige Kommentare usw. verfolgt und frage mich, ob dieses Projekt vielleicht auch auf dem „Pretzelboard“ http://iot.fkainka.de/technische-daten funktionieren könnte, da dieses ja auch einen ESP8266 besitzt. Habe aber bisher immer Probleme mit den libraries beim compilieren.
    „…fatal error: ESP8266WiFi.h: No such file or directory“
    Ich möchte auch noch anmerken, dass ich in der µC-Welt noch eher zu den Einsteigern zähle, würde mich aber über Eure Hilfestellungen sehr freuen!
    Danke im Voraus!

    Antworten
    1. ST Artikelautor

      Hi,

      das Pretzelboard ist eine Kombination aus ESP und Arduino. Ähnlich wie in vielen anderen Projekten und auch einem Projekt hier:
      https://blog.thesen.eu/funk-wlan-markisensteuerung-mit-esp8266-und-arduino/

      Aus meiner Sicht ist es nicht sehr sinnvoll, den ESP mit der AT Firmware an den Arduino anzubinden. Das ist wenig elegant und auch extrem nervig zu programmieren (man parst sich zu Tode). Ich würde deshalb eher dazu raten, beide Bausteine mit der Arduino IDE zu programmieren. Eine serielle Kommunikation ist dann einfacher und zielgerichteter. Vermutlich ist es auch wesentlich billiger (ESP ca 3€ + Nano ca. 2,5€ + 1€ für LM1117 und zwei Widerstände).

      Wenn Du die hier publizierten Codes verwenden willst, dann musst Du den ESP umflashen (Dein Programmierversuch geht auf den Arduino und da gibt es die ESP Libs natürlich nicht). Wenn ich das richtig sehe, ist das PrezelBoard mit einem nicht bestückten Anschluss ausgerüstet, der dem ESP8266-01 Layout entspricht. Bestückt man diesen Anschluss mit Stiftreihen, so sollte ich die ESP Firmware umflashen lassen. Und das geht dann vermutlich auch mit dem Arduino IDE Ansatz. Die normalen Pretzelcodes laufen dann nicht mehr, bis Du wieder die AT Firmware flashst. Dazu gibt es Codes und Anleitungen im Netz.

      Gruss Stefan

      Antworten
  34. Markus

    Hallo,

    finde dein Projekt echt super.

    Leider schaffe ich es als Anfänger nicht, deinen Code so umzuschreiben, dass der ESP als Server (Acces Point) funktioniert.

    Nun hoffe ich einfach mal auf deine Hilfe. Das die Google Charts dann nicht funktionieren, ist verständlich. Mir würden auch die Tabellen reichen.

    Antworten
  35. Stephan

    Hallo Stefan,
    auch von mir vielen Dank für dieses tolle Projekt und der, wie ich finde, passenden Implementierung einer funktionstüchtigen Server-Variante! Dein Projekt hat mir bei meiner Realisierung meines Projektes sehr geholfen!
    Für dich noch ein kleiner Hinweis auf einen tollen Absolutdruck-Sensor, passend zu den Wetterdaten, die du sammelst: Der Sensor MS5803. Diesen gibt es in verschiedensten Auflösungen und passende Bibliotheken gibt es bereits im Netz (http://github.com/millerlp/MS5803_01). Wenn du ihn dir direkt aus China kommen lässt, ist er auch bezahlbar (ca. 20€). Klar, der BMP085 ist viel billiger, aber ich war davon auch eher weniger überzeugt…
    Vielleicht hast du ja Lust, deine Wetterstation etwas zu erweitern…
    Grüße
    Stephan

    Antworten
    1. ST Artikelautor

      Danke für die Infos. Mir ist nach Datenblattlage nicht klar, warum der MS5803-01 besser sein sollte als der GY68/BMP180/BMP085 den man für unter 2€ bekommt. Was waren denn Deine praktischen Erfahrungen mit dem BMP vs MS?

      Gruss Stefan

      P.S.: Wg Wetterstation: Die Fineoffset WH3080 hat den Geist aufgegeben. Der Plan ist schon länger mit einem ESP und dem BMP was zu machen. Wenn da nur genug Zeit wäre 🙂

      Antworten
  36. Ronald

    Vielen Dank für das sehr interessante Projekt.

    Zu erst habe ich den Sketch auf ein ESP8260 devkit gespielt. Auf diesem wurden aber keine Werte vom DHT gelesen. Ich vermute, dass das am GPIO Mapping liegt. GPIO 2 = D4 ging nicht. Dieser Baustein wird auch mit der NodeMCU 1.0 in der Arduino SDK geflasht.

    Mit einem ESP8266-1 lief es dann auf Anhieb. Was ich beobachten konnte und nicht ganz verstehe ist, dass mit dem ESP8266 devkit die Webpage Tabelle laufend aktualisiert wurde. Beim ESP8266-01 geschieht das nicht. Liegt das vielleicht an der Geschwindigkeit?

    Eine Frage habe ich noch: Ist es möglich die ausgelesenen Werte an ein Home Automation System zu senden? FHEM soll wohl gehen, ich benutze aber den SHC (Smart Home Control).

    An welcher Stelle müsste das im Sketch eingebaut werden? Beispiel Sketche gibt es.

    Vielen Dank

    Antworten
    1. ST Artikelautor

      Hallo Ronald,

      ich habe offen gesagt eine Ahnung, was die Unterschiede zum Devkit verursacht. Die Webpage mit der Tabelle sollte sich auch nur bei einem Refresh per Browser aktualisieren. Jedenfalls ist es so implementiert.

      Wegen FHEM/SHC: SHC nutze ich nicht. Wenn Du etwas absenden willst, dann such im dem Logger Code bitte die Stelle mit dem Kommentar „do data logging“. Am Ende der folgenden Klammerung ist der Messwert erfasst. Wenn Du vor die Inkrementierung von ulMeasCount Deinen Code einführst, kannst Du problemlos auf die Werte zugreifen. Das geht dann genau so wie in den darüber stehenden seriellen Outputs.

      Gruss Stefan

      Antworten
  37. Uwe

    Hallo
    Das hier ist wirklich ein tolles Projekt. Ich habe das Script installiert und leichte Anpassungen vorgenommen und lese die aktuellen Werte mit meiner Wago SPS und dem HttpGet Befehl aus.
    Jetzt stehe ich aber vor dem Problem das ich an einem ESP vier Onewire Temperatursensoren Ds18b20 auslesen möchte. Deshalb habe ich schon viel im Netz gestöbert, aber irgendwie komme ich nicht weiter,vielleicht auch weil ich eigentlich Anfänger bin.
    Es gibt Scripte mit denen ich die Sensoren auslesen kann und per serieller Schnittstelle ausgeben kann, aber dann bekomme ich die Webserverfunktion nicht hin, oder ich finde Webserver und scheitere an den Onewire Sensoren.
    Kannst du mir vielleicht eine Hilfestellung geben wie dein Script anstatt mit dem DHT22 auf 4 Onewire Sensoren ausgeweitet werden kann. Du scheinst dich ja sehr gut mit der Materie auszudenken.
    Gruß Uwe

    Antworten
    1. ST Artikelautor

      Hab ich auch noch nicht gemacht. Ich vermute mal, dass Du die 4 Onewire Sensoren analog der folgenden Anleitung auf einem GPIO betreiben kannst:
      http://arduino-info.wikispaces.com/Brick-Temperature-DS18B20#mult

      Für den Rest brauchst Du ziemlich viele Änderungen. Das ist eine größere Operation.
      Zuerst in der Speicherverwaltung. Statt pfTemp und pfHum musst Du pfTemp1, 2, 3, 4 anlegen (oder einen 2 dim. Array). Die Rechnung zur möglichen Arraygröße ist ebenso anzupassen (2* float auf 4* float).
      Die Funktion Maketable muss so umgebaut werden, dass statt Temp & Humidity die 4 Temperaturen abgelegt werden. Ebenso muss Makelist umgebaut werden.
      In loop() müssen im Datalogging die 4 Temperaturen abgelegt werden.
      In loop() müssen die html Codes für das Google Chart Objekt für die 4 Temperaturen angepasst werden. Selbiges für die Anzeige der Tabelle sowie für die Grafik.

      Gruss Stefan

      Antworten
      1. Uwe

        Hallo
        Danke für deine Antwort. Dann scheint es ja doch eine größere Baustelle zu werden. Da ich Anfänger bin glaube das ist für mich dann doch etwas zu viel ist.
        Aber trotzdem Danke für deine Bemühungen.

        Antworten
  38. Bob

    Hallo,

    Erstmal Danke für die Bereitstellung und die vielen Infos!
    Ich habe das Projekt als Ausgangsbasis benutzt, im Laufe der Zeit hat sich aber einiges geändert. Zum Beispiel nutze ich die ESP8266WebServer Funktionen und splitte die Tabelle nicht auf.
    Das verwendete Modul ist ein ESP-ADC von InCircuit. SDK 1.5.1_16_01_08
    Das funktioniert auch alles wunderbar bis auf eine „Kleinigkeit“:

    Ich lade die Seite per Browser refresh automatisch neu. Dazu die Zeile

    im Html-header hinzufügen.

    Das klappt etliche Male ganz gut bis die Seite „hängt“.
    Am debug Ausgang habe ich dann die Meldungen

    :wr
    :sent 117
    :ww
    :wr
    :sent 1460
    :ww
    :wr
    :sent 1460
    :ww
    :wr
    :er -8 1460 1
    :ww
    :ur 1
    WS:dis
    :del

    Ich konnte das soweit verfolgen dass es mit der lib-Funktion tcp_output() zu tun hat, mehr leider nicht.
    Tiefer in die libs komme ich auch nicht zum debuggen :/

    Verschiedene sketches, verschiedene sdk, dieses Problem blieb immer 🙁
    Auto-Refresh per Javascript führt zum exakt gleichen Verhalten.
    Hat das mit dem Auto-Refresh schon jemand probiert?
    Kann es an dem verwendeten Modul liegen?
    Gibt es da andere Möglichkeiten?
    Eine Seite zum Browser zu senden wäre für mein Projekt das Beste, aber das ist im http-Protokoll meines Wissens ja nicht vorgesehen/möglich.

    Viele Grüße,
    Bob

    Antworten
  39. dolderan

    Hallo Freunde,
    ich habe mit sehr großem Interrese das Thema angeschaut:

    Habe aber eine andere Frage, es betrifft aber den selben DHT22 Sensor. Der Sensor nach der Zeitumstellung zeigt bei mir -2 Stunden.
    Nach langer Suche im Internet hab ich aber keine passende Lösung gefunden. Habe schon den Zeitserver umgestält… hat nicht geholfen…

    Hat jemand vielleicht eine Lösung, wie kann man die Zeit richtig anpassen?
    Danke voraus

    Antworten
    1. ST Artikelautor

      Die Zeit im Code ist UTC. Wenn Du die mitteleuropäische Zeit willst, schau einfach mal nach C++ Code Beispielen, die von UTC auf MEZ/MESZ umrechnen oder nimm 2h im Sommer und 1h im Winter.

      Gruss Stefan

      Antworten
      1. Blub

        Ah okay ! Danke, hab nichts dazu gefunden.. Ziemlich schwer bei so einem Makronamen die google Suche ordentlich zu füttern 🙂

        Antworten
  40. Willi

    Hallo Stefan,
    beim kompilieren deines Codes, taucht bei mir folgende Fehlermeldung auf :
    ESP_TH_Logger.ino : 12:22; fatal error: time_ntp.h : No such file or Directory
    compilation terminated.
    Fehler beim Kompilieren

    Da ich absoluter Neuling bin, kann ich mit der Fehlermeldung nicht viel anfangen…was mache ich falsch?

    Gruß Willi

    Antworten
      1. Willi

        Hallo Stefan,

        ich habe alles richtig installiert und überprüft. Ich habe mal den Webserver als Accesspoint, die Funk und WLAN-Markisensteuerung und Stabiler HTTP 1.1 WLAN Webserver runtergeladen und kompiliert…alles ohne Fehlermeldung und es funktioniert einwandfrei!

        Gruß Willi

        Antworten
  41. ST

    Hallo Willi,

    gut, dann können wir das ausschließen. Hast Du denn alle im heruntergeladenen Archiv vorhandenen Dateien inklusive time_ntp.h sowie time_ntp.cpp zusammen mit der ESP_TH_Logger.ino in ein gemeinsames Verzeichnis gepackt? – Wenn Du dann die .ino öffnest, sollten 3 Dateien als Tabs in der Arduino IDE angezeigt werden.

    Gruss Stefan

    Antworten
    1. Willi

      Hallo Stefan,
      ich hatte nicht alles im gemeinsamen Verzeichnis gepackt, das war der Fehler! Ich bedanke mich recht herzlich…und vielen Dank für deine Mühe!

      Gruß Willi

      Antworten
  42. Peppi

    Hallo Stefan,

    vielen Dank für Deine Arbeit.
    Ich hatte ein Problem beim compileren
    Es kam die Fehlermeldung
    WiFStart not defined.
    Ich habe dann die void WiFiStart() über WiFiStart kopiert und dann ging alles.
    Arduino 1.6.7 war der compiler.
    Normal so?
    Gruß und vielen Dank,
    Peppi

    Antworten
    1. ST Artikelautor

      Hi Peppi,

      eigentlich sollten Prädeklarationen bei der Arduino IDE nicht nötig sein. In C/C++ braucht man sie hingegen. Das dürfte ein Bug in der Arduino IDE, genauer im Präprozessor sein. Den Bugfix hast Du jedenfalls richtig umgesetzt.

      Gruss Stefan

      Antworten
  43. Peppi

    Ach, und nochwas,
    der WLAN Logger für Lufttemperatur und Feuchtigkeit geht nur füe Sekunden,
    dann bekomme ich nur „leere“ angezeigt.

    Antworten
    1. Peppi

      Es liegt an einen verlorenem Signal des DHT. Wenn in der Tabellenansicht ein „non“ auftaucht, geht die Grafik nicht mehr.

      Antworten
      1. ST Artikelautor

        Der Code fängt Übertragungsfehler nicht ab. Da kommt dann ein NaN Eintrag. Ggf mal die Verkabelung prüfen oder den NaN String rausfiltern.

        Gruss Stefan

        Antworten
  44. Rainer

    Hallo Stefan,
    vielen Dank für die tolle Arbeit. Ich habe einen DHT22 verwendet und nichts geändert. Die Grafik wird manchmal kurz angezeigt und gefällt mir sehr. Könntest du wenn die Zeit es dir erlaubt einen nan Filter einbauen?

    Gruß Rainer

    Antworten
    1. ST Artikelautor

      Hallo Rainer,

      prima dass es Dir gefällt. Prüfe mal Deine Verkabelung. Die NaNs kommen eigentlich von Wackelkontakten. Ein NaN Filter sollte eigentlich mit einem Stringvergleich machbar sein. Wenn ich mal dazu komme, poste ich eine Lösung.

      Gruss Stefan

      Antworten
      1. Jim

        Hallo,
        hatte auch das Problem ab und zu nan, habe es so gelöst:

        float hum_ = 0.0;
        float temp_ = 0.0;
        byte retry = 3;

        // Retry to get valid Data
        do{
        hum_ = dht.readHumidity();
        temp_ = dht.readTemperature();
        retry–;
        } while( ((isnan(hum_))||(isnan(temp_)) && (retry > 0)) );

        pfHum[ulMeasCount%ulNoMeasValues] = hum_; // dht.readHumidity();
        pfTemp[ulMeasCount%ulNoMeasValues] = temp_ ; //dht.readTemperature();

        VG Jim

        Antworten
          1. ST Artikelautor

            So kann man die NaNs abfangen. Das ist gut. Allerdings sind die NaNs auch ein Hinweis auf ein Kontaktproblem auf der Datenleitung.

            Gruss Stefan

          2. Friedhelm

            Entweder verstehe ich etwas nicht, oder mein Monitor gibt etwas undeutlich wider:
            „bei retry–; wurde aus dem — beim Kopieren ein -, es muss natürlich — sein“
            Ich gehe davon aus, dass es sich um ein decrement handelt, also 2 x minus, oder?

      2. Florian

        Hallo Stefan,

        ich bin begeistert von diesem Programm, man kann sehr viel davon lernen! Ich hatte es schonmal vor einiger Zeit mit einem NodeMCU und DHT11 ausprobiert und gelegentlich nan Werte bekommen, das war nicht weiter schlimm.
        Jetzt habe ich mich nochmal damit beschäftigt und es auf einen ESP-12 mit DHT11 aufgespielt und bekomme ausschließlich nan Werte (Den NodeMCU habe ich leider nicht mehr da sonst würde ich natürlich schauen ob es dort noch geht). An der Verkabelung kann es meiner Meinung nicht liegen da der Beispiel Sketch von Adafruit problemlos läuft und bei jeder Messung einen Wert liefert (ich habe gerade wild hin und her geflasht ohne die Verkabelung auch nur zu berühren).
        Ich habe am Sketch nichts verändert ausser den Zugangsdaten und gerade eben auch nochmal frisch runtergeladen um ganz sicher zu gehen.
        Hast du eine Idee warum es nicht mehr funktioniert? Wurde an der Adafruit DHT library etwas geändert, so dass der Code nicht mehr kompatibel ist? Vielen Dank!

        Antworten
  45. Andre

    Hallo Stefan,
    das ist echt eine klasse Arbeit.
    Leider habe ich ein Problem und eine Frage.
    Zuerst zum Problem, ich habe bereits mehrere NTP getestet aber ich habe immer zwei Stunden Zeitversatz also wenn es 9:00Uhr ist zeigt das Programm 7:00Uhr.

    Und die Frage ist ob es die Möglichkeit gibt die Daten weiter zu vearbeiten und in eine Datei auf meinen Server zu legen zu Langzeitarchivierung?

    Mfg
    Andre

    Antworten
    1. ST Artikelautor

      Hallo Andre,

      es ist auch völlig korrekt, dass Du diese 2h Differenz siehst. Die NTP Server liefern UTC und nicht die mitteleuropäische Sommerzeit. Man kann das umrechnen. Es gibt dazu auch eine fertige Lib:
      https://github.com/JChristensen/Timezone
      Du musst allerdings beachten, dass diese Lib die vergangenen Sekunden seit dem 1.1.1970 rechnet und der Code hier vom 1.1.2000 ausgeht. Im NTP Code findest Du die entsprechende Differenz. Es wird auch bald ein Projekt geben, das diese Umrechnung enthält (dauert aber noch 6 Wo).

      Bzgl Daten auf Server: Du könntest von dem Server aus per chron-Job einfach einmal am Tag die html Seite mit den Werten per wget ziehen.

      Gruss Stefan

      Antworten
    2. Jim

      Hallo Andre,

      um die MESZ zu erhalten habe ich einfach die +2h zur aktuellen Zeit hin zugezählt.
      in time_ntp.h:
      //// you may change here
      #define TIME_ZONE MESZ // Set TimeZone (Offset to UTC)

      //// do NOT change below
      #define MESZ H2MS(2) // UTC +2h
      #define MEZ H2MS(1) // UTC +1h
      #define H2MS(x) (x*3600UL) // Hour to seconds

      in time_ntp.cpp in Funktion unsigned long getNTPTimestamp() die letzte Zeile hinzugefügt:

      // combine the four bytes (two words) into a long integer
      // this is NTP time (seconds since Jan 1 1900):
      ulSecs2000 = highWord << 16 | lowWord;
      ulSecs2000 -= 2208988800UL; // go from 1900 to 1970
      ulSecs2000 -= 946684800UL; // go from 1970 to 2000
      /* ADDED*/ ulSecs2000 += TIME_ZONE; // TimeZone Offset to UTC

      Nachteil: Du musst selbst zw. Sommer- und Winterzeit umschalten ;(

      Antworten
      1. ST Artikelautor

        Man kann das auch mit der timezone Lib lösen: https://github.com/JChristensen/Timezone
        #include
        TimeChangeRule CEST = {„CEST“, Last, Sun, Mar, 2, 120}; //Central European Summer Time
        TimeChangeRule CET = {„CET „, Last, Sun, Oct, 3, 60}; //Central European Standard Time
        Timezone CE(CEST, CET);

        Auf die NTP Zeit 946684800UL addieren, damit sie auf 1970 referenziert (und nicht auf 2000):
        CE.toLocal(t+946684800UL)

        Gruss Stefan

        Antworten
        1. lui

          Hallo Stefan,

          Tolles Projekt, Danke, habe fast alles sofort hinbekommen, etwas modifiziert aber
          komme jetzt nicht mehr mit, kannst du den Sourcecode mit der timezone Lib zur Verfügung stellen, wo müssen diese Zeilen eingefügt werden ?

          Gruss Lui

          Antworten
  46. Jim

    Hallo Stefan,

    super Projekt! Vielen Dank!
    Mein erstes PJ mit ESP8266. Ich habe schon einige Änderungen (und Bugfixes) vorgenommen, von denen ich gesondert noch berichten werde. Aber ich habe das Problem, dass der Graph nach einigen Stunden Laufzeit nicht mehr angezeigt wird. Die Startseite und Tabelle sind ok. Um auszuschließen, dass ich den Fehler selbst eingebaut habe, teste ich gerade dein original-Code, aber das Problem ist weiterhin da.

    Hast Du dass auch bei Dir beobachtet oder woran könnte es liegen?

    Schöne Grüße
    Jim

    (PS: Liste und Code mit Änderungen und BugFixes folgt)

    Antworten
  47. Thomas

    Hallo Stefan,
    vielen, vielen Dank für dieses Projekt.
    Wenn ich bedenke wieviel Zeit und Geld ich verschwendet habe um was in der Art aufzuziehen.
    Ich habe erst mit einem Ethernet shield enc28j60 das ich nicht ans laufen bekommen habe.
    Irgendwann habe ich herausgefunden dass der verwendete Arduino nicht genügend Strom liefert.
    Dann habe ich ein Ethernet Shield mit Wiznet Chip genommen, der ist genügsamer. Dann nächstes Problem, ich wollte die Temperatur und Luftfeuchtigkeit im Keller messen da wir da Wäsche Trocknen und ich überwachen wollte wann das Klime Schimmelfreundlich wird. Aber kein Netzwerkkabel im Keller.
    Also das Ethernet Shield auf einen WLAN Repeater mit Netzwerkdose geschliffen. Läuft, aber riese Apperatur, viel Lehrgeld bezahlt, und jetzt kommst Du und zeigst mir dass man alles das für ca. 3 Euro in Miniatutur aufbauen kann. Spitzenklasse, Danke 🙂

    Gruß

    Thomas

    Antworten
  48. Jochen

    Super Sketch ! 😉
    Probleme mit DHT11 regelmässige Daten kommen immer wieder NAN Daten
    auch so ! 🙁
    do{
    delay(3000);
    pfHum[ulMeasCount%ulNoMeasValues] = dht.readHumidity();
    delay(3000);
    pfTemp[ulMeasCount%ulNoMeasValues] = dht.readTemperature();
    retry– ;
    } while( ((isnan(pfTemp[ulMeasCount%ulNoMeasValues]))||(isnan(pfHum[ulMeasCount%ulNoMeasValues])) && (retry > 0)) );

    Hostname setzen

    wifi_station_set_hostname( „wetterstation“ );
    vor der Zeile
    WiFi.begin(ssid, password);

    Antworten
  49. Friedhelm Stroinski

    Hallo und besten Dank für diese sehr übersichtliche und informative Arbeit.
    Ich habe versucht (und letztlich ist es mir auch gelungen) den Sketch mit WeMos D1 R2 und DHT22 auszuführen.
    Lange Zeit konnte ich zwar über die IP das Projekt aufrufen, aber ich bekam keine Messwerte! Auch mit dem Oszi war nichts zu sehen.
    Mit Arduino UNO und entsprechendem Sketch habe ich nachgewiesen, dass der Sensor in Ordnung ist.
    Lange Rede kurzer Sinn, eine „Kleinigkeit“ hat das Problem gelöst:
    WeMos D1 R2 akzeptiert die Pinbezeichnung „2“ nicht, es muss heissen: „D2“!
    Friedhelm

    Antworten
    1. ST Artikelautor

      Hi Friedhelm,

      D2 ist irgendwo per #define auf 5 gelegt. Vermutlich ist bei dem Wemos die GPIO Bezeichnung anders.

      Gruss Stefan

      Antworten
      1. Friedhelm Stroinski

        Nach einem Tag Erfahrung:
        # Anzeige funktioniert auch über Stunden
        # Liste funktioniert auch über Stunden
        # Grafk bricht nach Stunden ab.

        Info:
        D2 = GPIO4

        Antworten
        1. ST Artikelautor

          Du hast vermutlich NaN Einträge in der Liste. Dort bricht dann die Grafik ab. Verlöte mal die Kontakte oder versuche die NaN (=Lesefehler) rauszufiltern.

          Antworten
  50. Peter

    Hallo Stefan

    Alles läuft bestens.
    Die NAN Einträge verändern sich bei mir sporadisch, wenn der code geändert wird. Deswegen filtere ich sie heraus.
    Ich würde gerne die gespeicherten Daten, aus der Tabelle, am PC in einer Grafik anzeigen. Die neuen Werte sollten automatisiert beim Starten des PC übernommen werden.
    Welche Möglichkeiten bestehen da?

    Gruß
    Peter

    Antworten
  51. Robin

    Hallo Stefan,

    in erster Linie: Ich ziehe den Hut vor deiner Leistung. Wahnsinn, was du mit dem kleinen ESP alles anstellst.

    Die Verwendung von JavaScript ist genial, da der Code ja m.W. nur im Browser ausgeführt wird, also vom Endgerät abhängig ist, das in 99,9% der Fälle leistungstechnisch besser dasteht als der ESP.

    In deinem Code sehe ich, das du die Grafikbibliothek bei jedem Websiteaufruf direkt von Google herunterlädst. Wäre es denn grundsätzlich auch möglich, das JavaScript im Programmspeicher abzulegen?
    Ich bin in Sachen HTML&Co. leider nicht im Thema, weiß aber, das es diverse kleine und große Helferlein gibt, welche eine Website um tolle Funktionen ergänzen können.

    Gruß,
    Robin

    Antworten
    1. ST Artikelautor

      Hallo Robin,

      Besten Dank. Du kannst natürlich den Javacode auch direkt auf dem Esp hinterlegen. Das kannst Du so realisieren wie hier gezeigt, aber irgendwann wird das so unübersichtlich. Es gibt auch eine rudimentäre Datenverwaltung für den Flash Speicher. Damit könnte man prinzipiell auch Esp Programmcode vom html / Java trennen. Es gibt auch Versuche auf github.com einen klassischen Webserver zu realisieren, der genau das tut.
      Letztlich musst Du den Ansatz daran orientieren, was Du erreichen willst.

      Gruss Stefan

      Antworten
      1. Robin

        Meine Idee wäre diese gewesen:
        – JS-Quellcode in eine externe Datei und diese, ähnlich einer Bibliothek, inkludieren
        – Quellcode ähnlich gestalten, wie dein HTML- Aufbau (String +=Qullcode, für jede Zeile)
        -String im Anschluss in den HTML-Teil übergeben. ( String )

        Könnte das klappen? Idee dahinter ist, das nicht jeder JavaScript Quellcode überall und immer Online abrufbar ist.

        Antworten
        1. ST Artikelautor

          Kannst Du machen. Es gibt Seiten im Netz, mit denen Du Dir automatisch eine Datei als c-Code Escape Sequenz umsetzen lassen kannst. Das geht natürlich auch per Hand, ist aber sehr nervig. Das Ergebnis bindest Du ein. Und schon hast Du den benötigten Java Code als Array vorliegen. Musst dann nur noch bei der passenden URL (=Zugriff auf den Java Code) den Array ausgeben.

          Gruss Stefan

          Antworten
    1. ST Artikelautor

      Hallo Lars,

      Schau mal die vorhergehenden Kommentare an. Wenn Du NaNs in der Liste hast, dann bricht die Grafik ab. NaNs kommen meistens von Verkabelung mit Wackelkontakt. Manche Sensoren scheinen es auch hervorzurufen. In diesem Fall die NaNs herausfiltern.

      Gruss Stefan

      Antworten
  52. Veselin Angelov

    Hallo.
    Ich bin aus Bulgarien.
    Ich verstehe nicht Deutsch und daher mit diesem Beitrag wird dazu beitragen mit Google Übersetzer helfen.
    Der Code funktioniert auf NodeMCU ESP8266 12E Version 1.0.
    Ich brauche 3 Fragen helfen:

    1. Wie die Zeit einzustellen für Bulgarien gültig sein (UTC+3 Uhr)?

    2. Wie gebe ich Daten konsistent für Zeit, Temperatur und Luftfeuchtigkeit in der MySQL-Datenbank, die auf einem anderen Computer auf dem gleichen lokalen Netzwerk befindet?

    3. Was und wo Code Messwerte hinzugefügt werden sollte zu ermöglichen (keine Zeit) auf dem LCD-Display angezeigt werden – Modell: DF Robot 0009 – Key Pad Shield für Arduino?

    Es wird kein Problem sein, wenn ich in Englisch, Russisch oder Deutsch antworten. Ihrer Wahl.

    Ich hoffe, dass Sie nicht zu viel belästigt werden, und ich bin sehr dankbar für ihre Hilfe und Unterstützung.

    Bitte informieren Sie mich auch eine E-Mail, die Sie die Möglichkeit, die Zeit zu meinem Problem zu nehmen.

    Mit freundlichen Grüßen und Grüße: Veselin Angelov

    Antworten
    1. ST Artikelautor

      Hi Veselin,

      hope you can do English because the auto-translations make it more difficult. To your questions:

      1. The clock is UTC. To get to local time, have a look at the following lib: https://github.com/JChristensen/Timezone
      Keep in mind that this lib relates seconds elapsed from 1.1.1970 whereas the NTP code here references to 1.1.2000. The NTP code contains the respective delta seconds. I have used that successfully on a ESP8266. In case you fail, I can send you code that I want to publish in a few weeks.

      2. MySQL – have never tried that practically, but it should not be more than calling a correctly formatted URL in the local net. There is some sample-code above for creating a message via pushingbox. That is exactly the code your need. Look up for my post that contains the sendToPushingBox method.

      3. Display – never used that board ut similar ones on Arduino. They take a lot of GPIOs to run. Would not try that. Consider an adapted version that works via I2C. Google e.g. for „hitachi 44780 i2c“. There are samples on the web for adding such a display to an ESP8266.

      Good luck
      Stefan

      Antworten
  53. Stefan K

    Sehr gutes Projekt, toll gemacht. Danke dafür.
    Was mich reizen würde, wenn die „Gauge“ Live-Werte anzeigen würde. Den Code dafür könnte man
    Spifffs mäßig im Filesystem ablegen. Dazu ist so eine Anzeige ja eig. da.

    Mit freundlichen Grüßen, und weiter so…

    Antworten
  54. Jörg B

    Um die NAN Werte auszufiltern, reicht es die gelesenen Werte auf NAN zu testen.
    Sofern ein NAN aufrtitt schreibt mein Code den vorherigen gültigen Wert ins Array.

    Als globale Variablen:
    float dhth_old, dhtt_old;

    in void loop():
    …..
    float dhth = dht.readHumidity();
    if (isnan(dhth))
    {
    pfHum[ulMeasCount % ulNoMeasValues] = dhth_old;
    Serial.print(„DHTH Error „);
    }
    else
    {
    dhth_old = dhth;
    pfHum[ulMeasCount % ulNoMeasValues] = dhth;
    }
    float dhtt = dht.readTemperature();
    if (isnan(dhtt))
    {
    pfTemp[ulMeasCount % ulNoMeasValues] = dhtt_old;
    Serial.print(„DHTT Error „);
    }
    else
    {
    dhtt_old = dhtt;
    pfTemp[ulMeasCount % ulNoMeasValues] = dhtt;
    }
    …..

    Antworten
  55. Markus Karl

    Danke für die tolle Vorlage.

    Drei Tips wie die Grafik schneller lädt:
    1. immer ca. 1400 Zeichen schicken (payload des TCP Packets = 1460) Damit werden es weniger Packete.
    2. client.setTimeout(0); zu Beginn der Übertragung der Daten. Dann schickt der ESP die Packete direkt raus ohne 200-400 ms auf ein ACK zu warten das nie kommt.
    3. Nicht mehr Daten schicken als die Grafik breit ist. Bei 600px Bildbreite macht es keinen Sinn 1000 Werte zu schicken.

    Allein mit den Punkten 1 & 2 habe ich die Ladezeit auf ca. 4 Sekunden bekommen.

    Antworten
  56. Markus Karl

    Nachtrag:
    die Abweichungen der Feuchtemessungen bei meinem SHT25 Sensor waren auch zeimlich groß. Die Messerte waren nicht konstant, sondern rauschten um ca. 2%. Der Abstand zum ESP von 15cm reichte nicht.

    Abhilfe: Messen wenn nicht gesendet wird.
    Was passiert? Entweder der Sensor wandelt asynchron und übermittelt bei Abfrage den letzten Wert oder der ESP überträgt bei der Abfrage des Sensors im Hintergrund noch ein WLAN Paket.

    Lösung: 50ms Delay direkt vor der Abfrage des Sensors. Jetzt habe ich eine super reproduzierbare Messung und kann den Sensor auch direkt auf dem ESP platzieren. (Sollte man nicht machen wegen der Abwärme 🙂
    Jetzt kann ich die Dinger endlich in meine Unterputz Dosen einbauen :-)))

    Antworten
  57. Heiko

    hallo, der webserver läuft ja auf port 80,
    meine frage ist kann ich auch einen anderen nehmen z.bsp. 95 oder geht das nicht ?
    MFG

    Antworten
  58. Boris

    Ein super Projekt.
    Hätte da nur 2 Fragen dazu:
    1.) Ist es möglich eine Statische IP zu vergeben? Wenn ja wie mache ich das?
    2.) Das Ändern der Messzeiten verstehe ich nicht ganz. Ich würde gerne über 30 Tage alle 30 Minuten
    messen. Mit den Messungen die gespeichert werden können müsste es sich ausgehen. Nur kapiere ich
    irgendwie das ganze nicht. Bis jetzt nur soviel verstanden das man bei der Variable MEAS_SPAN_H die Stunden angibt. Bei 30 Tagen wären es 720 Stunden. Nur den Abstand zwischen den Messungen.

    Grüße
    Boris

    Antworten
    1. ST Artikelautor

      Hallo Boris,

      zu Deinen Fragen:
      1. Eine statische IP ist möglich; das musst Du aber über Deinen Router steuern. Wie das geht, hängt von Deinem Router ab. Bei den Fritzboxen kann man bei einem Netzwerkgerät unter den Details „immer die gleiche IP Adresse zuweisen“ auswählen.
      Ich tippe mal darauf, dass Du einfach eine Möglichkeit suchst, auf den ESP zuzugreifen ohne immer mit einer anderen IP rechnen zu müssen. Man kann dem ESP auch sagen, dass er unter einem bestimmten Netzwerknamen erreichbar sein soll; ergänze einfach den Code wie folgt:

      WiFi.mode(WIFI_STA);
      WiFi.hostname("temphum");
      WiFiStart();
      

      Im Browser sollte jetzt unter temphum/ die Seite des ESP kommen.

      Zu 2.: Genau, 720h wären 30 Tage. Die Messungen würden dann ca. alle 25 Minuten erfolgen. Wenn es Dir wichtig ist, viele Daten abzulegen, nimm einen ESP12 und klemme eine SD Karte dran. Dann hast Du Speicher ohne Ende 😉 Der Seitenaufbau wird dann aber etwas komplexer.

      Gruss Stefan

      Antworten
      1. Harry

        Ich habe dies gemacht:
        IPAddress ip(192, 168, 0, 56);//statische ip
        IPAddress gateway(192, 168, 0, 1);
        IPAddress subnet(255, 255, 255, 0);

        und dann:
        // Connect to WiFi network
        Serial.println();
        Serial.println();
        Serial.print(„Connecting to „);
        Serial.println(ssid);
        WiFi.config(ip, gateway, subnet);//statische ip machen
        WiFi.begin(ssid, password);

        while (WiFi.status() != WL_CONNECTED)

        arbeitet nett…

        Antworten
        1. ST Artikelautor

          Hallo Harry,

          danke für den Code. Das geht aber nur, wenn Du am Router kein DHCP aktiviert hast. Für den geneigten Leser: Die Router kommen heutzutage alle mit DHCP als Standard und ich würde das auch empfehlen. Man kann DHCP ausschalten (und den Code so nehmen), muss dann aber für alle Netzwerkgeräte die IPs selbst zuweisen und verwalten.
          Einfacher ist es eigentlich DHCP anzulassen und nur die Geräte zu fixieren, die man unbedingt festlegen will. Das geht dann über das Menü des Routers.

          Gruss Stefan

          P.S.: Statische IP a la oben bei DHCP kann klappen. Wird aber irgendwann schief gehen. Spätestens dann, wenn der Router die IP schon vergeben hat und der ESP sie dann statisch nehmen will…

          Antworten
          1. Harry

            Meine Router ist auf DHCP. Das erste Mal lass ich ihn sagen was das IP sein kann. Danach mache ich das im Sketch als festes IP. Und wenn der Router wieder eine IP benoetigt, weiss er dass diese belegt ist..

        2. Paul

          hallo,
          schönes projekt, aber wohl zu kompliziert für mich. Die Rundinstrumente haben mir so gut gefallen…….

          Die Anzeige funktioniert! aber laut „Tabelle“ sind ca 2/3 der Messungen fehlerhaft was zu diesem NAN führt…. damit geht dann natürlich die „Grafik“ nicht…. und die Zeit ist auch falsch.

          das Filtern von diesem NAN funktioniert leider auch nicht, weil dann praktisch nichts gelogt wird. Scheitert bei mir wohl daran “ stray ‚\342‘ in program“ wenn ich diesen Filter mit dem“ retry-“ einfüge

          ich benutze den DHT11, hab ich auch so eingestellt

          Antworten
          1. ST Artikelautor

            Hallo Paul,

            wenn Du dauernd NaNs bekommst bzw das Filtern zu dauerndem Filtern führt, dann hast Du vermutlich ein Kontaktproblem. Das stray Problem entsteht, wenn Du teils auch nicht sichtbare Sonderzeichen mit rein-paste-st. Versuche dann den Code selbst einzutippen.

            Gruss Stefan

  59. ronny

    Hallo

    bei mir hat es auf Anhieb geklappt mit den scatch.

    Nur habe ich ein Problem meine feuchte hat immer 1 Prozent.

    Habe auch einen zweiten Sensor getestet. Das gleiche Problem.

    dth21 habe ich am laufen.

    Mag ronny

    Antworten
  60. ST

    Hallo Ronny,

    keine Ahnung, woher die 1% Werte kommen. Ich würde folgendes probieren:
    – Sensor als Vergleich an einem Arduino betreiben
    – Den #define für den Sensor Typ verändern.
    – In der Arduino IDE prüfen, ob es ein Update für die Sensor Lib gibt.

    Gruss Stefan

    Antworten
    1. Ronny

      Hallo gestern Abend habe ich nochmal getestet mit ein Nano das gleiche. Habe mal ein anderen bestellt.
      Dht11 der geht.

      Da hat wer was von ein Delay vor den erfassen der Werte geschrieben. Blicke da noch nicht ganz durch.

      Kannst du mir mal nennen kleinen Tipp geben wo das ungefähr liegt.

      Ich versuche auch die Daten in einer mysql Datenbank zu schreiben.

      https://glaskugelsehen.wordpress.com/2014/05/15/tutorial-speicherung-von-arduino-messdaten-auf-webserver-und-deren-darstellung-teil-3/

      Mfg ronny

      PS. Super tutorial hier.

      Antworten
  61. Jürgen

    Lieber Stefan,
    vorweg vielen Dank für deine Großzügigkeit, mit der du dein Können und Wissen zur Verfügung stellst.
    Sowohl „ESP_TH_LOGGER V2“ als auch „Accesspoint“ laufen schon über Tage. Nun habe ich versucht den „LOGGER“ als Accesspoint umbzubauen. Das läuft zwar, aber die NTP_zeit funktioniert nicht mehr.
    Meine Frage (Bitte): Kann der ESP als Accesspoint die NTP-Zeit beziehen?
    Vielen Dank
    Jürgen

    Antworten
  62. C. Stangl

    Hallo Hr. Thesen,
    schönes Projekt.
    Läuft bei mir auch Problemlos, verwende jedoch keinen entsprechenden Sensor (DummyWerte).
    Es sollen drei DS18B20 zum Einsatz kommen, also 3x diese schöne Grafik,muss ich entsprechend umbasteln.
    Mal sehen ob ich das schaffe (absoluter Anfänger :-))
    Meine Werte RAM-7472, Datenpunkte-3031, ist das gut oder schlecht?

    Was ich jedoch fragen möchte, bekommt man die Uhrzeit auf deutsche Zeit (Sommer/Winter)?
    Irgendwie paßt es aktuell im Winter nicht um eine Stunde, was bei UTC ja klar ist.

    Danke, weiter so 🙂

    Antworten
  63. C. Stangl

    Hallo Hr. Thesen,
    das funktioniert so weit.
    Ist eine automatische Umstellung Sommer/Winter auch möglich?
    Danke.

    ///////////////////////////////
    // connect to NTP and get time
    ///////////////////////////////
    ulSecs2000_timer=getNTPTimestamp();

    ulSecs2000_timer += 3600; // Winterzeit
    //ulSecs2000_timer += 3600*2; // Sommerzeit

    Serial.print(„Current Time UTC from NTP server: “ );
    Serial.println(epoch_to_string(ulSecs2000_timer).c_str());

    ulSecs2000_timer -= millis()/1000; // keep distance to millis() counter

    Antworten
  64. ronny

    Hallo

    bei mir hat es auf Anhieb geklappt mit den scatch.

    Nur habe ich ein Problem meine feuchte hat immer 1 Prozent.

    Habe auch einen zweiten Sensor getestet. Das gleiche Problem.

    dth21 habe ich am laufen.

    Mag ronny

    Antworten
  65. Rarebit

    Hallo,
    erstmal danke für diesen Hilfe.
    Allerdings habe ich das Problem, ich kann mit dem Browser nicht verbinden.
    Vom Router wird das ESP angezeigt, aber ich bekomme immer eine Zeitüberschreitung…

    Kann wer was dazu sagen?

    Grüße.

    Antworten
  66. Harald Nusser

    Tolles Projekt und gut beschrieben. Leider bekomme ich auch keine Werte. Deshalb die Fragen:
    Datenleitung an D4 = GPIO2 richtig (nodemcu 1.0)?
    Die tollen Rundinstrumente verschwinden nach dem ersten Aufruf- hängt das mit den Null-Werten zusammen?
    Danke und mach weiter so!
    Grüße
    Harald

    Antworten
    1. Harald Nusser

      Jetzt geht’s. Wackler in der Stromversorgung, und bei nan-Werten will die Grafik dann auch nicht mehr. Danke noch einmal für die Anleitung!
      Gruß
      Harald

      Antworten
  67. Hendrik

    Hallo Stefan,

    klasse Implementierung von dem Sensor und auch die Umsetzung mit den google api’s!
    Ich würde gerne die Daten in excel weiterverarbeiten, siehst du da eine möglichkeit die Daten als Tabelle zu ziehen/bereitzustellen?

    Gruß

    Hendrik

    Antworten
  68. Tom

    Super Projekt, sauber programmiert!
    Eine simple (Behelfs-)Lösung für das Update der 1. Website mit den Anzeigen könnte auch ein
    ……
    sein, der Wert ’29‘ wird dann anhand
    sResponse +=ulMeasDelta_ms/1000
    in den Html-Code generiert: Ohne zusätzliche URL wird damit die aktuelle Website periodisch neu geladen.
    Habe ich geklaut bei: http://esp8266.fancon.cz/esp8266-web-hygrometer-dht11-arduino/esp8266-web-hygrometer-dht11-arduino.html
    Siehe auch: https://en.wikipedia.org/wiki/Meta_refresh
    Dies ist allerdings kein Ersatz für ein gezieltes Update, da die Zeiten (Update des Servers und Update der Website) auseinanderlaufen, aber es erfüllt seinen Zweck.
    Gruß Tom

    Antworten
  69. Tom

    Super Projekt, sauber programmiert!
    Eine simple (Behelfs-)Lösung für das Update der 1. Website mit den Anzeigen könnte auch ein
    …<head><meta http-equiv=“refresh“ content=“29″><title>…
    sein, der Wert ’29‘ wird dann anhand
    sResponse +=ulMeasDelta_ms/1000
    in den Html-Code generiert: Ohne zusätzliche URL wird damit die aktuelle Website periodisch neu geladen.
    Habe ich geklaut bei: http://esp8266.fancon.cz/esp8266-web-hygrometer-dht11-arduino/esp8266-web-hygrometer-dht11-arduino.html
    Siehe auch: https://en.wikipedia.org/wiki/Meta_refresh
    Dies ist allerdings kein Ersatz für ein gezieltes Update, da die Zeiten (Update des Servers und Update der Website) auseinanderlaufen, aber es erfüllt seinen Zweck.
    Gruß Tom
    (Korrigierte Fassung)

    Antworten
  70. Friedhelm

    Ich habe 2 Messungen mit je ESP8266-01 und DS18B20 in Betrieb.
    1. Messung läuft seit x Monaten
    2. Messung läuft seit x Wochen
    Die 1. Messung zeigt jetzt (seit wann?) ein total falsches Datum und eine verkehrte Zeit an.
    Die 2. Messung zeigt korrektes Datum und korrekte Zeit an.
    Wer kennt dieses Verhalten?

    Antworten
  71. Petra

    Hallo

    ich bin sehr traurig. Nach 7 Wochen warten auf den DHT22 liefert dieser falsche Hygrometer-Werte. Sie sind um runde 50% zu niedrig. Ebenfalls unter reinen Arduino Uno und anderen DHT22 Bibliotheken.

    @Friedhelm
    Lade doch mal deinen Code auf PasteBin dann kann ich es auch ausprobieren. DS18B20 habe ich welche hier.

    Liebe Grüße
    Petra

    Antworten
  72. Petra

    Wenn man alle Serial Print und das Serial Beginn auskommentiert, gibt es ein klein wenig mehr freien RAM für mehr Daten.

    Diese Zeile enthält einen Bug
    sResponse = F(„Aufrufzähler=“);

    Muss heißen
    sResponse = F(„Aufrufzähler=“);

    Das integrieren von Timezone ist mir zu kompliziert. Das Beispielscript hat keine Ähnlichkeit mit der Zeitfunktion beim Temp-Feuchte Sensor-Script. Gibt es vielleicht einen fertigen Internet Timeserver der nur die Deutsche Zeit ausgibt und nicht diesen UTC Müll?

    Antworten
    1. ST Artikelautor

      Hallo Petra,

      die beiden von Dir angegebenen Codezeilen sind gleich. Im Code steht:

        sResponse  = F("<FONT SIZE=-2><BR>Aufrufz&auml;hler="); 
      

      Scheint korrekt zu sein.

      Mit den Serial.print Kommandos kannst Du etwas RAM sparen. Auch hier könnte man das F Macro nutzen, um die RAM Belastung zu senken.
      Timeserver mit deutscher Zeit gibt es meines Wissens nicht. Die Dinger sind per Standard auf UTC definiert.

      Gruss Stefan

      Antworten
    1. ST Artikelautor

      Hallo Petra,

      die FONT SIZE -2 macht den Footer kleiner (vgl. Screenshots oben). Wenn Du das Minus wegläßt, wird er größer. Ich wollte den Footer klein haben, daher mit Minus.

      Gruss Stefan

      Antworten
  73. Petra

    Super, ich habe das Script etwas umgeschrieben damit es mit HTU21D I²C Sensoren arbeitet und dazu noch eine kleine Sommer- Winterzeit Regel damit die Uhrzeit stimmt. Läuft prima auf einem ESP-01

    Interesse das Script per Email zu erhalten und als zusätzliche Variante hier zu veröffentlichen?

    Antworten
  74. Daniel

    Hallo Stefan,
    Danke für das zur Verfügung stellen all dieser Beispiele. Ich hatte bisher nur mit einer Sache Probleme: das mit dem WiFi.hostname(„myHostName“) will nicht funktionieren. Die Seite mittels IP-Adresse aufzurufen funktioniert bestens. Aber mit dem Hostname komme ich nicht weiter. Wenn ich im Firefox-Browser z.B. http://myHostName/ eingebe, dann kommt nicht die Seite des Webservers, sondern es wird eine Internetsuche gestartet für diesen Begriff.

    Muss man da sonst noch was beachten?

    Gruss,
    Daniel

    Antworten
    1. ST Artikelautor

      Hallo Daniel,

      Da es bei mir wunderbar klappt, lass uns mal jenseits des Esp suchen. Klappt es, andere Netzwerkgeräte mit dem Netzwerknamen zu erreichen?
      Es könnte auch am Router liegen. Ich hatte mal eine Easybox, die diesbezüglich eine wahre Katastrophe war.

      Gruss Stefan

      Antworten
      1. Daniel

        Hallo Stefan,
        das ging ja schnell, so spät am Abend!

        Also den Drucker kann ich z.B. Problemlos ansprechen. Der ist allerdings verkabelt, und nicht Wireless mit dem Router verbunden. Hier kommt möglicherweise meine etwas seltsame Routerkonfiguration ins Spiel: Ich habe zuerst einen Router vom ISP an der Adresse 192.168.1.1. Danach einen Wirelessrouter von D-Link (DIR-605L, an der Adresse 192.168.0.1) mit welchem ich mein WiFi-Netz erzeuge, in welches sich auch der ESP einlogt. Der ESP erhält per DHCP die Adresse 192.168.0.102. Meine Kenntnisse sind da leider sehr gering. Kann es sein, dass nur Adressen des ersten Routers erkannt werden? Aber dann würde das ja mit der IP-Adresse auch nicht klappen?

        Vielen Dank für Deine Hilfe!
        Daniel

        Antworten
  75. Friedhelm

    Hallo Stefan,

    am 02.03.2017 berichtete ich, dass eine Messung mit dem ESP8266-01 (Temperatur_aussen) seit einiger Zeit falsches Datum und falsche Uhrzeit liefert. Nun ist die Messung komplett ausgefallen.
    Interessant ist, dass auch die 2. Messung (Temperatur_innen), die bislang korrekte Werte lieferte, ebenfalls ausgefallen ist.
    Haben Sie irgendeine Idee / Vermutung?

    Gruß
    Friedhelm

    Antworten
    1. ST Artikelautor

      Hallo Friedhelm,

      Ist der Esp defekt oder der Sensor? Hast Du saubere 3.3V Spannung zur Versorgung genommen?

      Gruss Stefan

      Antworten
      1. Friedhelm

        Einer der beiden ESP arbeitet nach einem neuen Upload wieder einwandfrei. Den anderen habe ich ohne weitere Kontrolle ersetzt. Beide Sensoren sind ok. Ich denke, dass die 3,3 Volt sauber sind; sie werden aus 5 Volt mittels Step-Down Wandler gebildet.
        Ich kann aber einmal ein Oszi anschließen.

        Besten Dank, Gruß
        Friedhelm

        Antworten
        1. ST Artikelautor

          Hi Friedhelm,

          das Problem kenne ich nicht. Ich habe ESPs, die seit über einem Jahr laufen. Das Problem, dass sich ESPs im Betrieb selbst dauerhaft „erlegen“, hatte ich nur mit der lua Firmware (NodeMCU).

          Gruss Stefan

          Antworten
          1. Friedhelm

            Hallo Stefan,

            zur Info:
            # Ich arbeite mit der Arduino IDE
            # Ihre Frage zur Qualität der Spannungsversorgung:
            > 5 V mit Voltkraft USPS 600
            > 3,3 V mit AMS 1117 (Linear Regulators lt. Datenblatt, StepDown lt. Verkäufer)

            > Wechselspannungsanteil, sowohl bei 5 V wie auch bei 3,3 V,
            Sprung auf ca. 20 bis 25 mV, Sprung zurück auf ca. 10 mV,
            linear in ca. 0,9 ms auf 0.
            Messungen unbelastet, 22 Ohm, 10 Ohm.

            Also, Temperaturmessungen weiterlaufen lassen, abwarten und Tee trinken!
            Besten Dank, viele Grüße

            Friedhelm

          2. ST Artikelautor

            Dann liegt es wohl nicht an der Spannung. Komisch.
            Der AMS1117 ist übrigens definitiv ein linearer Regler.
            Könnte es sich um ein millis Rollover Problem handeln? – sind die Dinger zufällig immer nach 42 Tagen off? – Dann sollten sie allerdings auch nach einem Reset / Powercycle wieder laufen.

            Gruss Stefan

  76. Gerald

    Hallo Stefan,
    zunächst vielen Dank für dieses wunderbare Projekt! Da ich seit zig Jahren nicht mehr programmiert habe, ist das ein toller Einstig in die Sprache und ich kann ständig neue Tricks entdecken.
    Ich habe einige Umstellungen vorgenommen (Sommerzeit, Byte für Feuchte für mehr Datenpunkte, 4 Tage Messzeit). Läuft alles. Jetzt sieht nach allerhand Tagen Laufzeit die Startseite allerdings seltsam aus:
    „Temperatur & Feuchtigkeitsverlauf – Seiten laden länger:
    Grafik Tabelle

    Aufrufzähler=50 – Verbindungszähler=1 – Freies RAM=3160 – Max. Datenpunkte=4029
    Stefan Thesen 05/2015“

    Die beiden Grafiken fehlen, Überschrift und Hintergrundfarbe auch. Die links zur Grafik und Tabelle gehen aber.
    Bei einem externen Aufruf (Handy) geht die Seite gar nicht mehr.

    Woran kann das liegen?

    Andere Frage: woher kommen die leeren Aufrufe die mit stopping Client beendet werden? Für einen Bug im System sind die eigentlich zu sporadisch.

    Viele Grüße
    Gerald

    Antworten
    1. ST

      Hallo Gerald,

      vermutlich hast Du das NaN Problem, das weiter oben beschrieben ist. Kontakte können ein Thema sein. ggf NaNs im Code rausfiltern.
      Wenn Du die Seite von außerhalb des Hausnetzes sehen möchtest, müßtest Du Dich in die Theman DynDNS Services und Portforwarding einlesen. Generell sind Netzwerkgeräte im Hausnetz aus Sicherheitsgründen nicht aus dem Internet erreichbar. Das ist eine Basiseigenschaft aller Router.

      Gruss Stefan

      Antworten
      1. Gerald

        Hallo Stefan,
        vielen Dank soweit.
        Sorry, das hatte ich nicht erwähnt. Das NaN Filter hatte ich gleich zum Anfang eingebaut, da ich ohne Sensor gestartet habe. Wie hier oben beschrieben mit Nutzung der jeweils letzten vorhanden Daten bzw. 0 als ersten Wert.
        Der Zugriff von außen an sich ist über die Fritzbox geklärt. Wie gesagt, das Diagramm und die Tabelle kamen auch weiterhin, auch von außen, nur bei der Startseite gab es Probleme. Der ESP hatte sich auch nicht aufgehängt o.ä. Nach einem Reboot geht jetzt alles wieder ohne irgendeine Änderung. Ich würde das System aber gern für stabile Langzeitanwendungen einsetzen.
        Kann es sein, dass der Speicher bei vielen Aufrufen nicht sauber aufgeräumt wird? Damit habe ich keinerlei Erfahrung. Einige wenige Änderungen hatte ich ja vorgenommen.
        Viele Grüße
        Gerald

        Antworten
        1. ST Artikelautor

          Hallo Gerald,
          prima, dass es voran geht. Der Beitrag ist schon ein paar Tage her… Ich hatte nach Memory Leaks gesucht und würde das beim geposteten Code nicht als Ursache vermuten (ausschließen würde der geneigte Programmierer diese wohl nie 😉 ). Der Code bestimmt am Anfang das freie RAM, hält etwas frei und schnappt sich den Rest. Lass doch testweise einfach mal mehr frei.
          Am ESP selbst sollte es nicht liegen. Ich habe ESPs mit einer Laufzeit bis zu 200 Tagen; danach musste ich an die Sicherung. Der ESP ist auf der Reset Leitung empfindlich. Da kann auch eine Ursache liegen, wenn in unmittelbarer Umgebung stärkere Ströme geschaltet werden.

          Gruss Stefan

          Antworten
          1. Gerald

            Hallo Stefan,
            vielen Dank für deine Geduld!
            Ich hatte ja vor dem Reboot nichts geändert, also mal schauen ob der Fehler wieder auftritt. Selbstheilung ist selten. Im Moment läuft alles. Ein ungewollter Reset kann es nicht sein. Der ESP lief und die Daten waren im Diagramm und in der Tabelle alle noch da.
            Bis später! Viele Grüße
            Gerald

  77. Herby

    Hallo,
    erst einmal ein Lob für dieses schöne Projekt. Ich habe das Ganze mal mit Nan-Filter nachgebaut und es funktioniert eigentlich auch alles wunderbar. Da ich ein etwas älteres Modell des ESP8266-01 (v3.0) verwende, habe ich das Problem mit dem ungewollten Reset des ESP. Mal nach 20 Minuten und mal erst nach ner Stunde. Ich habe auch schon die Tipps aus einem anderen Beitrag dieser Seite ausprobiert. Reset mit 10kOhm auf VCC plus 100nF Kerko Pufferkondensator von Reset nach GND. An Spannungsversorgung von ESP und DHT22 jeweils einen 100µF Elko. Auch diverse Spannungsquellen habe ich versucht. Das hat aber leider alles nicht geholfen. Gibt es vielleicht noch eine andere Schraube an der man drehen könnte um das Problem zu lösen? Zum Beispiel den freizuhaltenden Speicher vergrößern?
    Gruß
    Herby

    Antworten
    1. ST Artikelautor

      Hallo Herby,

      ich habe den Code aktuell nicht in Betrieb, aber diverse andere ESP Codes, die wochenlang stabil laufen. Der freie Speicher ist in gewisser Weise eine experimentelle Sache und hängt ggf auch mit der SDK Version zusammen. Im Code gibt es folgende Zeile:
      #define KEEP_MEM_FREE 8192

      Hier wird definiert, wieviel Speicher frei bleibt. Erhöhe mal testweise auf 16384. Dann bleiben 16kB frei.

      Gruss Stefan

      Antworten
      1. Herby

        Hallo Stefan,

        danke für die Antwort. Ich hatte in der Zeile #define KEEP_MEM_FREE 8192 (bei mir stand allerdings ein Wert von 10xxx) schon mal verschiedene andere Werte getestet, aber ohne Auswirkung auf die schlechte Laufzeit.
        Mit dem Wert 16384 den du mir genannt hast, hält der ESP bisher am Längsten durch. Mindestens einen Reset gab es hier aber auch schon.
        Das gibt wieder Hoffnung das es doch noch mit meinem v3.0 ESP geht. Ansonsten muss ich es mal mit einem aktuelleren ESP versuchen.

        Gruss
        Herby

        Antworten
        1. ST Artikelautor

          Welche Sdk Version nimmst Du? Ich habe bei meinen Anwendungen kein beobachtbares Memory Leak aus dem aktuellen Sdk.

          Antworten
          1. Herby

            Auf dem ESP ist die v0.9.2.2 AT Firmware. Zur Zeit teste ich mit einem v2.1 ESP8266-01 mit gleicher Firmware und der hält mit 16384 freiem RAM und eingestellten 96 Stunden Aufzeichnung (bisher) gut durch. Eine andere Firmware werde ich bei Gelegenheit auch mal testen. Meinen gesteckten Versuchsaufbau möchte ich auch nicht mehr ausschliessen, obwohl ich diesen mehrfach geprüft habe. Mit gelöteten Verbindungen gibt es eine Fehlerquelle weniger.

          2. ST Artikelautor

            Hallo Herbert,
            Sie AT Firmware ist nicht mehr drauf, wenn Du mit der Arduino IDE ein Programm aufspielst. Du verwendest dann die Arduino IDE und diese verwendet das Espressif Sdk. Die Version des Espressif Sdk ist hier wichtig. Das sollte nicht zu alt sein. Schau mal in der Arduino IDE. Dort kannst Du im Boardmanager die Version nachsehen und ggf auch ein Update machen.
            Gruss Stefan

          3. Herby

            Hallo,
            ja, ich nutze die Arduino-IDE und die SDK ist die aktuelle 2.3.0.
            Mit meinem v2.1 ESP scheint es zu funktionieren. Der läuft jetzt schon über 1,5 Tage ohne Reset auf meinem gesteckten Versuchsaufbau. Meine beiden v3.0 ESP halten meistens keine 2 Stunden durch. In der Arduino-IDE muss ich bei v2.1 und v3.0 auch den Flash-Mode von DIO auf DOUT setzen um erfolgreich was hoch zu laden. Das ist ja eigentlich nicht nötig.
            Gruss
            Herby

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.