/* Connecting Everyday Things – Things über MQTT: Arduino Uno R4 WiFi + Grove Der Uno verbindet sich per WLAN mit einem MQTT-Broker und erscheint in Things als eigene Station – ganz ohne Browser und ohne USB-Kabel am Rechner. Zwei Broker zur Wahl (Einstellung LOKAL unten): LOKAL 0 connectingeverydaythings.com:8883 – über das Internet, verschlüsselt LOKAL 1 Mac mini im eigenen Netz, Port 1883 – funktioniert auch ohne Internet; solange Internet da ist, sind beide Broker gekoppelt (gleiche Themen). sendet: cet///poti 0–1023 (Grove-Drehpotentiometer an A0) cet///taster 0 / 1 (Grove-Taster an D4) empfängt: cet///led 0–255 (Grove-LED an D5, PWM) cet///ton Hz, 0=aus (Grove-Summer an D6) In Things (gleicher Kanal) erscheint die Station unter "Andere Stationen". Um die LED zu steuern: Verbindung anlegen, Ziel "MQTT-Thema", Thema z. B. werkbank/led. Benötigt: Board-Paket "Arduino UNO R4 Boards" (Werkzeuge → Board → Boardverwalter) Bibliothek "ArduinoMqttClient" (Werkzeuge → Bibliotheken verwalten) Grove Base Shield V2 (Schalter auf 5V) */ #include #include // ======================= Einstellungen ======================= const char WLAN_NAME[] = "MEIN-WLAN"; const char WLAN_PASS[] = "mein-wlan-passwort"; const char MQTT_USER[] = "kurs"; const char MQTT_PASS[] = "mqtt-passwort"; // vom Kursleiter const char KANAL[] = "5"; // Things-Kanal const char STATION[] = "werkbank"; // Name dieser Station (ohne Leerzeichen) #define LOKAL 0 // 0 = netcup (Internet), 1 = Mac mini im eigenen Netz #if LOKAL const char BROKER[] = "192.168.178.79"; // Adresse des Mac mini im WLAN const int PORT = 1883; // unverschlüsselt, nur im eigenen Netz #else const char BROKER[] = "connectingeverydaythings.com"; const int PORT = 8883; // MQTT über TLS #endif // ============================================================= const int POTI = A0; // Grove-Buchse A0 const int TASTER = 4; // Grove-Buchse D4 const int LED = 5; // Grove-Buchse D5 (PWM) const int SUMMER = 6; // Grove-Buchse D6 #if LOKAL WiFiClient netz; #else WiFiSSLClient netz; #endif MqttClient mqtt(netz); String basis; // "cet/5/werkbank/" int letzterPoti = -100, letzterTaster = -1; unsigned long zuletztGesendet = 0, zuletztPoti = 0; void setup() { Serial.begin(115200); pinMode(TASTER, INPUT); pinMode(LED, OUTPUT); pinMode(SUMMER, OUTPUT); basis = String("cet/") + KANAL + "/" + STATION + "/"; verbinden(); } void loop() { if (WiFi.status() != WL_CONNECTED || !mqtt.connected()) verbinden(); mqtt.poll(); // Befehle empfangen, Verbindung halten unsigned long jetzt = millis(); // Poti: höchstens 10x pro Sekunde, nur bei Änderung (oder alle 2 s zur Sicherheit) if (jetzt - zuletztPoti >= 100) { zuletztPoti = jetzt; int poti = analogRead(POTI); if (abs(poti - letzterPoti) > 3 || jetzt - zuletztGesendet > 2000) { senden("poti", poti); letzterPoti = poti; zuletztGesendet = jetzt; } } // Taster: sofort bei Änderung int taster = digitalRead(TASTER); if (taster != letzterTaster) { senden("taster", taster); letzterTaster = taster; } } void senden(const char* signal, int wert) { mqtt.beginMessage(basis + signal); mqtt.print(wert); mqtt.endMessage(); } void empfangen(int laenge) { String thema = mqtt.messageTopic(); String text = ""; while (mqtt.available()) text += (char)mqtt.read(); int wert = text.toInt(); if (thema.endsWith("/led")) { analogWrite(LED, constrain(wert, 0, 255)); } else if (thema.endsWith("/ton")) { if (wert > 0) tone(SUMMER, wert); else noTone(SUMMER); } // Eigene Befehle hier ergänzen: else if (thema.endsWith("/motor")) { … } } void verbinden() { while (WiFi.status() != WL_CONNECTED) { Serial.print("WLAN verbinden mit "); Serial.println(WLAN_NAME); WiFi.begin(WLAN_NAME, WLAN_PASS); delay(3000); } Serial.print("WLAN ok, IP "); Serial.println(WiFi.localIP()); // eindeutige Kennung, damit sich zwei Boards nicht gegenseitig abmelden mqtt.setId(String(STATION) + "-" + String(random(0xFFFF), HEX)); mqtt.setUsernamePassword(MQTT_USER, MQTT_PASS); while (!mqtt.connect(BROKER, PORT)) { Serial.print("MQTT-Fehler "); Serial.print(mqtt.connectError()); Serial.println(" (-2 = keine Verbindung/TLS, 5 = Benutzer/Passwort falsch) – neuer Versuch …"); delay(3000); } Serial.println("MQTT verbunden"); mqtt.onMessage(empfangen); mqtt.subscribe(basis + "led"); mqtt.subscribe(basis + "ton"); letzterPoti = -100; letzterTaster = -1; // nach dem Verbinden alles einmal senden }