An IOT app which make uses of ARTIK Cloud, Genuino MKR1000, DHT11 temperature and humidity sensor and MQTT protocol.
Things used in this project
Story
This project makes use of two MKR1000s with DHT11 as sensor and LEDs as metaphor actuators. The real actuators could be the air-conditioner and ceiling fan. The DHT11 temperature and humidity device sends data to ARTIK cloud. Rules have been set to send command to the Red and Yellow LEDs.
Setup Arduino IDE
With Arduino IDE’s Library Manager, install the following libraries.
Install WiFi101 (see this guide)
Install MQTT by Joel Gaehwiler
Install ArduinoJson
Note: Refer to my earlier post to find out details about working with ARTIK cloud.
Setup the DHT11 temperature and humidity sensor
Create a device type (DHT11 Sensor)
Connect a device (DHT11 Sensor A1)
Connect the physical devices
Setup the ARTIK cloud MQTT parameters
char mqttCloudServer[] = "api.artik.cloud";
int mqttCloudPort = 8883;
char mqttCloudClientName[] = "ARTIK-Arduino";
char mqttCloudUsername[] = "[device-id]";
char mqttCloudPassword[] = "[device-token]";
char mqttCloudDataOut[] = "/v1.1/messages/[device-id]";
WiFiSSLClient ipCloudStack;
MQTTClient mqttCloudClient;
Sending messages to ARTIK cloud.
void sendToArtikCloud(float temperature, float humidity) {
loadBuffer(temperature, humidity); // load current values into the buffer
mqttCloudClient.publish(mqttCloudDataOut, buf);
}
void loadBuffer(float temperature, float humidity) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& dataPair = jsonBuffer.createObject();
dataPair["temperature"] = temperature;
dataPair["humidity"] = humidity;
dataPair.printTo(buf, sizeof(buf));
}
Setup the LED temperature and humidity actuators
Create a device type (DHT11 Actor)
Connect a device (DHT11 Actor A1)
Connect the physical devices
Setup ARTIK cloud MQTT parameters
// ARTIK Cloud MQTT params
char mqttCloudServer[] = "api.artik.cloud";
int mqttCloudPort = 1883;
char mqttCloudClientName[] = "ARTIK-Arduino";
char mqttCloudUsername[] = "[device-id]";
char mqttCloudPassword[] = "[device-token]";
char mqttCloudActionsIn[] = "/v1.1/actions/[device-id]";
WiFiClient ipCloudStack;
MQTTClient mqttCloudClient;
Receiving MQTT actions.
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
Serial.print("topic="); Serial.println(topic);
Serial.print("payload="); Serial.println(payload);
Serial.print("bytes="); Serial.println(bytes);
Serial.print("length="); Serial.println(length);
parseBuffer(payload);
}
Parse and process the actions from ARTIK cloud.
void parseBuffer(String payload) {
StaticJsonBuffer<200> jsonBuffer;
String json = payload;
JsonObject& root = jsonBuffer.parseObject(json);
const char* nameparam = root["actions"][0]["name"];
const int actionLEDRed = root["actions"][0]["parameters"]["led_red"];
const int actionLEDYellow = root["actions"][0]["parameters"]["led_yellow"];
Serial.print("name="); Serial.println(nameparam);
Serial.print("led_red="); Serial.println(actionLEDRed);
Serial.print("led_yellow="); Serial.println(actionLEDYellow);
Serial.println();
if (actionLEDRed == 1) {
if (savedRedValue != actionLEDRed) {
digitalWrite(LED_RED_PIN, HIGH);
savedRedValue = actionLEDRed;
}
savedRedTime = millis();
} else {
if (savedRedValue != actionLEDRed) {
if (millis() - savedRedTime > RED_DELAY) {
digitalWrite(LED_RED_PIN, LOW);
savedRedValue = actionLEDRed;
}
}
}
if (actionLEDYellow == 1) {
if (savedYellowValue != actionLEDYellow) {
digitalWrite(LED_YELLOW_PIN, HIGH);
savedYellowValue = actionLEDYellow;
}
savedYellowTime = millis();
} else {
if (savedYellowValue != actionLEDYellow) {
if (millis() - savedYellowTime > YELLOW_DELAY) {
digitalWrite(LED_YELLOW_PIN, LOW);
savedYellowValue = actionLEDYellow;
}
}
}
}
Create Rules
There are 4 rules:
- IF DHT11 Sensor A1 temperature is more than 32 and humidity is more than 34 THEN send to DHT11 Actor A1 the action setValue with led_red = 1, led_yellow = 1
- IF DHT11 Sensor A1 temperature is more than 32 and humidity is less than 35 THEN send to DHT11 Actor A1 the action setValue with led_red = 1, led_yellow = 0
- IF DHT11 Sensor A1 temperature is less than 33 and humidity is more than 34 THEN send to DHT11 Actor A1 the action setValue with led_red = 0, led_yellow = 1
- IF DHT11 Sensor A1 humidity is less than 35 and temperature is less than 33 THEN send to DHT11 Actor A1 the action setValue with led_red = 0, led_yellow = 0
Demo Video
Please note that you will need to wait for the temperature to heat up (LED on) and cool off (LED off). The red LED is turned on at 37 seconds and turned off at 1:13 seconds. The demo video shows only temperature changes. I used a hair dryer to change the temperature around the DHT11 sensor.