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.
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");
Page last edited July 24, 2015
Text editor powered by tinymce.