09.09.2015

Schalten und walten über WLAN mit ESP8266

Letztes Jahr kam ein revolutionärer Baustein aus China angereist. Der ESP8266. Ganz harmlos als Wandler serielle Schnittstelle zu WLAN angekündigt. Das Teil kann über AT-Befehle angesprochen werden, ähnlich wie bei einem Modem.  Alleine das hatte bei vielen Bastlern schon für Pipi in den Augen geführt. Und der Preis von 2-5€ pro Stück macht die Sache recht interessant.

Und so dauerte es nicht lange, bis die Bastlergemeinde das Teilchen über Arduino UNO usw. als Messwerterfassung eingesetzt haben. Andere Spezis haben aber schnell erkannt, der Baustein selbst ist leistungsstärker als ein UNO, kommt eher so an den Arduino Due heran. Was liegt also näher, als den Umweg über einen zweiten Prozessor zu vermeiden? Zudem die Herstellerfirma sogar eine SDK herausgegeben hat, welches eigene Projekte erleichtert, zumindest für Leute, welche sich gut damit auskennen. Und dazu gehöre ich nicht.


Aber inzwischen haben sich ein paar findige Köpfe zusammengerauft und das unmögliche möglich gemacht: Sie haben den Baustein frech in das Arduino-Programmiersystem eingefügt. Wie geil ist das denn? Und so kann nun jeder Bastler den ESP8266 einfach für seine Zwecke umprogrammieren. Die Bibliotheken wurden so geschrieben, daß sogar vielen kompatibel zu den Standard-Arduino-Routinen ist.

Was braucht man?
Einen USB-Seriell Schnittstellenwandler, vorzugsweise FTDI232, welcher auch 3,3Volt ausgeben kann.

Natürlich den ESP8266. Dabei ist es erstmal egal, welche Version. Für die Grobmotoriker empfehle ich die Version 1. Diese hat zwar wenig Ein- Ausgabeports, ist aber ohne Probleme mit Pfostensteckern und Jumpern zu nutzen. Bei den anderen muss man schon gut löten können.

Ein paar Taster, Widerstände, etwa 10kOhm als Pull-Up für die Ports. Transistor- oder IC-Stufen, wenn man Ausgänge zum schalten nutzen will.

Und natürlich ein Netzteil mit 3,3Volt. Ach ja, und da das Modul beim senden kurze Stromspitzen zieht, auch noch einen Kondensator 10uF oder mehr. Das war schon grob die Hardware.

An der Softwarefront ist es noch simpler:
Ein aktuelles Arduino (mindestens 1.6.5) 
Und als nächstes die ESP8266-Version dort installieren.
Arduino starten, Datei -> Voreinstellungen -> Additional Board Manager URLs:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
mit OK abschliessen und neu starten. Dann unter Werkzeuge nachsehen, ob unter dem Boards auch ESP8266 vorhanden sind. Dann den "Generic" auswählen oder welcher dem vorhandenen Baustein am ähnlichsten erscheint. ;) Notfalls unter Board Manager die Boards freigeben, wenn es nicht automatisch geschehen ist.

Fertig.

Nun kann man nach Belieben Sketche schreiben. Muster sind unter Beispiele genug vorhanden. Ich empfehle den HelloServer. Dort kann man mit wenig Aufwand die ersten Erfolgserlebnisse haben.

Wenn man dann erfolgreich war, geht es ans Hochladen. Nun kommen die Taster ins Spiel. Ich verweise dort mal auf den Beitrag hier. Dort ist es gut beschrieben.


In der Arduino-IDE auf hochladen klicken. Während das Programm kompiliert, was länger dauert als beim UNO, kann man schonmal den ESP8266 in den Programmiermodus schalten. Taste GPIO0 drücken und gedrückt lassen, dann RST kurz drücken, Dann GPIO0 loslassen. Alles unverkrampft. Ist unkritisch. Und wenn es beim ersten Mal nicht klappt, nochmal versuchen. Wenn das Programm hochgeladen ist, Reset drücken, etwas warten, bis sich der Baustein mit dem heimischen WLAN verbunden hat.

So, hier mal ein Praxisbeispiel:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
String  ausgabe1, ausgabe2, ausgabe3;
const char* ssid = "NamedesZugangspunktes";
const char* password = "geheim";
MDNSResponder mdns;

ESP8266WebServer server(80);

const int led = 13;

void handleRoot()

{
  digitalWrite(led, 1);
  
  if (digitalRead(2))
  {
    ausgabe2 = "Achtung! Behaelter voll!\n";
  }
  else
  {
   ausgabe2 = "OK. Behaelter leer.     \n";
  };

  server.send(200, "text/plain", ausgabe2);
  digitalWrite(led, 0);
}

void handleNotFound(){
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void){
  pinMode(led, OUTPUT);
  pinMode(0, OUTPUT);
  digitalWrite(led, 0);
  digitalWrite(0, 0);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }
  
  server.on("/", handleRoot);
  
  server.on("/inline", [](){
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);
  
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();

In diesem Beispiel wird GPIO2 verwendet. Diesen habe ich mit 10kOhm Widerstand nach Plus verbunden und zwischen GPIO2 und Masse einen LDR (lichtempfindlicher Widerstand) angeschlossen. Update: Da beim Start beide GPIOs auf High liegen müssen, musste ich Schaltung und Programm leicht modifizieren. Der LDR wird nun an GPIO 0 und GPIO 2 angeschlossen. Der GPIO 0 wird in der Setup-Phase als Ausgang definiert und auf Low gesetzt. Dann funktioniert auch ein Neustart bei beleuchteten LDR. War eine böse Falle. ;) Den LDR habe ich an die Betriebskontrollleuchte des Gerätes angeklebt, welches ich aus der Ferne überwachen will. Natürlich kann man die Ports auch als Ausgänge verwenden, brav nach Arduino-Manier.

In meinem Musteraufbau habe ich als Spannungsregler einen AMS 1117-3,3V genommen und ihn zusammen mit zwei SMD-Kondensatoren 10uF auf die Lötseite der Lochrasterplatine gelötet. Zu Anfang wollte ich noch alles über Steckbuchsen realisieren. Jedoch hat die Faulheit gesiegt. ;)

Musteraufbau auf Lochrasterplatine

Der ganze Kram war innerhalb von 30 Minuten zusammengelötet.

Nun noch die Platine zurechtknabbern...

... bis sie in das Gehäuse passt. Als Stromversorgung muss ein altes Nokia-Handy-Netzteil herhalten.
FERTIG!


(ToDo: Schaltplan)