1 #include 2 #include 3 #include 4 5 namespace { 6 7 int const buttonPin = 0; 8 int const relayPin = 12; 9 int const ledPin = 13; 0 1 char const* mqttTopicSubscribe = "/test/sonoff/relay"; 2 char const* mqttTopicPublish = "/test/sonoff/button"; 3 char const* mqttClientId = "client-linuxmagazin"; 4 char const* mqttBroker = "rasppi3" 5 int const mqttPort = 1883; 6 7 uint16_t const otaPort = 8266; 8 char const* otaHostname = "linuxmagazin"; 9 0 uint8_t prevButtonVal; 1 ESP8266WiFiMulti wifiMulti; 2 WiFiClient wificlient; 3 PubSubClient client(wificlient); 4 5 static inline void blinkNum(size_t num, uint8_t pin) { 6 for (size_t cnt = 0; cnt < num; cnt++) { 7 digitalWrite(pin, LOW); 8 delay(100); 9 digitalWrite(pin, HIGH); 0 delay(100); 1 } 2 } 3 4 static void mqttCallback(char* topic, byte* payload, unsigned int length) { 5 Serial.print("MQTT message: '"); 6 for (unsigned int cnt = 0; cnt < length; cnt++) { 7 Serial.print((char)payload[cnt]); 8 } 9 Serial.print("' on topic '"); 0 Serial.print(topic); 1 Serial.println("'"); 2 3 if (length == 0) { 4 return; 5 } 6 7 switch (payload[0]) { 8 case '1': 9 digitalWrite(ledPin, LOW); // LED is active-low, so this turns it on 0 digitalWrite(relayPin, HIGH); 1 break; 2 case '0': 3 digitalWrite(ledPin, HIGH); // LED is active-low, so this turns it off 4 digitalWrite(relayPin, LOW); 5 break; 6 default: 7 Serial.print("MQTT: Unknown value"); 8 break; 9 } 0 } 1 2 static void mqttReconnect() { 3 while (!client.connected()) { 4 Serial.print("Attempting MQTT connection..."); 5 if (client.connect(mqttClientId)) { 6 Serial.println("connected"); 7 blinkNum(2, ledPin); 8 client.subscribe(mqttTopicSubscribe); 9 } else { 0 Serial.print("failed, rc="); 1 Serial.print(client.state()); 2 Serial.println(" try again in 5 seconds"); 3 delay(5000); 4 } 5 } 6 } 7 8 } 9 0 void setup() { 1 Serial.begin(115200); 2 Serial.println("Booting"); 3 4 Serial.println("Initializing inputs and outputs."); 5 pinMode(ledPin, OUTPUT); 6 pinMode(relayPin, OUTPUT); 7 pinMode(buttonPin, INPUT); 8 9 digitalWrite(ledPin, HIGH); 0 digitalWrite(relayPin, LOW); 1 prevButtonVal = digitalRead(buttonPin); 2 3 Serial.println("Initializing WiFi credentials."); 4 wifiMulti.addAP("SSID", "Password"); // bitte anpassen 5 6 Serial.print("Proceeding. Initializing ArduinoOTA. "); 7 ArduinoOTA.setPort(otaPort); 8 ArduinoOTA.setHostname(otaHostname); 9 ArduinoOTA.onStart([]() { 0 Serial.println("OTA Update Start"); 1 }); 2 ArduinoOTA.onEnd([]() { 3 Serial.println("\n OTA UPdate End"); 4 }); 5 ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { 6 Serial.printf("Progress: %u%%\r", (progress / (total / 100))); 7 }); 8 ArduinoOTA.onError([](ota_error_t error) { 9 Serial.printf("Error[%u]: ", error); 0 if (error == OTA_AUTH_ERROR ) Serial.println("Auth Failed"); 1 else if (error == OTA_BEGIN_ERROR ) Serial.println("Begin Failed"); 2 else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); 3 else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); 4 else if (error == OTA_END_ERROR ) Serial.println("End Failed"); 5 }); 6 7 client.setServer(mqttBroker, mqttPort); 8 client.setCallback(mqttCallback); 9 } 0 1 void loop() { 2 static auto connectionConfigured = false; 3 auto curButtonVal = digitalRead(buttonPin); 4 5 if (wifiMulti.run() == WL_CONNECTED) { 6 if (!connectionConfigured) { 7 ArduinoOTA.begin(); 8 Serial.println("WiFi Ready"); 9 Serial.print("IP address: "); 0 Serial.println(WiFi.localIP()); 1 connectionConfigured = true; 2 } 3 if (client.connected()) { 4 if (prevButtonVal != curButtonVal) { 5 client.publish(mqttTopicPublish, curButtonVal == HIGH ? "0" : "1"); 6 } 7 client.loop(); 8 } else { 9 mqttReconnect(); 0 } 1 } 2 else { 3 connectionConfigured = false; 4 } 5 6 ArduinoOTA.handle(); 7 prevButtonVal = curButtonVal; 8 }