Project tutorial
ARTIK + MKR1000 + DHT11 + MQTT

ARTIK + MKR1000 + DHT11 + MQTT © GPL3+

An IOT app which make uses of ARTIK Cloud, Genuino MKR1000, DHT11 temperature and humidity sensor and MQTT protocol.

  • 4,234 views
  • 12 comments
  • 10 respects

Components and supplies

Apps and online services

About this project

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.

.

Code

artik_dht11_sensor.inoC/C++
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <WiFi101.h>
#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT11   // DHT 11

DHT dht(DHTPIN, DHTTYPE);

const char* _SSID     = "[Wi-Fi SSID]";
const char* _PASSWORD = "[Wi-Fi Password]";  

// ARTIK Cloud MQTT params
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;

char buf[128];

float temperature, humidity;

int n = 0;

void getNextSample(float* Temperature, float* Humidity)
{
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  *Humidity = dht.readHumidity();
  // Read temperature as Celsius (the default)
  *Temperature = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  // float f = dht.readTemperature(true);

  //printf("Temp=%.2f, Pres=%.2f, Humi=%.2f\n", Temp_c__f, Pres_hPa__f, Humi_pct__f);

  Serial.print("Temperature="); Serial.println(*Temperature);
  Serial.print("Humidity="); Serial.println(*Humidity);
}

void setup() {

  Serial.begin(57600);  

  dht.begin();
  
  // Wifi Setting
  WiFi.begin(_SSID, _PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  mqttCloudClient.begin(mqttCloudServer, mqttCloudPort, ipCloudStack);

  Serial.println("start ARTIK Cloud connect"); Serial.println();
  
  while (!mqttCloudClient.connect(mqttCloudClientName, mqttCloudUsername, mqttCloudPassword)) {
    Serial.print("*");
    delay(500);    
  }

}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {}

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

void loop() {

  if (++n > 10) { 
    Serial.println("Stopped.");
    exit(0); 
  }

  mqttCloudClient.loop();
  delay(1000);
  
  getNextSample(&temperature, &humidity);
  
  Serial.println("Publishing..."); Serial.println();
  
  sendToArtikCloud(temperature, humidity);

  delay(15000);

}
artik_led_actor.inoC/C++
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <WiFi101.h>

#define LED_RED_PIN 11
#define LED_YELLOW_PIN 13
#define RED_DELAY 5000
#define YELLOW_DELAY 10000


const char* _SSID     = "[Wi-Fi SSID]";
const char* _PASSWORD = "[Wi-Fi Password]";  

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

char buf[128];

int savedRedValue, savedYellowValue;

unsigned long savedRedTime, savedYellowTime;

void setup() {

  Serial.begin(57600);  

  pinMode(LED_RED_PIN, OUTPUT);
  pinMode(LED_YELLOW_PIN, OUTPUT);

  savedRedValue = savedYellowValue = 0;
  
  // Wifi Setting
  WiFi.begin(_SSID, _PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  mqttCloudClient.begin(mqttCloudServer, mqttCloudPort, ipCloudStack);

  Serial.println("start ARTIK Cloud connect"); Serial.println();
  
  while (!mqttCloudClient.connect(mqttCloudClientName, mqttCloudUsername, mqttCloudPassword)) {
    Serial.print("*");
    delay(500);    
  }

  mqttCloudClient.subscribe(mqttCloudActionsIn);

}

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

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;      
      }
    }
  }

  
}

void loop() {

  mqttCloudClient.loop();
  delay(500);
    
}

Comments

Author

Wesee
vincent wong
  • 17 projects
  • 147 followers

Additional contributors

Published on

September 20, 2016

Members who respect this project

PorreyDefaultImg 3935PhotoSprint rzRafirasheedFoto perfilPhoto

and 2 others

See similar projects
you might like

Similar projects you might like

Temperature Monitoring with Arduino MKR1000 and ARTIK Cloud

Project tutorial by Team FoxLab

  • 7,511 views
  • 2 comments
  • 31 respects

Water Quality Monitoring Using MKR1000 and ARTIK Cloud

Project tutorial by Team Animo!

  • 7,075 views
  • 12 comments
  • 30 respects

Arduino MKR1000 - DHT - Artik cloud

by Team MAKERS-NS

  • 4,297 views
  • 2 comments
  • 20 respects

Controlling Patient's Fever with Artik & Arduino

Project showcase by Mahdi Hajebi

  • 4,442 views
  • 4 comments
  • 9 respects

HBus Home Automation And Artik

Project tutorial by Vincenzo

  • 2,310 views
  • 0 comments
  • 6 respects
Add projectSign up / Login