#include #include #include "Adafruit_FONA.h" #include "Adafruit_MQTT.h" #include "Adafruit_MQTT_FONA.h" /*************************** FONA Pins ***********************************/ #define FONA_RX 2 #define FONA_TX 3 #define FONA_RST 4 SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX); Adafruit_FONA fona = Adafruit_FONA(FONA_RST); /************************* WiFi Access Point *********************************/ // Optionally configure a GPRS APN, username, and password. // You might need to do this to access your network's GPRS/data // network. Contact your provider for the exact APN, username, // and password values. Username and password are optional and // can be removed, but APN is required. #define FONA_APN "" #define FONA_USERNAME "" #define FONA_PASSWORD "" /************************* Adafruit.io Setup *********************************/ #define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 #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!) ******************/ // Store the MQTT server, client ID, 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_CLIENTID[] PROGMEM = AIO_KEY; const char MQTT_USERNAME[] PROGMEM = AIO_USERNAME; const char MQTT_PASSWORD[] PROGMEM = AIO_KEY; // Setup the FONA MQTT class by passing in the FONA class and MQTT server and login details. Adafruit_MQTT_FONA mqtt(&fona, MQTT_SERVER, AIO_SERVERPORT, MQTT_CLIENTID, MQTT_USERNAME, MQTT_PASSWORD); // You don't need to change anything below this line! #define halt(s) { Serial.println(F( s )); while(1); } // FONAconnect is a helper function that sets up the FONA and connects to // the GPRS network. See the fonahelper.cpp tab above for the source! boolean FONAconnect(const __FlashStringHelper *apn, const __FlashStringHelper *username, const __FlashStringHelper *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); /*************************** Sketch Code ************************************/ // How many transmission failures in a row we're willing to be ok with before reset uint8_t txfailures = 0; #define MAXTXFAILURES 3 void setup() { while (!Serial); Serial.begin(115200); Serial.println(F("Adafruit FONA MQTT demo")); mqtt.subscribe(&onoffbutton); // Initialise the FONA module while (! FONAconnect(F(FONA_APN), F(FONA_USERNAME), F(FONA_PASSWORD))) { halt("Retrying FONA"); } Serial.println(F("Connected to Cellular!")); Watchdog.reset(); delay(3000); // wait a few seconds to stabilize connection Watchdog.reset(); } uint32_t x=0; void loop() { // Make sure to reset watchdog every loop iteration! Watchdog.reset(); // check if we're still connected if (!fona.TCPconnected() || (txfailures >= MAXTXFAILURES)) { ////////////////////////////// Serial.println(F("Connecting to MQTT...")); int8_t ret, retries = 5; while (retries && (ret = mqtt.connect()) != 0) { switch (ret) { case 1: Serial.println(F("Wrong protocol")); break; case 2: Serial.println(F("ID rejected")); break; case 3: Serial.println(F("Server unavail")); break; case 4: Serial.println(F("Bad user/pass")); break; case 5: Serial.println(F("Not authed")); break; case 6: Serial.println(F("Failed to subscribe")); break; default: { Serial.println(F("Connection failed")); break; } } Serial.println(F("Retrying MQTT connection")); retries--; if (retries == 0) halt("Resetting system"); delay(5000); } Serial.println(F("MQTT Connected!")); txfailures = 0; } // Try to ping the MQTT server /* if (! mqtt.ping(3) ) { // MQTT pings failed, lets reconnect Serial.println("Ping fail!"); } */ // this is our 'wait for incoming subscription packets' busy subloop Adafruit_MQTT_Subscribe *subscription; while (subscription = mqtt.readSubscription(5000)) { if (subscription == &onoffbutton) { Serial.print(F("Got: ")); Serial.println((char *)onoffbutton.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")); txfailures++; } else { Serial.println(F("OK!")); txfailures = 0; } }