In this section, we are going to see how to program the two modules that you just built. We will start by looking at the most important pieces of the code, first for the sensor module, and then for the lamp controller. Note that you can find the whole code for this guide on the corresponding GitHub repository:

https://github.com/openhomeautomation/adafruit-io-esp8266

The sketch for the ESP8266 sensor module starts by including the right libraries:

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

Then, we define on which pin the DHT sensor is connected to:

#define DHTPIN 5
#define DHTTYPE DHT22

After that, there is the section of the code where you need to modify some data. You need to enter your WiFi network name & password, your Adafruit account name, and your AIO key:

// WiFi parameters
#define WLAN_SSID       "WLAN_SSID"
#define WLAN_PASS       "WLAN_PASS"

// Adafruit IO
#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883
#define AIO_USERNAME    "AIO_USERNAME"
#define AIO_KEY         "AIO_KEY"

We also create the DHT sensor instance:

DHT dht(DHTPIN, DHTTYPE, 15);

We also define on which feed we want to send the data to. By default, the sketch will simply send temperature measurements to a feed called temperature, and humidity measurements to a feed called humidity.

You can of course change this by changing the following line:

const char TEMPERATURE_FEED[] PROGMEM = AIO_USERNAME "/feeds/temperature";

In the setup() function of the sketch, we initialise the DHT sensor:

dht.begin();

Then, in the loop() function of the sketch, we constantly check if we are still connected to Adafruit IO. If that's not the case, we reconnect the board to Adafruit IO:

if(! mqtt.ping(3)) {
  // reconnect to adafruit io
  if(! mqtt.connected())
    connect();
}

After that, we make the temperature & humidity measurements:

int humidity_data = (int)dht.readHumidity();
int temperature_data = (int)dht.readTemperature();

We then send these measurements to their respective feed:

if (! temperature.publish(temperature_data))
  Serial.println(F("Failed to publish temperature"));
else
  Serial.println(F("Temperature published!"));

if (! humidity.publish(humidity_data))
  Serial.println(F("Failed to publish humidity"));
else
  Serial.println(F("Humidity published!"));

Finally, we repeat the operation every 10 seconds:

delay(10000);

Let's now see the specificities of the lamp controller sketch. We have to define on which pin the PowerSwitch Tail is connected to:

const int lamp_pin = 5;

We also define a new feed for the project, simply called lamp:

const char LAMP_FEED[] PROGMEM = AIO_USERNAME "/feeds/lamp";

In the setup() function, we set the pin of the PowerSwitch Tail to an output:

pinMode(lamp_pin, OUTPUT);

We also make the project subscribe to the lamp feed:

mqtt.subscribe(&lamp);

Then, in the loop() function, we have to listen to incoming messages from Adafruit IO, to know if we need to turn the lamp on or off. It starts by creating a subscription instance:

Adafruit_MQTT_Subscribe *subscription;

Then, we listen for incoming messages. If the message is 'ON', we switch the lamp on. And if it's 'OFF', we simply switch the lamp off again. This is done by the following piece of code:

while (subscription = mqtt.readSubscription(1000)) {

  // we only care about the lamp events
  if (subscription == &lamp) {

    // convert mqtt ascii payload to int
    char *value = (char *)lamp.lastread;
    Serial.print(F("Received: "));
    Serial.println(value);

    // Apply message to lamp
    String message = String(value);
    message.trim();
    if (message == "ON") {digitalWrite(lamp_pin, HIGH);}
    if (message == "OFF") {digitalWrite(lamp_pin, LOW);}

  }
}

Note that you can find the complete code for this guide inside the GitHub repository of the project:

https://github.com/openhomeautomation/adafruit-io-esp8266

We are now going to program the board. The first step is to plug the FTDI friend board to the ESP8266 breakout:

Open the code with your Arduino IDE, and select ‘Adafruit HUZZAH ESP8266’ from the Tools>Boards menu of the Arduino IDE. Also select the Serial port corresponding to the FTDI board you are using.

Then, put the ESP8266 board in bootloader mode so you can program it. On the Adafruit ESP8266 board, it is really simple: just hold the GPIO0 button pressed, and then press the Reset button.

Make sure that you also modified the code with your own data (WiFi network credentials & Adafruit IO credentials).

After that, upload the code to the board. When it is finished, open the Serial monitor, and reset the board: you should see that the board automatically connects to Adafruit IO. 

Of course, you need to repeat the operation for both modules in the project.

If your ESP8266 resets when you run the progem, note that there have been recent changes to the Adafruit_IO library. You will have to remove references to PROGMEM. Edit your sketch to match the code sample below:
WiFiClient client;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Feeds ***************************************/

// Setup a feed called 'lamp' for subscribing to changes.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe lamp = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/lamp");

(if you're using the sensor sketch, make the appropriate changes):

// Setup feeds for temperature & humidity
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");

This guide was first published on Jul 28, 2015. It was last updated on Jul 28, 2015.

This page (Programming the Modules) was last updated on Apr 15, 2021.

Text editor powered by tinymce.