Hallo zusammen,
bei mir liegen seit längerem einige ESP8266-Module in verschiedenen Ausführungen ( ESP-01, ESP-12, ESP-12E ) rum. Diese versuche ich derzeit als Remote-Sensor-Nodes einzusetzen und dachte mir, das könnte einige Benutzer hier ebenfalls interessieren. Deshalb habe ich mich entschlossen, die Realisierung in allen Schritten hier zu veröffentlichen.
Vorarbeiten:
Die Programmierung der ESPs erfolgt zunächst ausschliesslich in der Arduino-IDE mit der entsprechenden Erweiterung für die ESP8266 Module. Um die ESP-Boards in die IDE zu integrieren folgt ihr am besten -> dieser Anleitung <-.
Ich kann zwar derzeit nicht sagen, inwieweit sie noch zum Einsatz kommen, es kann aber nicht schaden, wenn ihr Euch zusätzlich noch den -> ESP8266-Esplorer <- sowie die -> nodemcu-Firmware <- installiert.
Softwareseitig wäre das zunächst mal alles.
Was jetzt noch benötigt wird ist irgendein Aufbau zum Flashen und Testen der ESPs.
Da ich im ersten Schritt ( dazu komme ich später noch ) erst mal die ESP-01 Module einsetzen will, reicht hier etwas ganz Einfaches.
In diesem Zusammenhang möchte ich ein bisschen Werbung für zwei unserer Foren-Nutzer mache: Neueinsteiger und joh.raspi.
In -> Neueinsteigers Projekt-Liste <- findet ihr z.B. einen Programmer für die ESPs, den ich Euch wärmstens empfehlen kann. Ausserdem haben er und auch -> joh.raspi <- kleine Boards direkt zur Verwendung der ESPs in einem Projekt anfertigen lassen. Nehmt da einfach mal Kontakt auf ... ich finde, das lohnt sich wirklich.
Es reicht natürlich auch ein Breadboard. Da aber die ESPs nur schwierig bis gar nicht auf einem Breadboard steckbar sind und die Anschlüsse mit Strippen verbunden werden müssten, habe ich mir für den Anfang einen kleinen Adapter aus einer 3er Streifen-Raster-Platine gebastelt. Dazu habe ich einfach eine 8 pol. Steckbuchse aufgelötet und die Anschlüsse auf eine Steckerleiste gelegt.
Noch einem PL2303 USB-Adapter und evtl. einen Levelshifter dazu und fertig ist das Programmiergerät. Zum Flashen einfach vor dem Einschalten des ESP GPIO0 mit GND verbinden. Dadurch bootet der ESP im UPLOAD-Modus und ihr könnt Euren sketch hochladen. Danach ESP ausschalten, GPIO0 abstecken, das Modul wieder einschalten und Euer sketch sollte laufen.
Achtung! Auch wenn der PL2303 mit 3V3 Pegeln arbeitet ... wenn ihr den USB-Adapter in Euren PC steckt kann an den stromführendenen zwei Leitungen ( meist rot und schwarz ) eine Spannung von 5V anliegen. Also erst messen, dann stecken, denn die ESPs sind nicht 5V tolerant. Lieber einen Levelshifter verwenden ... dann seid ihr auf alle Fälle auf der sicheren Seite.
Weitere, ausführliche Informationen zu den ESPs findet ihr über -> diese Linksammlung <- hier im Forum.
Wie geht's jetzt weiter?
Nun, in einem ersten Schritt würde ich Euch empfehlen zuerst mal alles so zu verbinden und einzurichten, dass ihr dem ESP-Modul eine Reaktion entlockt. Dazu reicht es, das Modul mit 3V3 zu versorgen, den CH_PD-Pin auf HIGH (3V3) zu legen und die Rx und Tx Anschlüsse des Moduls mit Tx und Rx des PL2303-Adapters zu verbinden.
Achtung! Nicht vergessen: Rx und Tx kreuzen und GND des PL2303 mit GND des ESPs zu verbinden!
Eine einfache Skizze einer Adapterplatine findet ihr im Anhang (ESP_SensorNode-ESP01_Steckplatine.jpg).
Über o.g. Linkliste, hier im Forum und auch in der Arduino-IDE findet ihr genügend Beispiele, um Euch mit den ESPs in Verbindung mit der Arduino IDE vertraut zu machen.
Achtung! Ich habe -> mindestens eine Anleitung <- gefunden, bei der der GPIO0 über einen Pulldown-Widerstand auf GND geschaltet war. Das ist keine so clevere Idee, weil der ESP, wie weiter oben schon erwähnt, in den UPLOAD-Modus geht, wenn der GPIO0 beim booten auf GND liegt.
Schliesslich vielleicht noch zwei Anmerkungen in eigener Sache: das ist aktuell alles in Arbeit. Es kann also durchaus mal eine Weile dauern, bis hier wieder was Neues hinzukommt. Ausserdem möchte ich noch darauf hinweisen, dass ich die Realisierung unter Ubuntu durchführe. Ich habe auch keinen Windows-Rechner mehr im Betrieb. Sollten in diesem Zusammenhang Probleme auftauchen kann ich dahingehend vermutlich leider nichts Produktives beitragen. Aber es wäre nett, wenn jemand von den Interessierten die Fallstricke unter Windows und deren Umgehung aufzeigen könnte.
Weiteres Vorgehen:
Ich werde hier, in diesem Beitrag, nach und nach den Funktions-Umfang der einzelnen Realisierungs-Stufen definieren und deren Durchführung dokumentieren. Sourcen und Schaltpläne findet ihr auch -> hier in meinem Repository <- auf github.
Evtl. anfallende Schaltpläne, sketches und andere Programm-Sourcen werden ebenfalls hier, in diesem Beitrag, nach und nach hinzugefügt, ergänzt oder geändert, so dass ihr mit diesen Informationen immer auf dem aktuellsten Stand seid, egal wie weit das Ganze fortgeschritten ist.
Die folgende Auflistung wird ebenfalls in nächster Zeit nach und nach erweitert.
Definition der Realisierungs-Schritte:
[an=Schritt_1]
Schritt 1
[/an]
betroffene Hardware: ESP8266-01
unterstützter Sensor: DS18B20
geplante Funktionalität: Sensorwerte ermitteln und auf "eigener Wegseite" ausgeben
Status: erledigt
Beschreibung
Das ESP-Modul startet im Client-Modus und verbindet sich mit einem existierenden WLAN. Anschliessend wird ein Webserver gestartet. Im 5-Sekunden-Takt wird nun auf einer ESP-internen "Webseite" die Temperatur eingetragen und diese bei Aufruf der Server-URL ausgegeben.
Im Schaltbild ist der DS18B20 als wasserdichte Version mit vier Anschlüssen dargestellt. Mir ist bisher noch keiner mit vier Anschlüssen untergekommen wobei der vierte lt. Bauteile-Bibliothek für die Abschirmung vorgesehen ist und ich ihn deshalb im Anschlussplan einfach ignoriert habe.
Achtung bei den Kabelfarben dieser vorgefertigten Sensoren. Die sind nicht immer gleich oder verlässlich. Immer vor dem Anschliessen vergewissern, welche Farbe zu welchem Anschluss gehört. Ich hab' hier z.B. welche, bei denen ist grün = GND und das Datensignal = gelb.
Ansonsten habe ich versucht die Darstellung so verständlich wie möglich zu erstellen:
Datenpin Sensor --> GPIO2 des ESP
Datenpin Sensor --> pullup 4k7 auf 3V3
GND Sensor --> GND ESP
Vcc Sensor --> 3V3
Das mit den 3V3 hab' ich extra noch verifiziert ... der Sensor tut da klaglos seinen Dienst.
Trotzdem würde ich dazu raten, dass ihr Euch für spätere Erweiterungen der Schaltung z.B. -> so eine Breadboard-Spannungsversorgung <- zulegt, die sowohl 5V als auch 3V3 zur Verfügung stellt.
[an=Schritt_2]
Schritt 2
[/an]
betroffene Hardware: ESP8266-01
unterstützter Sensor: DS18B20
geplante Funktionalität: Webserver-Funktionalität erweitern
Status: erledigt
Beschreibung
Einige Einstellungen, die derzeit als Konstanten fest im Programm definiert sind, sollen als Variable über Formulare des Webservers konfiguriert werden können. Diese Variablen sollen zudem im EEPROM des ESP hinterlegt werden, so dass sie bei jedem Neustart/Reset ausgelesen und damit verfügbar sind.
Dazu wird ein virtuelles Formular "/admin" ausgegeben, das, wie allgemein üblich, mittels eines submit-Buttons abgesendet wird.
Einstellbar werden zunächst die SSID sowie das Passwort zum Verbinden mit dem WLAN sein.
Ausserdem soll eine 404-Meldung ausgegeben werden, wenn eine unbekannte URL ( also weder / noch /admin ) aufgerufen wird.
Ich habe jetzt die ESP8266WebServer-Klasse für den WWW-Server genommen. Die ist mir einfach sympathischer, weil man ganz einfach Handler für jede "virtuelle Seite" definieren kann ...
Ein weiterer Vorteil ist, dass automatisch eine 404-Rückmeldung für alle "Seiten", für die kein Handler definiert ist, zurückgeliefert wird.
Der Server kann nun unter der URI http://IP.DES.ESP.MODUL bzw. http://IP.DES.ESP.MODUL/ aufgerufen werden und gibt dann die aktuelle Temperatur des Sensors aus.
Ich habe da jetzt (noch) keine Abfrage auf Lesefehler des Sensors ( Werte 85.0 bzw. -127.0 ) eingebaut. Die 85.0 kommt z.B. beim ersten Lesen des Sensors. Es dürfte aber für Euch kein Problem sein, diese Fehlwerte zu unterdrücken.
Eine weitere gültige Server-URI ist http://IP.DES.ESP.MODUL/admin. Hier wird ein Formular mit zwei Eingabefeldern ( SSID und PASSWORD ) ausgegeben, das mit dem Submit-Button abgesendet werden kann.
Die Felder sind mit dem Inhalt der Variablen ssid und password vorbelegt und werden nach dem Absenden im EEPROM gespeichert.
Dazu sind ein paar Funktionen zum Handling des EEPROM dazugekommen.
Im Handler für die Admin-Seite werden die Eingaben ins EEPROM übertragen. Eine wichtige Funktion ist eeValidate(). Damit wird an die erste Stelle des EEPROM ein "magisches" Byte geschrieben das als Kennzeichen für einen gültigen Inhalt des EEPROM steht.
Wird beim Aufruf von setup() dieses magische Byte erkannt ( isValid() ), dann werden die ssid und das password aus dem EEPROM gelesen.
Achtung! Im Moment werden diese Werte in die Variablen n_ssid und n_password eingelesen. Um die "echten" Variablen zu versorgen, einfach diese austauschen.
[an=Schritt_3]
Schritt 3
[/an]
betroffene Hardware: ESP8266-01
unterstützter Sensor: DHT22
geplante Funktionalität: Anbindung an ein Datenhaltungs-System
Status: erledigt
Beschreibung
Der ESP kann nun eine WEB-API, und zwar die von EMONCMS, bedienen. Dazu wird ein weiterer Handler für "virtuelle Seiten" aktiviert. Die zugehörige Server-URI ist http://IP.DES.ESP.MODUL/emoncms.
Ausserdem können die Parameter für das EMONCMS jetzt über die /admin-Seite eingegeben werden. Diese werden mit den anderen Einstellungen ebenfalls im EEPROM gespeichert und bei einem restart des Modul aus dem EEPROM gelesen. Die Logik mit dem "magischen Byte" aus Schritt 2 hat sich nicht geändert.
Achtung! Derzeit werden die Variablen, die den Zugriff auf das EMONCMS ermöglichen, aus dem EEPROM in Zwischenvariablen gelesen (siehe auch Schritt 2). Wie auch im vorigen Schritt beschrieben müssen zum Aktivieren der echten Variablen die mit einem führenden "n_" versehenen Zwischenwerte gegen die Originale ausgetauscht werden.
Um die API-Funktionalität anschliessend zu aktivieren müssen die Werte emoncmsReadApiKey, emoncmsWriteApiKey, usw. bis zu emoncmsUrl und emoncmsFeedFmt mit den eigenen, passenden Werten belegt werden.
EMONCMS liefert einen String im JSON-Format als Status der Operation zurück. Dieser wird mit einem Parser gelesen und ausgewertet. Es erfolgt allerdings keine Aktion aufgrund des Rückgabe-Wertes. Es ist aber kein Problem da etwas einzubauen.
Als weiteres Feature ist die Unterstützung eines DHT22-Sensors dazugekommen.
Der Sensor wird statt des DS18B20 an GPIO2 angeschlossen und, wie vorher der DS18B20, zyklisch in einstellbaren Intervallen ausgelesen.
Ich habe wieder eine einfache Anschluss-Skizze in den Anhang gepackt.
[an=Schritt_4]
Schritt 4
[/an]
betroffene Hardware: ESP8266-01
unterstützte Sensoren: DHT22/DS18B20
geplante Funktionalität: Überarbeiten
Status: erledigt
Beschreibung
Der Source-Code ist jetzt übersichtlicher, ausführlich dokumentiert und komplett per #define-Macros konfigurierbar.
Es werden jetzt alle Variablen für die es sinnvoll erscheint ins EEPROM gespeichert und beim Start ausgelesen. Lediglich die SSID und das Passwort werden nach wie vor in temporäre Variablen geschrieben damit man mehr Freiheiten beim Herumspielen hat.
Eine CRC32-Funktionalität ist ebenfalls dazu gekommen. Die wird später für die Verifizierung u.a. der EEPROM-Daten verwendet.
Ausserdem sind Vorbereitungen zur Anbindung an SHC durchgeführt worden. Die Daten werden ebenfalls im EEPROM gespeichert.
Hinzu gekommen ist eine "virtuelle" Tabelle, in der die IDs, Feeder-Ids und Namen von derzeit max. 10 DS18B20 Sensoren abgespeichert werden können.
Diese Tabelle kann bei Bedarf durch einen #define in der Größe verändert werden. Diese Tabelle liegt wiederum im EEPROM.
[an=Schritt_5]
Schritt 5
[/an]
betroffene Hardware: ESP8266-01
unterstützte Sensoren: DHT22/DS18B20
geplante Funktionalität: Überarbeiten und um BMP085/BMP180 erweitern
Status: erledigt
Beschreibung
Ich habe jetzt die Basis-Funktionalität zur Unterstützung von BMP085/BMP180 Sensoren implementiert und getestet. Das funktioniert mit beiden Typen von Sensoren.
Diese Sensoren verwenden I2C zur Kommunikation. Am ESP-01 haben wir nur GPIO00 und GPIO02. Diese können dazu verwendet werden. Das ändert nichts an der speziellen Funktionalität von GPIO00, der zum Flashen auf GND gelegt werden muss.
Es ist nur zu beachten, dass die Wire-Library mit GPIO00 als SDA- und GPIO02 als SCL-Pin oder vice versa) vor der ersten Verwendung initialisiert wird.
Desweiteren ist mal die Grundlage für die Verwaltung der DS18B20-Sensoren dazugekommen. Es wird eine Formular-Seite erzeugt, in der es möglich ist, den Sensoren Namen und IDs zu geben.
Es werden allerdings noch keine Daten abgespeichert. Hier fehlt mir im Moment ein Stück Logik und zwar das Zusammenspiel von vorhandenen und im EEPROM gespeicherten Sensoren. Das muss im nächsten Stück noch gelöst werden.
Eine "Helper-Klasse" Logger dient jetzt zur Ausgabe von Fehlern und/oder Hinweisen. Sie erhält als Argument beim Initialisieren ein Stream-Objekt das zur Ausgabe verwendet wird. Der Aufruf versteht die rudimentären C-Formatangaben ( printf-ähnlich wie %d, %l, %c, %s ) und verarbeitet, im Gegensatz zu den print()-Aufrufen der Arduino-IDE, auch mehrere Argumente. Das Ganze ist in einem eigenen ZIP-File (SimpleLog.zip) und muss in Eurem sketchbook-Folder unter libraries entpackt werden.
[an=Schritt_6]
Schritt 6
[/an]
betroffene Hardware: ESP8266-01
unterstützte Sensoren: DHT22/DS18B20/BMP085/BMP180
geplante Funktionalität: Listen-Erweiterung/Handling HTML-Seiten
Status: in Vorbereitung
Beschreibung
DS18B20 Formular redesignen
Zusammenhang physisch vorhandene und im EEPROM gespeicherte DS Sensoren sowie der Eingabemaske mit Logik füllen.
Zusätzliche interne Variablen für Lese-Intervalle, eine statische IP, eine Node-Id und einen Node-Namen statt Konstanten
Admin-Eingabemaske um obige Felder erweitern
Zusätzliche Felder im EEPROM ablegen und daraus lesen
Pushbullet Benachrichtungen versenden
History:
09.02.2016 Erste Version veröffentlicht
10.02.2016 Version aus Schritt 2 fertig (ESP8266_SensorNode_DS18B20_EE.zip).
12.02.2016 Version aus Schritt 3 fertig (ESP8266_SensorNode-Step3.zip).
27.02.2016 Version aus -> [al=Schritt_4]Schritt 4[/al] <- fertig (ESP8266_SensorNode-Step4.zip).
03.03.2016 Version aus -> [al=Schritt_5]Schritt 5[/al] <- fertig. Auf -> Github <- und hier aktualisiert (ESP8266_SensorNode-Step5.zip).
Fragen oder Probleme entweder als neues Thema in diesem Subforum, oder, falls es konkret mit diesem Beitrag zu tun hat, natürlich hier als Kommentar veröffentlichen.
Über die weiteren Schritte werde ich Euch demnächst hier informieren. Bis dahin erst mal viel Erfolg und Spass beim Ausprobieren. Ich hoffe, dass dieser Thread für den einen oder anderen hilfreich ist,
-ds-