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.
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 |
(Im Bild nicht zu sehen: Der Mikrotaster liegt auf GPIO4.)
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.
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.
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.
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);
}
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);
}
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);
}
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);
}