In dem heutigen Versuch geht es um MQTT und um ein globales Projekt, das auch letztes Jahr vorgestellt wurde: nämlich das Cheerlights Projekt von Hans Schaaler. Für alle diejenigen, die das Projekt nicht kennen: Es geht um weltweit vernetzte bunte Lichter, die sich simultan über Twitter-Kommandos steuern lassen. Eine andere Version dieses Projekts war Teil des letztjährigen Adventskalenders. Dieses Jahr gibt es die Version mit MQTT und erweiterten Funktionen.
Hinter dem heutigen Türchen befindet sich ein Widerstand mit 1 kOhm. Der Aufbau besteht aus der RGB-LED mit Vorwiderständen und einem Taster.

Laden Sie das Programm des heutigen Tages herunter. Bevor Sie das Programm aber auf den NanoESP übertragen können, müssen Sie zunächst eine Library installieren. Es geht um die Crossfade-Library von Radek Wierzbicki (Quelle: https://github.com/radekw/Arduino/tree/5f24ce7c8db9dfbb5252b59824c3217d851b3a3c). Aus praktischen Gründen ist eine Kopie der verwendeten Library-Version als Zip-Datei im Sketchordner enthalten. Diese können Sie einfach über den Library Manger in die Arduino IDE einfügen, indem Sie unter Sketch-> Bibliothek einbinden -> .Zip-Bibliothek einbinden das Zip-Verzeichnis im Sketchordner auswählen. Nun kompiliert das Programm und Sie können es auf den NanoESP hochladen.
Das Programm: A16_P22_MQTT_Cheerlights.ino
/*
MQTT Cheerlights
Change SSID and PASSWORD.
*/
#include <NanoESP.h>
#include <NanoESP_MQTT.h>
#include <SoftwareSerial.h>
#include <RGBLED.h>
#include <RGBColor.h>
//#define SSID "YourSSID"
//#define PASSWORD "YourPassword"
#define LED_WLAN 13
#define RED 3
#define GREEN 5
#define BLUE 6
#define GND 4
#define BUTTON 7
NanoESP nanoesp = NanoESP();
NanoESP_MQTT mqtt = NanoESP_MQTT(nanoesp);
RGBLED rgbLED = RGBLED(RED, GREEN, BLUE, 0, 3, 0);
RGBColor red = RGBColor(100, 0, 0);
RGBColor green = RGBColor(0, 100, 0);
RGBColor blue = RGBColor(0, 0, 100);
RGBColor cyan = RGBColor(0, 100, 100);
RGBColor white = RGBColor(100, 100, 100);
RGBColor warmwhite = RGBColor(100, 87, 87);
RGBColor purple = RGBColor(50, 0, 50);
RGBColor magenta = RGBColor(100, 0, 100);
RGBColor yellow = RGBColor(100, 100 , 0);
RGBColor orange = RGBColor(100, 65 , 0);
RGBColor pink = RGBColor(100, 75 , 100);
String ip, mqttId;
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
pinMode(GND, OUTPUT);
digitalWrite(GND, LOW);
pinMode(BUTTON, INPUT_PULLUP);
Serial.begin(19200);
nanoesp.init();
//! Only if you use a new Network
// nanoesp.configWifi(STATION, SSID, PASSWORD);
//Station Mode
nanoesp.configWifiMode(STATION);
//delay(1000);
// Wait till Connected to WiFi
if (nanoesp.wifiConnected())digitalWrite(LED_WLAN, HIGH); else Serial.println(F("Error WLAN Connect"));
//Print IP in Terminal
nanoesp.getIpMac( ip, mqttId);
Serial.println("My IP: " + ip);
//Print MQTTid in Terminal
mqttId.replace(":", "");
Serial.println("My MQTT ID: " + mqttId + "\n");
//if (mqtt.connect(0, "broker.hivemq.com", 1883, mqttId)) { //connect to alternative broker
if (mqtt.connect(0, "broker.fkainka.de", 1883, mqttId)) { //connect to broker
Serial.println(F("Connected to Broker"));
Serial.println(F("My personal Topic is:"));
Serial.println("NanoESP/" + mqttId + "/\n");
if (mqtt.subscribe(0, "NanoESP/" + mqttId + "/rgb/mode", 2, changeMode)) Serial.println("Subscribed to:\nNanoESP/" + mqttId + "/rgb/mode"); else Serial.println(F("Error Subscribe to rgb Mode"));
}
else {
Serial.println(F("error connecting"));
}
}
bool cheerlightsMode;
void loop() {
int id, len;
if (nanoesp.recvData(id, len)) {
mqtt.recvMQTT(id, len); //auto handle recieved data by defined functions
}
mqtt.stayConnected(0);
if (!digitalRead(BUTTON)) { //change cheerlights mode
mqtt_msg msgMode = {"NanoESP/" + mqttId + "/rgb/mode", String(!cheerlightsMode), 0, true}; //type: mqtt_msg (topic, msg, qos, retain)
if (mqtt.publish(0, &msgMode)) Serial.println(F("Changed mode\n"));
msgMode.value = "1";
while (!digitalRead(BUTTON)) {};
}
}
void changeMode(String value) {
if (value == "1") {
Serial.println("Cheerlights mode\n");
if (mqtt.unsubscribe(0, "NanoESP/" + mqttId + "/rgb/color")) Serial.println("Unsubscribed from: NanoESP/" + mqttId + "/rgb/color");
if (mqtt.subscribe(0, "Info/Cheerlights", 2, changeCheerlights)) Serial.println(F("Subscribed to Cheerlights"));
cheerlightsMode = true;
}
else {
Serial.println("Personal light mode\n");
if (mqtt.unsubscribe(0, "Info/Cheerlights")) Serial.println(F("Unsubscribed from Cheerlights")); else Serial.println(F("Error"));
if (mqtt.subscribe(0, "NanoESP/" + mqttId + "/rgb/color", 2, changeColor)) Serial.println("Subscribed to: NanoESP/" + mqttId + "/rgb/color");
cheerlightsMode = false;
}
}
void changeCheerlights(String color) {
Serial.println("New Cheerlights color : " + color);
if (color == "red") rgbLED.crossfade(red);
else if (color == "green") rgbLED.crossfade(green);
else if (color == "blue") rgbLED.crossfade(blue);
else if (color == "cyan") rgbLED.crossfade(cyan);
else if (color == "white") rgbLED.crossfade(white);
else if (color == "warmwhite") rgbLED.crossfade(warmwhite);
else if (color == "purple") rgbLED.crossfade(purple);
else if (color == "magenta") rgbLED.crossfade(magenta);
else if (color == "yellow") rgbLED.crossfade(yellow);
else if (color == "orange") rgbLED.crossfade(orange);
}
void changeColor(String value) {
Serial.println("New color: " + value);
//rgb(255,23,226)
value = value.substring(value.indexOf('(') + 1); //255,23,226)
int red = value.substring(0, value.indexOf(',')).toInt();
value = value.substring(value.indexOf(',' ) + 1); //23,226)
int green = value.substring(0, value.indexOf(',')).toInt();
value = value.substring(value.indexOf(',') + 1); //226)
int blue = value.substring(0, value.indexOf(')')).toInt();
RGBColor vColor = RGBColor(red, green, blue);
rgbLED.crossfade(vColor);
//for direct change
//analogWrite(RED, red); analogWrite(GREEN, green); analogWrite(BLUE, blue);
}
(Die frühere Einbettung über Arduino Create ist nicht mehr verfügbar; der Code stammt aus dem Download aller Programme.)
Nach dem Hochladen des Programms gehen Sie nun wieder auf die Seite www.hivemq.com/try-out/ und bauen eine Verbindung zu dem Broker broker.hivemq.com auf. Dort können Sie mit dem Topic
NanoESP/mqttId /rgb/mode
den Modus zwischen Cheerlights und persönlicher Farbe wechseln, indem Sie eine 1 oder eine 0 publishen. Wichtig ist, dass Sie bei allen Nachrichten die Retain-Checkbox aktivieren bevor Sie die Nachricht mit dem Publish-Button rechts daneben abschicken. Retain bedeutet so etwas wie Behalten, denn der Broker behält die Nachricht gespeichert. Sobald ein Gerät nun das Thema subscribed, wird die gespeicherte Nachricht umgehend an das Gerät übermittelt. Sie können damit also Zustände speichern. Der Button, der sich auf dem Steckboard befindet, schaltet übrigens ebenfalls den Modus über eine Nachricht mit Retain-Flag um. Sie müssen später also nicht immer zur Try-Out Seite um dem Modus umzuschalten.
Im persönlichen Modus (mode 0) können Sie der RGB-LED eine Farbe verpassen, indem Sie im Topic
NanoESP/mqttId /rgb/color
eine Nachricht nach der Form
rgb(X,X,X)
publishen. Das X steht hier jeweils für einen PWM-Wert zwischen 0 und 255. Die Reihenfolge der Farben ist rot, grün, blau. Für eine grüne Farbe mit maximaler Helligkeit müssen Sie also
rgb(0,255,0)
publishen. Vergessen Sie nicht die Retain-Box zu aktivieren.
Im Cheerlights Modus (mode 1) subscribt das Board zu einem Topic, zu dem die aktuelle Cheerlights-Farbe veröffentlicht wird. Sie können diese Farbe verändern, indem Sie eine Twitter-Nachricht verfassen und damit Ihre, und auch die Farbe aller anderen Cheerlights Nutzer verändern. Die Nachricht muss zum einen #Cheerlights, @Cheerlights oder einfach nur das Stichwort Cheerlights enthalten und zum anderen eine der vordefinierten Farben hinter dem Stichwort stehen haben. Zu den vordefinierten Farben gehören:
red, green, blue, cyan, white, warmwhite, purple, magenta, yellow, orange, pink
Ein möglicher Tweet lautet also:
Testing my #cheerlights #MQTT project on my #NanoESP with the color blue
Damit geben Sie sich und der ganzen Welt eine neue Farbe. Falls Sie aber ihre persönliche Farbe bevorzugen, ohne dass jemand dazwischen funkt, schalten Sie einfach wieder auf den persönlichen Modus um und schon wechselt die LED wieder zu ihrer vordefinierten Farbe.

Zitat "Es geht um die Crossfade-Library von Radek Wierzbicki (Quelle: https://github.com/radekw/Arduino/tree/5f24ce7c8db9dfbb5252b59824c3217d851b3a3c). Aus praktischen Gründen ist eine Kopie der verwendeten Library-Version als Zip-Datei im Sketchordner enthalten. "
hab weder eine passende .zip im gesamten Arduino Verzeichnis gefunden noch bei ardekw das passende Teil. Es gibt nix mit Namensteilen wie github, ardek w oder crossfade…
wie heisst denn die Library genau? wo kann ich sie finden?