Header image Ingenieur, Vater, Heimwerker, Problemlöser

20 März, 2016

ESP8266 als Arduino-Plattform

TL;DR:

Ein Arduino (Uno) kostet ca. 20 EUR. Mit dem Arduino Pro Mini für ca. 10 EUR geht es noch etwas billiger. Ein ESP8266 hingegen kostet ca. 2 EUR, als Dev-Board um 4 EUR. Zudem bietet die Alternative noch ein paar mehr Features wie WiFi, I2C an jedem beliebigen Pin oder die höhere PWM-Auflösung. Mit der Arduino IDE lässt sich der ESP8266 dank dieses Projekts verwenden als sei es ein Arduino.

Installation

Bevor der ESP8266 benutzt werden kann, muss es als Board in der Arduino IDE installiert werden. Dazu unter Preferences bei Additional Board Manager URLs folgende URL angeben:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Arduino IDE

Anschließend kann unter Tools -> Board Manager ... das neue Board ausgewählt und installiert werden. Das war es auch schon. Nun kann das Board wie gewohnt aus dem Menü ausgewählt werden.

Arduino IDE

Hello WiFi

Zum Testen schreiben wir einen kleinen Webserver, der auf dem ESP8266b läuft und über zwei URLs eine LED an bzw. wieder aus macht. Die Dokumentation ist hier extrem hilfreich. Auch unerlässlich ist die Pinbelegung des verwendeten Boards/Moduls. Hier das für den Wemos D1 Mini (die türkisen Nummern sind die für uns relevanten)

Arduino IDE

Für unser Beispiel verwenden wir D8, an den wir eine LED gegen Ground anschließen. Wir können im Code entweder D8 oder 15 verwenden.

Der Code selbst ist im Grunde recht simpel. Zu Beginn definieren wir zwei Konstanten für die SSID und das Passwort. In der setup() Funktion wird die WLan-Verbindung aufgebaut und so lange gewartet bis diese steht. Danach wird die vom DHCP-Server zugewiesene IP auf der seriellen Console ausgegeben. Danach wird der Webserver gestartet.

In der loop() Funktion warten wir auf neue Verbindungen. Kommt ein neuer Request, untersuchen wir die erste Zeile, die bei HTTP die Methode (GET, POST, ...) und die URL enthält. Wir interessieren uns nur für die URL, über die wir entscheiden was wir machen. Ist der Substring /on enthalten, schalten wir die LED an D8 an, ist /off enthalten, schalten wir sie aus. Alle anderen URLs ignorieren wir. Zum Schluss senden wir noch eine minimale Response.

#include <ESP8266WiFi.h>

const char* ssid = "ba_nomap";
const char* pass = "sup3rS3cr3t";
WiFiServer server(80);

void setup() {
  pinMode(D8, OUTPUT);

  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) delay(500);

  Serial.begin(115200);
  Serial.println(WiFi.localIP());

  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  if (!client) return;

  while (!client.available()) delay(1);

  String request = client.readStringUntil('\r');
  client.flush();

  Serial.print(request);
  if (request.indexOf("/on") != -1)
    digitalWrite(D8, 1);
  else if (request.indexOf("/off") != -1)
    digitalWrite(D8, 0);
  else {
    client.stop();
    return;
  }

  client.print("HTTP/1.1 200 OK\r\n");
  client.flush();
}

Flashen wir nun das Programm auf den ESP8266 und starten es. Es dauert einen Moment, dann sollte eine IP-Adresse auf der seriellen Console auftauchen. Gibt man diese IP, gefolgt von /on im Browser ein, leuchtet die LED auf. Mit /off lässt sich diese wieder ausschalten.

Wie man sieht, alles keine Black Magic, dieses Internet of Things :)