#define VERSION "\n\n---- MQTT_led demo sketch V1.06 @kas2015 ----" /* Demo sketch for MQTT Commander V1.X (Android App) * will work with any MQTT client with setup as follow: * - Client publish using 'led' topic messages: ON OFF or STATUS * - Client should subscribe to 'feedback' to receive current state: Light or Light * more details here: http://www.esp8266.com/viewtopic.php?f=29&t=3950&hilit=MQTT+Commander * MQTT_led will check for connection loss and try to reconnect * * Suggested PC MQTT client: https://github.com/kamilfb/mqtt-spy/wiki/Downloads */ #include #include // ** MQTT library from http://github.com/Imroy/pubsubclient ** #include #define LED 0 // led connected to GPIO 0 #define BUTTON 2 // button connected to GPIO 2 extern "C" { #include "user_interface.h" } const char* clientID = "MQTTkas"; // client ID // ------------------------------------------------------------------------------- // ** User settings ** // ------------------------------------------------------------------------------- // Your specific WiFi network credentials --------------------------------------- const char* ssid = "XXXXXXXXXXXX"; // Router SSID const char* pass = "XXXXXXXXXXXX"; // Router Pass // Your specific MQTT broker parameters ---------------------------------------- const char* serverURI = "m20.cloudmqtt.com"; // mqtt broker URL const uint16_t port = 18084; // mqtt broker Port const char* user_name = "XXXXXXXX"; // Mqtt personal User name const char* password = "XXXXXXXX"; // Mqtt personal Password // -------------------------------------------------------------------------------- // -------------------------------------------------------------------------------- const long connectionCheckInterval = 30000; // connection checked every 30 seconds long previousMillis = 0; // unsigned long count = 0; // Button press time counter boolean sendStatus = false; // force feedback boolean requestRestart = false; // force reboot WiFiClient wclient; PubSubClient client(wclient, serverURI, port); Ticker btn_timer; void callback(const MQTT::Publish& pub) { // handle incoming message Serial.print("received: "); Serial.print(pub.topic()); Serial.print("=> "); Serial.print(pub.payload_string()); if((pub.payload_string() == "ON") || (pub.payload_string() == "on")) { digitalWrite(LED, HIGH); client.publish("feedback", "Light "); Serial.println("\tsent: feedback=> Light "); } else if((pub.payload_string() == "OFF") || (pub.payload_string() == "off")) { digitalWrite(LED, LOW); client.publish("feedback", "Light "); Serial.println(" \tsent: feedback=> Light "); } else if((pub.payload_string() == "STATUS") || (pub.payload_string() == "status") || (pub.payload_string() == "STAT") || (pub.payload_string() == "stat")) { sendStatus = true; } else { client.publish("feedback", "?? " + pub.payload_string()); Serial.print(" \tsent: feedback=> ???? '"); Serial.print(pub.payload_string()); Serial.println("'"); } } void setup() { Serial.begin(57600); pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT_PULLUP); btn_timer.attach(0.05, btn_handle); delay(10); client.set_callback(callback); Serial.print(VERSION); Serial.print("\n>> Connecting to "); Serial.print(ssid); Serial.print(" "); WiFi.begin(ssid, pass); int retries = 10; while ((WiFi.status() != WL_CONNECTED) && retries--) { delay(500); Serial.print(" +"); } if (WiFi.status() == WL_CONNECTED) { Serial.println("\n** Connected to WiFi router **"); Serial.print("\n>> Connecting to "); Serial.println(serverURI); delay(500); retries = 4; while (!client.connect(MQTT::Connect("arduinoClient").set_auth(user_name, password)) && retries--) { Serial.print("attempt #"); Serial.print(4-retries); Serial.println("/4"); delay(1000); } if(client.connected()) { // Connected to MQTT server Serial.println("** Connected to MQTT server **"); client.publish("feedback", "hello from esp8266"); Serial.println(" - sent: feedback=> hello from esp8266"); client.subscribe("led"); Serial.println(" - Subscribed to 'led'\n"); blinkLED(LED, 40, 3); } else Serial.println("\nfatal: MQTT server Connection failed"); } else Serial.println("\nfatal: WiFi router connection failed"); } void loop() { checkConnection(); checkReboot(); checkStatus(); client.loop(); } void checkReboot() { if(requestRestart) { // reboot requested blinkLED(LED, 200, 4); // blink led system_restart(); } } void checkConnection() { static long previousMillis = 0; long currentMillis = millis(); boolean isConnected = true; if(currentMillis - previousMillis > connectionCheckInterval) { previousMillis = currentMillis; if (WiFi.status() == WL_CONNECTED) { if (client.connected()) { Serial.println("Connection OK"); } else { Serial.println("mqtt NOT connected, ** reboot **"); requestRestart = true; } } else { Serial.println("WiFi NOT connected, ** reboot **"); requestRestart = true; } } } void btn_handle() { if(!digitalRead(BUTTON)){ count++; } else { if (count > 1 && count <= 40) { //push between 50 ms and 2 sec Serial.print("Switching light "); Serial.print((digitalRead(LED)?"ON\t":"OFF\t")); digitalWrite(LED, !digitalRead(LED)); // if(digitalRead(LED)==LOW) client.publish("feedback", "Status: "); // unexpected reboot !!! // if(digitalRead(LED)==HIGH) client.publish("feedback", "Status: "); // unexpected reboot !!! sendStatus = true; // >> client.publish() moved to checkFeedback() } else if (count >40){ // requested reboot Serial.print("button pressed "); Serial.print(count*0.05); Serial.println("s requested reboot !!"); requestRestart = true; } count=0; } } void checkStatus() { if(sendStatus) { // publish 'status' requested if(digitalRead(LED) == HIGH) { client.publish("feedback", "Status: "); Serial.println("sent: feedback=> Status: "); } else { client.publish("feedback", "Status: "); Serial.println("sent: feedback=> Status: "); } sendStatus = false; } } void blinkLED(int pin, int duration, int n) { for(int i=0; i