ESP8266 Web Socket

Wer diesen Eintrag zum Setup des ESP8266 WiFi-Moduls gelesen hat und nun mehr mit dem Controller machen will, der ist hier genau richtig. Was genau kann man von diesem Tutorial erwarten? Ich zeige wie man das ESP so programmiert, dass man damit eine LED-Lichtleiste mit Hilfe eines Transistors über ein Smartphone ein- und ausschalten kann. Obendrein gibt’s natürlich wieder alle Erklärungen und Anleitungen bezüglich der verwendeten Hardware.

Da ich in diesem Beitrag unter anderem ein kurzes Video habe, und WordPress die Datei aus Gründen nicht wiedergeben will, gibt es diesen Beitrag nur auf meiner Website. Ein Premiere, wenn man so will.

Und los geht’s! 

Advertisements

ESP8266 Setup

Das ESP8266-WiFi-Modul ist klein, günstig und funktioniert problemlos – vorausgesetzt man bekommt es erst einmal zum laufen. Wie man das macht, welche troubleshooting-Möglichkeiten es gibt und was man damit anstellen kann zeige ich hier. Am meisten geholfen hat mir das ‚community wiki‚ des Controllers. Ich programmiere es mit der Arduino IDE 1.6.9, da es leider keinen Support für Sublime Text 3 & Stino gibt. Jede neuere Version der IDE sollte ebenso problemlos funktionieren.

esp8266

Am Ende dieses Tutorials soll das ESP die angeschlossene LED blinken lassen. Das mag sich nicht nach viel anhören, soll aber die Basis für alle weiteren meiner ESP-Tutorials werden. Zu allem später mehr, jetzt folgen erst einmal die …

Spezifikationen

Das Modul hat eine integrierte WLAN-Schnittstelle (802.11 b/g/n [2.4GHz]) und unterstützt neben den Funktionen als Endgerät, Accesspoint auch Peer-To-Peer Kommunikation. TCP/IP ist integriert. Der wichtigste Punkt zu Beginn ist jedoch: Versorgungsspannung 3.3V, nicht 5V tolerant!

Mehr …

Preislich liegt das Modul zwischen 2€ und 5€, abhängig von der Ausführung. Die hier von mir vorgestellte Version (esp-01) ist eine der günstigsten, hat im Gegensatz zu den teureren Varianten nur 2 GPIO-Pins.

Es hat keinen FTDI-Chip integriert, das bedeutet, dass man es nicht so bequem an den PC anstecken kann wie ein Arduino, um es zu programmieren. Abhilfe schafft hier ein günstiger FTDI-Adapter.

ftdi232

Dieser sollte unbedingt neben 5V auch 3.3V unterstützen, da man ansonsten zwischen den Signalpins (RX, TX) einen Logic-Level-Shifter benötigt.

ftdi232_supply

Wer einen zu meinem Adapter ähnlichen verwendet, der muss einfach nur den Jumper zwischen den mittleren und den 3.3V-Pin stecken. Schon ist die Signalpegel-Logik auf 3V3 gestellt.

Den FTDI Adapter sollte man allerdings nicht als Versorgung nutzen, da das ESP oftmals mehr Strom benötigt als der Adapter zur Vrfügung stellen kann.

Der elektrische Aufbau

Für das Tutorial benötigt man neben dem ESP8266-01 noch ein paar weitere Komponenten, um es einerseits programmieren zu können, es andererseits auch nutzen zu können.

Stk. Komponente Ausführung Beschreibung
1 ESP8266 esp-01
1 FTDI-Adapter FTDI232 5V & 3V3
1 Versorgung 3.3V 2AA Batterien oder Netzteil
2 Widerstände 10kΩ
1 Pushbutton Programmer-Mode
1 LED
1 Schalter Optional
n Drahtbrücken

Das nachfolgende Bild zeigt die Pinbelegung des ESP Moduls.pinout

Die Verdrahtung erfolgt nach dem unten gezeigtem Schaltplan. Auch auf die Gefahr hin, dass ich mich wiederhohle möchte ich nochmals darauf hinweisen, das FTDI-Modul so zu nutzen, dass es mit 3.3V arbeitet.

shematic

Wer sich den Schaltplan genau ansieht erkennt, dass die LED nicht wie gewohnt angeschlossen wird, sondern verkehrt. Also die Anode (+) der LED auf Vcc, und die Kathode (-) auf den GPIO_2 Pin. Der Grund hierfür ist, dass beide GPIO Pins (GPIO_0 & GPIO_2) des ESP8266 Moduls beim Booten logisch HIGH (oder in einem Zwischenzustand) sein müssen. Würde man die LED wie gewohnt anschließen, also Anode auf GPIO_2 und Kathode auf GND, so würde das ESP denken, dass man ein Programm via UART darauf laden möchte. Jedoch muss man dann später im Programm darauf achten, die Logik des Ausgangs zu invertieren. Mit digitalWrite(Pin, HIGH); wird die LED ausgeschalten und vice versa.

Zum Schluss sollte der ganze Setup in etwa so aussehen. Anstatt der beiden Batterien kann man natürlich auch eine andere Versorgung nehmen, etwa ein Netzteil mit 3V Output.

setup

Die Arduinno IDE vorbereiten

Damit man mit der Arduino IDE das ESP-Modul programmieren kann muss man dieser das Board erst einmal hinzufügen und konfigurieren. Dazu öffnet man zunächst die IDE und führt die folgenden Schritte aus:

  • Prefrences öffnen (File -> Preferences)
  • Auf das Icon neben ganz rechts neben den Additional Boards Manager URLs klicken.
  • Am Ende, falls bereits Einträge existieren, folgenden Link hinein kopieren:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Alle Fenster mit Ok schließen.
  • Den Board Manager öffnen (Tools -> Board „…“ -> Boards Manager)
  • Den Eintrag esp8266 by ESP8266 Community installieren.

Eine bebilderte Anleitung gibt es hier, allerdings von einem anderen Projekt.

Nun ist das WiFi Modul in der Arduino IDE registriert und kann verwendet werden. Dazu muss man es lediglch von den Boards (Tools -> Boards) auswählen und wie folgt konfigurieren:

  • Board: „Generic ESP8266 Module“
  • Flash Mode: „DIO“
  • Flash Size: „512K (64K SPIFFS)“
  • Flash Frequency: „40MHz“
  • CPU Frequency: „80MHz“
  • Upload Speed: „115200“

esp_ide

Der Port entpricht jenem Port des FTDI-Adapters. Hat man diesen mit dem PC verbunden, kann man seinen Port auswählen.

Das Programm

Wie ich bereits erwähnt habe ist das Programm sehr simpel, da dieser Eintrag nur als Basis für weitere Projekte mit dem WLAN-Modul dienen soll. Man kann es einfach in die Arduino IDE kopieren und dann auf das ESP hochladen.

Aber halt: Wie lädt man das Programm auf den Controller? Nun kommt endlich der Button zum tragen. Wird dieser gedrückt, so wird das ESP in den Programer-Modus versetzt und erlaubt es, von der Arduino IDE programmiert zu werden. Dazu muss man wie folgt vorgehen:

  • Die Spannungsversorgung zum ESP trennen, der FTDI Adapter kann mit dem PC verbunden bleiben.
  • Den Button drücken und gedrückt halten.
  • Die Spannungsversorgung wieder herstellen.
  • Der Button kann losgelassen werden.
  • Das Programm hochladen.
  • Nach dem erfolgreichen Upload muss das ESP eventuell neu gestartet werden.

Anmerkung: Es ist auch möglich, das ESP ohne einen Button zu programmieren, dafür ist allerdings ein anderer FTDI-Adater nötig. Durch das Fehlen eben dieses kann ich darauf leider nicht weiter eingehen.

#define LED_PIN 2

void setup()
{
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH); // Invertierte Logik!
}

void loop()
{
    digitalWrite(LED_PIN, LOW);
    delay(100);
    digitalWrite(LED_PIN, HIGH);
    delay(100);
}

Nach dem Hochladen (es nimmt etwas Zeit in Anspruch, da die ESP Dateien miteingebunden werden müssen und der Flash komplett überschrieben werden muss) sollte die angeschlossene LED schnell blinken. Tut sie das nicht, so können diese Tipps eventuell hilfreich sein.

Einen Schritt weiter gehen

Das ESP8266-01 hat den gleichen Aufbau wie das nRF24L01+ Funkmodul. Das bedeutet, dass es genauso schlecht auf ein Breadboard passt, wie das genannte Modul. Beim Funkmodul ist das noch nicht so tragisch, man lässt es im Allgemeinen für die Dauer des Projekts am Arduino montiert oder verlötet es zum Schluss auf eine Platine. Beim ESP ist das etwas anders, denn zum Flashen des Programms muss der „Programmer-Aufbau“ verwendet werden, welche unter Umständen nicht für anderes geeignet ist. Deshalb habe ich für das Funkmodul eine kleine Platine aus einer Lochrasterplatine gebaut.

perfboard_setup.jpg

Gut, auf dem Bild kann man nicht viel erkennen, deshalb gibt es im Anschluss das Fritzing-File-Bild. Ich habe 3 Terminal-Blocks (doppelte Ausführung), 3 Stiftleisten (2×4 & 1×6 Pins), 1 Steckerbuchse, den Schalter, den Button und die beiden Widerstände verbaut. Damit, und mit der richtigen Verkabelung kann man die WiFi-Module bequem programmieren und im Anschluss wo anders weiter verwenden.

perfboard

Der Pinout von links (1) nach rechts (6):

Pin Anschluss Anmerkung
1 Vcc 3.3V max.
2 GND
3 3.3V Für Sensoren, etc
4 GND Für Sensoren, etc
5 GPIO 0 SDA
6 GPIO 2 SCL

Zugegeben, auch dieses Bild ist etwas unübersichtlich, doch mit ihm und dem oben gezeigten Schaltplan sollte das Nachbauen kein Problem mehr sein. Ich habe lediglich die LED weggelassen. Zum Testen des hier gezeigten Programms kann man sie aber einfach zwischen die GPIO_2 und GND Pins der Terminal-Blocks stecken.

Troubleshooting

Ich habe einige Zeit gebraucht, bis ich das ESP zum Laufen bekommen habe, da ich Fehler Nummer eins der folgenden Liste begangen habe. Zusätzlich habe ich noch ein paar weitere Ratschläge aufgeschrieben, sodass man das WLAN-Modul tatsächlich zum Funtionieren bringt.

  • Den Taster auf Funktion prüfen. Es ist doch tatsächlich daran gescheitert, dass der Button für den Programer-Modul defekt war, und ich das ESP nie programmieren konnte. Dinge an die man niemals denkt …
  • Eine stabile Spannungsversorgung. Alte Batterien oder eine schwankende Eingangspannung können die Ursache für Fehlverhalten sein. Zu Beginn habe ich die Spannungsversorgung durch herausziehen einer Drahtbrücke unterbrochen. Durch schlechte Kontakte am Steckbrett wurde die Verbindung nicht so hergstellt, wie sie sollte. Nun trenne ich die Spannung nur mehr mit soliden Schaltern.
  • Beide LEDs (rot & blau) am ESP leuchten. Das bedeutet, dass das ESP Daten via UART anfordert und nicht bootet. Der Fehler ist, dass GPIO_2 auf dem Ground-Potential liegt. Umgehen kann man das so.
  • Alle Verbindungen prüfen. Es kann durchaus sein dass man einen Pin falsch angeschlossen hat, oder den Ground nicht mit allen Geräten (ESP8266 & FTDI) geteilt hat.
  • Die Baudrate ist falsch eingestellt. Im Normalfall ist die Baudrate 115200bps oder 9600bps. Das ist wiederum abhängig von der Version, einfach mal beides testen.
  • WLAN Daten prüfen. Wer bereits ein WLAN-fähiges Programm laufen hat, der kann nochmal die WLAN Zugangsdaten prüfen. Beim Passwort habe ich mich schon öfter vertippt.
  • Module neben dem ESP-01: Der GPIO-Pin Nummer 15 muss auf Ground liegen.
  • Fehlerhaftes ESP. Es gibt tatsächlich eine defekte Charge des Moduls, hier ist der Widerstand für die Power-LED zu schwach, was zu einem Durchbrennen dieser führt.

Mit dem ESP arbeiten

Hier werde ich erst einmal einen Schlussstrich ziehen und auf die anderen Tutorials verweisen, welche nach und nach kommen werden.

Easy going

Wem es zu viel Aufwand ist, sich die Lochrasterplatine nachzubauen, oder wer keine Lust auf Kabelsalat hat: ESP8266 NodeMcu ist das Stichwort. Das Board ist Ähnlich dem Aufbau eines Arduino Nanos und es lässt sich auch genauso bequem über einen USB Port programmieren.

Ansonsten bleibt zu sagen: Viel Spaß mit dem ESP8266, ich habe ihn definitiv!

Catalex SD & SoftSPI

In einem früheren Beitrag hatte ich erwähnt, dass ich Daten eines Sensors auf einer SD Karte speichern wollte, dies aber nicht möglich war, da das Catalex SD Card Modul den SPI Bus blockierte, mit dem auch ein anderes benötigtes Modul verbunden war.

Nach etwas Arbeit und trouble shooting läuft es nun. Für alle, die das selbe Problem haben (dass das Catalex Modul nicht mit anderen SPI-Geräten verwendbar ist) habe ich hier die Lösung!

Vorweg meine Idee: Ich möchte zwei Arduinos verwenden, das eine dient als Sender, das andere als Empfänger von Daten. Diese Daten nehmen ich am Sender mit Hilfe von Temperatursensoren auf und schicke sie mit dem NRF24L01+ Wireless-Modul an den Empfänger. Dieser nimmt sie mit dem gleichen Modul auf und zeigt sie an einem Display an. Zusätzlich werden sie noch auf dem SD Card Modul von Catalex gespeichert.

Catlex

Der Grund für diesen Aufwand ist, dass das SD Kartenmodul von Catalex (v1.0) den SPI-Bus blockiert, da es das SN74LVC125A-Modul als Level-Shifter nutzt. Leider wurden die nötigen Pins, um anderen Geräten die Kommunikation auf dem BUS zu ermöglichen, auf Ground gelötet. Deshalb blockiert das SD-Karten-Modul den BUS. Die einzige Lösung es trotzdem mit anderen SPI-Geräten zu nutzen ist es mit einer Softwarelösung auf andere Pins zu setzen. So erzeugt man quasi 2 SPI-Bus-Systeme auf einem Arduino.

Der elektrische Aufbau

Die Temperatursensoren und den Display habe ich beide hier vorgestellt. Die Details zum NRF24-Modul sind hier zu finden und der Inhalt zum SD Card Modul soll in diesem Beitrag folgen.

Der Aufbau benötigt neben den Modulen auch ein paar andere Komponenten.

  • Sender
    • 1 Arduino Uno/Nano
    • 1 NRF24L01+ Wireless Modul
    • 2 DS18B20 OneWire Temperatursensoren
    • 1 4.7kΩ Widerstand für den Datenbus
  • Empfänger
    • 1 Arduino Uno/Nano
    • 1 NRF24L01+ Wireless Modul
    • 1 SD Card Reader Modul (Catalex v1.0)
    • 1 I2C Display (16×2)
Der Sender

Transmitter_Shematic

Transmitter

* den Button einfach ignorieren!

Der Empfänger

Receiver_Shematic

Receiver

Der Code

Das Programm befindet sich natürlich auf GitHub.

Doch bevor man das Programm auf das Arduino laden kann benötigt man ein paar Programmbibliotheken, damit die Module auch richtig funktionieren. Alle nötigen Libs findet man auf GitHub im Verzeichnis ‚Libraries‘.

Das Catalex SD Card Modul wird an den SoftSPI-Bus angeschlossen. Dies ist nichts anderes als eine Imitation des Hardware-SPI-Bus, nur eben von der Software verwaltet. Hierzu muss man die SdFat-Bibliothek etwas editieren, genauer das ‚SdFatConfig‘-File.

Zu editierender Inhalt: Zeile 81, #define SD_SPI_CONFIGURATION 3 (Standard 1).

Ich habe dies bereits getan, sodass man nur mehr alle Bibliotheken des Ordners auf GitHub in das Standardverzeichnis von Arduino kopieren muss.

Transmitter.ino

Der Transmitter nimmt in definierten Zeitintervallen die Messwerte der Sensoren auf und sendet sie über das RF24 an den Empfänger. Für mehr Informationen verweise ich auf die oben genannten Beiträge.

Receiver.ino

Die Daten werden vom RF24 empfangen und auf dem Display dargestellt. Um sie dann auf der SD Karte zu speichern muss man das Textfile auf der Karte wie folgt aufrufen:

file.open("Temp.txt", O_WRITE | O_CREAT | O_AT_END);

Das erste Attribut gibt den Dateinamen an. Das zweite steht für die Art des Zugriff. In diesem Fall passieren 3 Dinge:

  • O_WRITE: Es wird auf die Karte geschrieben und nicht gelesen.
  • O_CREAT: Existiert keine Datei namens ‚Temp.txt‘ wird eine leere erzeugt.
  • O_AT_END: Es wird am Ende der Datei weiter geschrieben. Andernfalls würde man alle Daten in der Datei überschreiben.

Zu Beginn der Datei muss man zusätzlich noch definieren, wo man den SoftSPI-Bus verwenden will. Ab Zeile 55 wird dies erledigt.

const uint8_t SOFT_MISO_PIN = 4;
const uint8_t SOFT_MOSI_PIN = 5;
const uint8_t SOFT_SCK_PIN = 6;
const uint8_t SD_CHIP_SELECT_PIN = 7;

Im großen und ganzen war es das. Es ist, wie man sieht, nicht besonders schwer alles unter einen Hut zu bringen, doch bis man alles nötige zusammen hat dauert es schon etwas. Ich hoffe mal das hilft all‘ jenen die das gleiche Problem haben wie ich.

Vielleicht noch eine kleine Anmerkung zum Schluss. Da das SD Modul nun am SoftSPI-Bus hängt kann man den „normalen“ SPI-Bus wieder ganz normal und ohne Einschränkungen nutzen. Die Verwendung beschränkt sich nicht auf SD+RF24, sondern man kann jede Kombination nutzen, etwa SD+RFID.

Bei Fragen ist ein Kommentar immer erwünscht!

Wireless Communication

Um den Chlorgehalt, die Temperatur und den pH-Wert des Wassers im Pool zu überwachen und aufzuzeichnen muss hinter der Pumpe ein Mikrocontroller sitzen, welcher über Sensoren die drei Parameter aufnehmen kann.

Da sich die Pumpe direkt hinter dem Pool in einem Schacht befindet, und der Pool zudem noch 10 Meter weit weg von der nächst gelegenen Hausmauer ist, wäre es doch recht mühsam, ein Kabel zu verlegen, um die Daten bequem von drinnen auszulesen.

Deshalb kommt hier die Lösung: Der Controller bei der Pumpe sendet die Daten Kabellos zu einem anderen, der sich im Haus befindet.

Gut, genug geredet: Wie stellt man das nun an?

NRF24L01+

Das ist die genaue Bezeichnung des Wireless-Moduls, welches ich im Rahmen dieses Eintrags vorstellen will. Es ist ein sehr, sehr günstiges Modul, welches Daten über eine 2.4GHz Funkverbindung mit einem zweiten NRF-Modul austauschen kann.

Module

Zum Preis: Ich habe zwei Module um 1,66€ auf eBay neu gekauft. Mit kostenlosem Versand.

Die Reichweite wird mit bis zu 100m angegeben. Dies stimmt natürlich nur, wenn man die Reichweite des Moduls auf Maximum einstellt und man sich zudem auf einem freien Feld befindet. Ich habe es auf der Straße vorm Haus getestet, bis etwa 90 Meter war die Kommunikation tadellos. Befinden sich Mauern oder starke elektromagnetische Felder dazwischen, dann sinkt die Reichweite.

Wer etwas mehr Reichweite braucht: Es gibt das Modul auch mit längeren Antennen. Auf dem „Standard“ Modul ist die Antenne lediglich eine geätzte Leiterbahn (im Bild unten, links zu sehen).

Pins

Etwas, das mich ein bisschen stört ist, wie am Bild oben zu erkennen ist, die Pin Anordnung, denn so wie sie auf meiner Modulplatine angeordnet sind, lässt sich die Platine nicht auf einem Steckbrett unterbringen.

Der Aufbau

Man benötigt folgende Komponenten:

  • Arduino Uno oder Nano (zwei Stück)
  • NRF24L01+ Modul (zwei Stück)
  • Jumper Kabel

Zusätzlich habe ich noch einen 0,96″ Display verbaut, um die Daten von einem Arduino auf dem anderen anzuzeigen. Wer den Display nicht braucht/will/hat, der kann im Programm die // in der Zeile #define USE_SERIAL löschen. So werden die Daten nicht am Display, sondern am seriellen Monitor angezeigt.

Die Verdrahtung sieht dann wie folgt aus:

  • Pin 9: CE
  • Pin 10: CSN
  • Pin 11: MOSI
  • Pin 12: MISO
  • Pin 13: SCK
  • 3V3: VCC
  • GND: GND

Für mehr Übersicht: Hier der Schaltplan für den Sender:

WcomTX

Und jener für den Empfänger:

WcomRX.png

Wichtig: Das Modul wird mit 3.3 Volt versorgt. Eine Spannung von 5 Volt würde es zerstören.

Ich habe ein Modul mit dem Uno, das andere mit dem Nano verbunden. Zusätzlich sitzt auch dem Steckbrett des Nanos der kleine Display, um die Daten anzuzeigen, welch vom Uno kommen. Man kann natürlich auch 2 Arduinos des selben Modells nutzen.

RX&TX

Mehr zum Display gibt es hier nachzulesen.

Das Programm

Auf GitHub befinden sich 3 Ordner. Im ersten (Library) findet man die Programmbibliothek für das Modul. Diese muss in das Standard-Verzeichnis der Arduino IDE für Bibliotheken kopiert werden. Das Verzeichnis heißt …/Arduino/libraries/

Im zweiten Ordner (Transmitter) befindet sich das Programm für den Sender. Dieser nimmt die Werte auf und sendet sie zum anderen Controller.

Im dritten Ordner (Receiver) ist das Programm für den Empfänger. Dieser ließt die Daten vom anderen Controller und gibt sie aus.

Basic Code

Neben den Header-Files (#include <SPI.h> & #include „RF24.h“) benötigt das Modul etwas an Initialisierungs-Code – hierfür sollten die beiden Programme geöffnet sein.

  • Addresse: Dies ist quasi die Erkennungsmarke für die beiden Module. Ein Modul sendet nur an ein anderes, welches über die Addresse identifiziert wird. So können hunderte Module nebeneinander Daten senden, ohne dabei andere zu stören.
  • Setup: Hier wird festgelegt, dass die Module über das SPI-BUS-System miteinander kommunizieren.
  • Struct: Hier werden die empfangenen Daten gespeichert. Man muss nicht unbedingt ein Struct nutzen, doch mir gefällt eine solche zusammengefasste Schreibweise.
  • setPALevel: Hier wird die Reichweite in 4 Stufen festgelegt (Min, Low, High, Max). Je höher die Reichweite, desto höher der Energieverbrauch!
  • openWritingPipe: Hier wird festgelegt, welche Adresse zum Schreiben der Daten genutzt wird.
  • openReadingPipe: Vice versa zu writing pipe.

Wichtig ist, dass openWritingPipe und openReadingPipe auf den beiden Arduinos gegengleich definiert werden!

Noch eine Anmerkung: Um Daten zu senden, darf man nicht zuhören! Um also den Befehl write(…); ausführen zu können, muss zuerst der Befehl stopListening(); ausgeführt werden.

Um generell auf Daten zu warten, muss der Befehl startListening(); gesetzt werden. Erst dann kann das Arduino Daten empfangen.

Die Programme sind so geschrieben, das der Empfänger sofort mit der Ausgabe der Daten beginnt, sobald er diese bekommt. Und genau das ist das schöne an den Module: Es ist keine Koppelung nötig. Die Daten werden einfach gesendet, und wer die richtige Adresse hat, der empfängt sie.

Falls noch Fragen offen sind: Ein Kommentar ist immer erwünscht!