Modul 3: Laternen¶
Ziel dieses Moduls ist es, die Laternen in der Smart City anzusteuern. Auf dieser Karte findest du die Positionen der Laternen:

Um die Laternen ein und auszuschalten, wird das MQTT-Topic city/lantern/1 verwendet.
Die Zahl ist dabei durch die jeweilige Nummer der Laterne (siehe Karte) zu ersetzen.
Sendet jemand den Wert 0 and das Topic, musst du die entsprechende Laterne ausschalten, andernfalls einschalten.
Vorbereitung¶
Zum Programmieren des Arduino verwendest du die Arduino IDE:

Im Hauptfenster kannst du Code eingeben. Der Code in setup wird genau einmal beim Start ausgeführt, der unter loop dauerhaft in einer Endlosschleife.
Füge nun folgenden Code ein, um die interne LED blinken zu lassen:
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
Als nächstes wollen wir den Arduino mit unserem MQTT-Broker verbinden.
Dafür verbinden wir uns zunächst mit dem freien WLAN-Hotspot otto hotspot:
#include <WiFi.h>
void setup() {
Serial.begin(9600);
WiFi.begin("otto hotspot");
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
}
Wenn du in der Ausgabe Connected! siehst, hast du dich erfolgreich mit dem Hotspot verbunden.
Als nächstes verbindest du dich mit dem MQTT-Broker:
#include <WiFiS3.h>
#include <ArduinoMqttClient.h>
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
void onMessage(int messageSize) {
String receivedTopic = mqttClient.messageTopic();
String receivedMessage = "";
while (mqttClient.available()) {
receivedMessage += (char)mqttClient.read();
}
Serial.println("---- MQTT message ----");
Serial.print("Topic: ");
Serial.println(receivedTopic);
Serial.print("Message: ");
Serial.println(receivedMessage);
Serial.println("----------------------");
}
void connectWiFi() {
Serial.print("Connecting WiFi");
WiFi.begin("otto hotspot");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("Connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void connectMQTT() {
Serial.print("Connecting MQTT");
mqttClient.setId("imiq-lab-laterns");
mqttClient.onMessage(onMessage);
while (!mqttClient.connect("imiq-lab.et.uni-magdeburg.de", 21883)) {
Serial.print("MQTT connection failed, error = ");
Serial.println(mqttClient.connectError());
delay(5000);
}
Serial.println("MQTT connected!");
}
void setup() {
Serial.begin(9600);
connectWiFi();
connectMQTT();
mqttClient.subscribe("#");
}
void loop() {
mqttClient.poll();
}
Info
Warte nun, bis alle Teilnehmenden sich mit dem Broker verbunden haben.
LEDs¶
Als Vorübung lässt du nun eine LED blinken. Wir nutzen hierfür ein Steckbrett:

Baue nun folgende Schaltung auf:

Mit folgendem Code lässt du die LED blinken:
void setup() {
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
}
Wenn deine Schaltung funktioniert, kannst du die LED durch eine der Laternen aus der Smart Ciy ersetzen. Verbinde auch die anderen Laternen.
Warning
Jede Laterne benötigt einen Vorwiderstand. Andernfalls wird sie beschädigt. Lass dir im Zweifel deine Schaltung vorher abnehmen.
Deine Aufgabe¶
Nun setzt du die Puzzleteile zusammen:
- In der
callbackFunktion überprüfst du, auf welchem Topic du eine Nachricht erhalten hast - Je nachdem, welche Laterne angesprochen wurde (letzte Zahl im Topic) schaltest du entsprechende Laterne ein oder aus
Überprüfe mithilfe des MQTT Viewer, ob die Nachrichten korrekt verarbeitet werden.