ESP8266 - Witty Cloud Modul

ESP8266 - Witty Cloud Modul

Das "Witty"-Modul ist eine komfortable Lösung, um einen ESP8266 leicht mit der Arduino-IDE zu programmieren. Neben der obligatorischen internen LED stehen zusätzlich noch drei weitere eingebaute Komponenten auf dem Board zur Verfügung: eine RGB-LED, ein LDR und ein Mikrotaster.

Das gesamte Modul besteht aus einem Doppelpack, der aus einem Programmer mit einem CH340G USB-Serial-Chip und den dem ESP8266-Board selbst besteht, welches als steckbarer Stapel geliefert wird. Vor allem für Prototypen eignet sich das Board sehr gut, weil man quasi direkt loslegen kann.

Spezifikationen laut Hersteller

Microkontroller ESP-8266 32-bit
Taktfrequenz 80MHz bzw. 160MHz
USB-Converter CH340G
USB-Anschluss Micro-B
Betriebsspannung 3,3V
Flash-Speicher 4MB
Digitale Ein-/Ausgänge 11
Analoge Eingänge 1 (A0 / 10-bit ADC)
Unterstützte Protokolle Seriell, SPI, I²C
WiFi 802.11 b/g/n
LDR Eingebauter LDR mit einem Dunkelwiderstand von 2,5kΩ bildet einen Spannungsteiler mit einem in Serie geschalteten 470Ω-Widerstand, der über ADC-Eingang eingelesen wird.
RGB-LED Eingebaute RGB-LED mit gemeinsamer Kathode

Verwendete Bauteile

Anschlüsse

Anschlüsse des ESP8266 Witty Moduls

(Im Bild nicht zu sehen: Der Mikrotaster liegt auf GPIO4.)

Einrichtung und Programmierung in der Arduino-IDE

Man fügt unter "Datei → Voreinstellungen → Zusätzliche Boardverwalter-URLs" folgende URL hinzu: http://arduino.esp8266.com/stable/package_esp8266com_index.json.
Falls schon eine andere URL in diesem Feld steht, kann diese mit einem Komma separiert werden.
Dann muss das ESP8266-Board hinzugefügt werden. Dazu geht man unter "Werkzeuge → Boards → Boardverwalter": Hier sucht man nach "esp8266" und installiert das Board:

Hinweis: Unter Microsoft Windows sollte darauf geachtet werden, dass der neueste Treiber CP210x USB to UART Bridge installiert ist, damit der Port erkannt wird.

Installation von ESP8266 in der Arduino-IDE

Wenn die Installation abgeschlossen ist, kann man nun im Menu "Werkzeuge → Boards" das gewünschte Board auswählen. In meinem Fall hat LOLIN(WEMOS) D1 R2 & mini gut funktioniert.
Nun kann man seine Sketches wie gewohnt kompilieren und auf das Board hochladen.

Auswahl des ESP8266-Boards in der Arduino-IDE

Ex. I: Blinkende LED und PWM

Der erste Versuch ist ein etwas erweiterter Blink-Sketch, der zunächst lang, dann kürzer die LED zum blinken bringt. Dann wird ein PWM-Signal gesendet, um die LED zu ein- dann auszudimmen.

#define PIN_LED 2

void setup()
{
    pinMode(PIN_LED, OUTPUT);
}

void loop()
{
    for (byte i = 0; i < 6; i++) {
        digitalWrite(PIN_LED, !digitalRead(PIN_LED));
        delay(500);
    }

    for (byte i = 0; i < 16; i++) {
        digitalWrite(PIN_LED, !digitalRead(PIN_LED));
        delay(50);
    }

    digitalWrite(PIN_LED, LOW);
    for (byte i = 0; i < 255; i++) {
        analogWrite(PIN_LED, i);
        delay(10);
    }

    digitalWrite(PIN_LED, HIGH);
    for (byte i = 255; i > 0; i--) {
        analogWrite(PIN_LED, i);
        delay(10);
    }
}

Hier wird die interne, blaue SMD-LED angesteuert, wobei anscheinend die Logik hier invertiert wurde, denn die LED leuchtet dann auf, wenn sie auf LOW gesetzt wird und erlischt beim Anlegen eines HIGH-Signals.

Ex. II: Eingebaute RGB-LED

Da die eingebaute RGB-LED eine gemeinsame Kathode besitzt, kann jede Farbe mit einem HIGH-Signal eingeschaltet werden. In der Praxis hat sich herausgestellt, dass die RGB-LED leicht glimmt, wenn man sie nicht explizit als OUTPUT deklariert bzw. die Ausgangssignale nicht auf LOW legt.
Mit dem folgendem Sketch rotieren die einzelnen Farb-Komponenten mittels eines Sinus-Funktion in allen möglichen Intensitäten durch und vermitteln so das gesamte Farbspektrum der RGB-LED.

#define PIN_RED   15
#define PIN_GREEN 12
#define PIN_BLUE  13

#define ROTATE_STEP  0.05
#define COLOR_OFFSET 0.05

byte    ledPins[3] = {PIN_RED, PIN_GREEN, PIN_BLUE};
float rgbValues[3] = {0.0, 0.0, 0.0};

void setup()
{
    for (byte i = 0; i < 3; i++) {
        pinMode(ledPins[i], OUTPUT);
    }
}

void loop()
{
    for (byte i = 0; i < 3; i++) {
        rgbValues[i] += (ROTATE_STEP + i * COLOR_OFFSET);
        if (rgbValues[i] > 2 * PI) {
            rgbValues[i] = 0.0;
        }
        analogWrite(ledPins[i], 127 + round(sin(rgbValues[i]) * 127));
    }

    delay(20);
}

Ex. III: Eingebauter LDR

Dieser Versuch liest die Werte des LDRs aus und schaltet die rote Komponente der RGB-LED ein, sobald ein gewisser Schwellwert (hier: 100) unterschritten wurde.

#define PIN_LDR A0
#define PIN_RED 15

void setup()
{
    pinMode(PIN_RED, OUTPUT);
}

void loop()
{
    if (analogRead(PIN_LDR) < 100) {
        digitalWrite(PIN_RED, HIGH);
    } else {
        digitalWrite(PIN_RED, LOW);
    }
    delay(100);
}

Ex. IV: Mikrotaster

Mit dem folgenden Sketch wird der Mikrotaster des Witty-Boards abgefragt und je nach Drückzustand wird eine blaue bzw. rote LED eingeschaltet. Hier zeigt sich wiederum, dass die interne LED mit invertierter Logik zu programmieren ist, damit sie das gewünschte Verhalten zeigt.

#define PIN_INT_LED 2
#define PIN_RED_LED 15
#define PIN_BUTTON  4

void setup()
{
    pinMode(PIN_INT_LED, OUTPUT);
    pinMode(PIN_RED_LED, OUTPUT);
}

void loop()
{
    if (digitalRead(PIN_BUTTON) == HIGH) {
        digitalWrite(PIN_INT_LED, LOW);
        digitalWrite(PIN_RED_LED, LOW);
    } else {
        digitalWrite(PIN_INT_LED, HIGH);
        digitalWrite(PIN_RED_LED, HIGH);
    }

    delay(30);
}

Ex. V: HTTP-Anfrage auf einen Webserver

Da das ESP8266-Board über eine WiFi-Schnittstelle verfügt, kann auch über ein lokales WiFi-Netwerk eine beliebige WWW-Adresse angefragt und ausgewertet werden, wie dieser Versuch zeigt.
Hierbei werden verschiedene Libraries für den ESP8266 verwendet, z.B.: ESP8266HTTPClient

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

ESP8266WiFiMulti WiFiMulti;
WiFiClient client;
HTTPClient http;

// WiFi settings:
const char* wifiSSID     = "mySSID";
const char* wifiPassword = "myPassword";

const char* hostServer = "http://elektro.turanis.de/";

void setup()
{
    Serial.begin(9600);
    while(!Serial) {}
    WiFi.mode(WIFI_STA);
    WiFiMulti.addAP(wifiSSID, wifiPassword);
}

void loop()
{
    if ((WiFiMulti.run() == WL_CONNECTED)) {
        Serial.printf("Connecting %s...\n", hostServer);
        if (http.begin(client, hostServer)) {
            // start connection and send HTTP header
            int httpCode = http.GET();

            // httpCode will be negative on error
            if (httpCode > 0) {
                // HTTP header has been send and Server response header has been handled
                Serial.printf("GET... code: %d\n", httpCode);

                // file found at server
                if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
                    String payload = http.getString();
                    Serial.println(payload);
                }
            } else {
                Serial.printf("GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
            }

            http.end();
        } else {
            Serial.printf("Unable to connect\n");
        }
    }

    delay(10000);
}

Weiterführende Links

zurück