Zum Inhalt

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);
}
Wenn du auf den Rechtspfeil oben in der Leiste klickst, wird der Code auf den Arduino geladen. Du solltest nun die LED blinken sehen.

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();
}
Überprüfe mithilfe des MQTT Viewer, ob du Nachrichten empfangen kannst.

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 callback Funktion ü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.