Black Lives Matter - Action and Equality. ... Adafruit is open and shipping.
0

MQTT connection fails when subscribing to 4 topics
Moderators: adafruit_support_bill, adafruit

Forum rules
If you're posting code, please make sure your code does not include your Adafruit IO Active Key or WiFi network credentials.
Please be positive and constructive with your questions and comments.

MQTT connection fails when subscribing to 4 topics

by thermalhound on Sun Jan 31, 2016 8:04 pm

Hi all,

I'm having a bit of a problem with a sketch and I can't for the life of me work out why.

I am trying to subscribe to 4 feeds (onoff, red-led, green-led, blue-led) I have set up in my account. I can subscribe to up to 3 of them at any one time and the data comes through no problem. As soon as I add the 4th subscription MQTT refuses to connect.

Hardware ... Mac OSx 10.10, Arduino IDE 1.6.5, ESP12-E module

Code ... Included below. It's basically a replica of the (excellent!) 2subs code included as an example but with 2 extra subscriptions added in.

Hopefully it's something stupid I'm over looking but any feedback from a fresh pair of eyes would be greatly appreciated.

Thanks

Code: Select all | TOGGLE FULL SIZE
/***************************************************
  Adafruit MQTT Library ESP8266 Example

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

// the on off button feed turns this LED on/off
#define LED 2 
// the slider feed sets the PWM output of this pin
#define redLed 15
#define greenLed 12
#define blueLed 13


/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "MySSID"
#define WLAN_PASS       "MyPassword"

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "MyUsername"
#define AIO_KEY         "MyAIO_Key"

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

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 ***************************************/

// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
// 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, "thermalhound/feeds/onoff");
//const char RED_SLIDER_FEED[] PROGMEM = AIO_USERNAME "/feeds/red-led";
Adafruit_MQTT_Subscribe redSlider = Adafruit_MQTT_Subscribe(&mqtt, "thermalhound/feeds/red-led");
//const char GREEN_SLIDER_FEED[] PROGMEM = AIO_USERNAME "/feeds/green-led";
Adafruit_MQTT_Subscribe greenSlider = Adafruit_MQTT_Subscribe(&mqtt, "thermalhound/feeds/green-led");
//const char BLUE_SLIDER_FEED[] PROGMEM = AIO_USERNAME "/feeds/blue-led";
Adafruit_MQTT_Subscribe blueSlider = Adafruit_MQTT_Subscribe(&mqtt, "thermalhound/feeds/blue-led");

/*************************** 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() {
  pinMode(LED, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
  pinMode(blueLed, OUTPUT);

  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());

  //MQTT_connect();

  // Setup MQTT subscription for onoff & slider feed.
  mqtt.subscribe(&onoffbutton);
  mqtt.subscribe(&redSlider);
  mqtt.subscribe(&greenSlider);
  mqtt.subscribe(&blueSlider);

 
}

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
  Serial.println("loop");
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    // Check if its the onoff button feed
    if (subscription == &onoffbutton) {
      Serial.print(F("On-Off button: "));
      Serial.println((char *)onoffbutton.lastread);
     
      if (strcmp((char *)onoffbutton.lastread, "ON") == 0) {
        digitalWrite(LED, LOW);
      }
      if (strcmp((char *)onoffbutton.lastread, "OFF") == 0) {
        digitalWrite(LED, HIGH);
      }
    }
   
    // check if its the red slider feed
    if (subscription == &redSlider) {
      Serial.print(F("Red Slider: "));
      Serial.println((char *)redSlider.lastread);
      uint16_t sliderval = atoi((char *)redSlider.lastread);  // convert to a number
      analogWrite(redLed, sliderval);
    }

    // check if its the green slider feed
    if (subscription == &greenSlider) {
      Serial.print(F("Green Slider: "));
      Serial.println((char *)greenSlider.lastread);
      uint16_t sliderval = atoi((char *)greenSlider.lastread);  // convert to a number
      analogWrite(greenLed, sliderval);
    }

    // check if its the blue slider feed
    if (subscription == &blueSlider) {
      Serial.print(F("Blue Slider: "));
      Serial.println((char *)blueSlider.lastread);
      uint16_t sliderval = atoi((char *)blueSlider.lastread);  // convert to a number
      analogWrite(blueLed, sliderval);
    }
  }

  // ping the server to keep the mqtt connection alive
  if(! mqtt.ping()) {
    mqtt.disconnect();
  }

}

// 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 = 10;
  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!");
}

thermalhound
 
Posts: 2
Joined: Sun Jan 31, 2016 7:52 pm

Please be positive and constructive with your questions and comments.