Arduino MKR1000 + Capteur DHT11 : Démonstration IoT MQTT sur Samsung ARTIK Cloud
Composants et fournitures
| Arduino MKR1000 | × | 2 |
| Capteur Température & Humidité DHT11 (4 broches) | × | 1 |
| LED (générique) | × | 2 |
Applications et services en ligne
| Samsung ARTIK Cloud pour IoT |
| Arduino IDE |
À propos de ce projet
Ce projet utilise deux MKR1000 avec DHT11 comme capteur et LEDs comme actionneurs métaphoriques. Les vrais actionneurs pourraient être un climatiseur et un ventilateur de plafond. Le dispositif DHT11 température/humidité envoie les données vers ARTIK Cloud. Des règles ont été définies pour envoyer des commandes aux LEDs rouge et jaune.
Configuration de l'Arduino IDE
Avec le Gestionnaire de bibliothèques de l'Arduino IDE, installez les bibliothèques suivantes :
- Installer WiFi101 (voir ce guide)
- Installer MQTT par Joel Gaehwiler
- Installer ArduinoJson
Note : Reportez-vous à mon article précédent pour plus de détails sur le travail avec ARTIK Cloud.
Configuration du capteur DHT11 température et humidité
Créer un type de dispositif (Capteur DHT11)
Connecter un dispositif (Capteur DHT11 A1)
Connecter les dispositifs physiques
Configurer les paramètres MQTT ARTIK Cloud
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;
Envoi de messages vers ARTIK Cloud.
void sendToArtikCloud(float temperature, float humidity) {
loadBuffer(temperature, humidity); // charger les valeurs actuelles dans le tampon
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));
}
Configuration des actionneurs LED température et humidité
Créer un type de dispositif (Actionneur DHT11)
Connecter un dispositif (Actionneur DHT11 A1)
Connecter les dispositifs physiques
Configurer les paramètres MQTT ARTIK Cloud
// Paramètres MQTT ARTIK Cloud
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;
Réception des actions MQTT.
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);
}
Analyser et traiter les actions depuis 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;
}
}
}
}
Créer des règles
Il y a 4 règles :
- SI Capteur DHT11 A1 température > 32 ET humidité > 34 ALORS envoyer à Actionneur DHT11 A1 l'action setValue avec led_red = 1, led_yellow = 1
- SI Capteur DHT11 A1 température > 32 ET humidité < 35 ALORS envoyer à Actionneur DHT11 A1 l'action setValue avec led_red = 1, led_yellow = 0
- SI Capteur DHT11 A1 température < 33 ET humidité > 34 ALORS envoyer à Actionneur DHT11 A1 l'action setValue avec led_red = 0, led_yellow = 1
- SI Capteur DHT11 A1 humidité < 35 ET température < 33 ALORS envoyer à Actionneur DHT11 A1 l'action setValue avec led_red = 0, led_yellow = 0
Vidéo de démonstration
Veuillez noter que vous devrez attendre que la température monte (LED allumée) et descende (LED éteinte). La LED rouge s'allume à 37 secondes et s'éteint à 1:13. La vidéo de démo montre seulement les changements de température. J'ai utilisé un sèche-cheveux pour changer la température autour du capteur DHT11.
Code
artik_dht11_sensor.ino (C/C++)
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <WiFi101.h>
#include "DHT.h"
#define DHTPIN 2 // quelle broche numérique nous sommes connectés
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
const char* _SSID = "[Wi-Fi SSID]";
const char* _PASSWORD = "[Wi-Fi Password]";
// Paramètres MQTT ARTIK Cloud
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) {
// Attendre quelques secondes entre les mesures.
delay(2000);
// La lecture de la température ou de l'humidité prend environ 250 millisecondes !
// Les lectures du capteur peuvent aussi être jusqu'à 2 secondes 'old' (c'est un capteur très lent)
*Humidity = dht.readHumidity();
// Lire la température en Celsius (par défaut)
*Temperature = dht.readTemperature();
// Lire la température en 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();
// Configuration WiFi
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); // charger les valeurs actuelles dans le tampon
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.ino (C/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]";
// Paramètres MQTT ARTIK Cloud
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;
// Configuration WiFi
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);
}
Processus de fabrication
- Projet capteur DHT11 température/humidité avec indicateurs LED et buzzer piézo
- Construire un Spybot Arduino piloté par Bluetooth
- FlickMote : Télécommande IR à gestes pour maison connectée
- TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Solutions d'alimentation optimisées pour projets Arduino
- Morpion sur matrice LED MAX7219 avec boîtier en carton
- Brochage MKR1000 : La Carte de Référence pour le Développement IoT