Zum Inhalt

Modul 4: Ampelsteuerung

In Modul 4 wird eine Ampelsteuerung programmiert, die man mit dem Topic city/traffic_light/emergency in den Not- und Nachtbetrieb schalten kann.

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-traffic-lights");
  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

Wie du LEDs blinken lässt, hast du oben schon gelernt. Bei unseren Ampeln ist die Logik umgekehrt, d.h. LOW schaltet eine Farbe ein, HIGH schaltet sie aus. Für eine richtige Ampel musst du natürlich die Phasen einhalten:

Wenn deine Schaltung funktioniert, kannst du die LEDs durch eine der Ampeln aus der Smart Ciy ersetzen. Verbinde auch die anderen Ampeln.

Deine Aufgabe

Nun setzt du die Puzzleteile zusammen:

  • In der callback Funktion überprüfst du, ob die Ampel in den Notbetrieb geschaltet werden soll
  • Wenn Normalbetrieb gefordert wurde, schaltest du die normalen Ampelphasen weiter durch
  • Wenn der Notbetrieb gefordert wurde, lässt du alle gelben LEDs blinken

Überprüfe mithilfe des MQTT Viewer, ob die Nachrichten korrekt verarbeitet werden.