From a7ae377720d5e3031ba6292b22f60efd20a7e1f3 Mon Sep 17 00:00:00 2001 From: Todd Treece Date: Wed, 6 Jul 2016 13:44:35 -0400 Subject: [PATCH] add adafruit io error subscription example --- .../adafruitio_errors_esp8266.ino | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 examples/adafruitio_errors_esp8266/adafruitio_errors_esp8266.ino diff --git a/examples/adafruitio_errors_esp8266/adafruitio_errors_esp8266.ino b/examples/adafruitio_errors_esp8266/adafruitio_errors_esp8266.ino new file mode 100644 index 0000000..ce43b78 --- /dev/null +++ b/examples/adafruitio_errors_esp8266/adafruitio_errors_esp8266.ino @@ -0,0 +1,166 @@ +/*************************************************** + Adafruit MQTT Library ESP8266 Example + + Must use ESP8266 Arduino from: + https://github.com/esp8266/Arduino + + Works great with Adafruit's Huzzah ESP board & Feather + ----> https://www.adafruit.com/product/2471 + ----> https://www.adafruit.com/products/2821 + + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + Written by Tony DiCola for Adafruit Industries. + Error examples by Todd Treece for Adafruit Industries. + MIT license, all text above must be included in any redistribution + ****************************************************/ +#include +#include "Adafruit_MQTT.h" +#include "Adafruit_MQTT_Client.h" + +/************************* WiFi Access Point *********************************/ + +#define WLAN_SSID "...your SSID..." +#define WLAN_PASS "...your password..." + +/************************* Adafruit.io Setup *********************************/ + +#define AIO_SERVER "io.adafruit.com" +#define AIO_SERVERPORT 1883 // 8883 for MQTTS +#define AIO_USERNAME "...your AIO username (see https://accounts.adafruit.com)..." +#define AIO_KEY "...your AIO key..." + +/************ Global State (you don't need to change this!) ******************/ + +// Create an ESP8266 WiFiClient class to connect to the MQTT server. +WiFiClient client; +// or... use WiFiFlientSecure for SSL +//WiFiClientSecure client; + +// Store the MQTT server, username, and password in flash memory. +// This is required for using the Adafruit MQTT library. +const char MQTT_SERVER[] PROGMEM = AIO_SERVER; +const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME; +const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; + +// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details. +Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, AIO_SERVERPORT, MQTT_USERNAME, MQTT_PASSWORD); + +/****************************** Feeds ***************************************/ + +// Setup a feed called 'photocell' for publishing. +// Notice MQTT paths for AIO follow the form: /feeds/ +const char PHOTOCELL_FEED[] PROGMEM = AIO_USERNAME "/feeds/photocell"; +Adafruit_MQTT_Publish photocell = Adafruit_MQTT_Publish(&mqtt, PHOTOCELL_FEED); + +// Setup a feed called 'onoff' for subscribing to changes. +const char ONOFF_FEED[] PROGMEM = AIO_USERNAME "/feeds/onoff"; +Adafruit_MQTT_Subscribe onoffbutton = Adafruit_MQTT_Subscribe(&mqtt, ONOFF_FEED); + +/*************************** Error Reporting *********************************/ + +const char ERROR_FEED[] PROGMEM = AIO_USERNAME "/errors"; +Adafruit_MQTT_Subscribe errors = Adafruit_MQTT_Subscribe(&mqtt, ERROR_FEED); + +const char THROTTLE_FEED[] PROGMEM = AIO_USERNAME "/throttle"; +Adafruit_MQTT_Subscribe throttle = Adafruit_MQTT_Subscribe(&mqtt, THROTTLE_FEED); + +/*************************** Sketch Code ************************************/ + +// Bug workaround for Arduino 1.6.6, it seems to need a function declaration +// for some reason (only affects ESP8266, likely an arduino-builder bug). +void MQTT_connect(); + +void setup() { + Serial.begin(115200); + delay(10); + + Serial.println(F("Adafruit MQTT demo")); + + // Connect to WiFi access point. + Serial.println(); Serial.println(); + Serial.print("Connecting to "); + Serial.println(WLAN_SSID); + + WiFi.begin(WLAN_SSID, WLAN_PASS); + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(); + + Serial.println("WiFi connected"); + Serial.println("IP address: "); Serial.println(WiFi.localIP()); + + // Setup MQTT subscription for onoff feed + mqtt.subscribe(&onoffbutton); + + // Setup MQTT subscriptions for throttle & error messages + mqtt.subscribe(&throttle); + mqtt.subscribe(&errors); + +} + +uint32_t x=0; + +void loop() { + // Ensure the connection to the MQTT server is alive (this will make the first + // connection and automatically reconnect when disconnected). See the MQTT_connect + // function definition further below. + MQTT_connect(); + + // this is our 'wait for incoming subscription packets' busy subloop + // try to spend your time here + Adafruit_MQTT_Subscribe *subscription; + while ((subscription = mqtt.readSubscription(5000))) { + if (subscription == &onoffbutton) { + Serial.print(F("Got onoff: ")); + Serial.println((char *)onoffbutton.lastread); + } else if(subscription == &errors) { + Serial.print(F("ERROR: ")); + Serial.println((char *)errors.lastread); + } else if(subscription == &throttle) { + Serial.println((char *)throttle.lastread); + } + } + + // Now we can publish stuff! + Serial.print(F("\nSending photocell val ")); + Serial.print(x); + Serial.print("..."); + if (! photocell.publish(x++)) { + Serial.println(F("Failed")); + } else { + Serial.println(F("OK!")); + } + +} + +// Function to connect and reconnect as necessary to the MQTT server. +// Should be called in the loop function and it will take care if connecting. +void MQTT_connect() { + int8_t ret; + + // Stop if already connected. + if (mqtt.connected()) { + return; + } + + Serial.print("Connecting to MQTT... "); + + uint8_t retries = 3; + while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected + Serial.println(mqtt.connectErrorString(ret)); + Serial.println("Retrying MQTT connection in 5 seconds..."); + mqtt.disconnect(); + delay(5000); // wait 5 seconds + retries--; + if (retries == 0) { + // basically die and wait for WDT to reset me + while (1); + } + } + Serial.println("MQTT Connected!"); +}