ARTIK + MKR1000 + DHT11 + MQTT
Компоненты и расходные материалы
| × | 2 | ||||
| × | 1 | ||||
| × | 2 |
Приложения и онлайн-сервисы
| ||||
|
Об этом проекте
В этом проекте используются два MKR1000 с DHT11 в качестве датчика и светодиоды в качестве метафоры исполнительных механизмов. Настоящими исполнительными механизмами могут быть кондиционер и потолочный вентилятор. Устройство температуры и влажности DHT11 отправляет данные в облако ARTIK. Установлены правила для отправки команды на красный и желтый светодиоды.
Установите Arduino IDE
С помощью диспетчера библиотек Arduino IDE установите следующие библиотеки.
Установите WiFi101 (см. Это руководство)
Установите MQTT, автор Джоэл Гэвиллер
Установите ArduinoJson
Примечание. См. мою предыдущая запись чтобы узнать подробности о работе с облаком ARTIK.
Настройте датчик температуры и влажности DHT11
Создайте тип устройства ( Датчик DHT11 )
Подключите устройство ( DHT11 Sensor A1 )
Подключите физические устройства
.
Настройте параметры MQTT облака ARTIK
char mqttCloudServer [] ="api.artik.cloud"; int mqttCloudPort =8883; char mqttCloudClientName [] ="АРТИК-Ардуино"; char mqttCloudUsername [] ="[идентификатор-устройства]"; char mqttCloudPassword [] ="[токен устройства]"; char mqttCloudDataOut [] ="/v1.1/messages/[ид-устройства]"; WiFiSSLClient ipCloudStack; MQTTClient mqttCloudClient;
Отправка сообщений в облако ARTIK.
void sendToArtikCloud (температура, влажность) {loadBuffer (температура, влажность); // загружаем текущие значения в буфер mqttCloudClient.publish (mqttCloudDataOut, buf); } void loadBuffer (температура, влажность) {StaticJsonBuffer <200> jsonBuffer; JsonObject и dataPair =jsonBuffer.createObject (); dataPair ["температура"] =температура; dataPair ["влажность"] =влажность; dataPair.printTo (buf, sizeof (buf)); }
Настроить светодиодные актуаторы температуры и влажности
Создайте тип устройства ( DHT11 Actor )
Подключите устройство ( DHT11 Actor A1 )
Подключите физические устройства
Настройка параметров MQTT облака ARTIK
// параметры ARTIK Cloud MQTT char mqttCloudServer [] ="api.artik.cloud"; int mqttCloudPort =1883; char mqttCloudClientName [] ="АРТИК-Ардуино"; char mqttCloudUsername [] ="[идентификатор-устройства]"; char mqttCloudPassword [] ="[токен устройства]"; char mqttCloudActionsIn [] ="/v1.1/actions/[device-id]"; WiFiClient ipCloudStack; MQTTClient mqttCloudClient;
Получение действий MQTT.
void messageReceived (String topic, String payload, char * bytes, unsigned int length) {Serial.print ("topic ="); Serial.println (тема); Serial.print ("payload ="); Serial.println (полезная нагрузка); Serial.print ("байты ="); Serial.println (байты); Serial.print ("длина ="); Serial.println (длина); parseBuffer (полезная нагрузка); }
Разбирать и обрабатывать действия из облака ARTIK.
void parseBuffer (String payload) {StaticJsonBuffer <200> jsonBuffer; Строка json =payload; JsonObject &root =jsonBuffer.parseObject (json); const char * nameparam =root ["действия"] [0] ["имя"]; const int actionLEDRed =root ["действия"] [0] ["параметры"] ["led_red"]; const int actionLEDYellow =root ["действия"] [0] ["параметры"] ["led_yellow"]; Serial.print ("имя ="); 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); saveRedValue =actionLEDRed; } saveRedTime =миллис (); } else {если (savedRedValue! =actionLEDRed) {if (millis () - savedRedTime> RED_DELAY) {digitalWrite (LED_RED_PIN, LOW); saveRedValue =actionLEDRed; }}} if (actionLEDYellow ==1) {if (savedYellowValue! =actionLEDYellow) {digitalWrite (LED_YELLOW_PIN, HIGH); saveYellowValue =actionLEDYellow; } saveYellowTime =millis (); } else {если (savedYellowValue! =actionLEDYellow) {if (millis () - savedYellowTime> YELLOW_DELAY) {digitalWrite (LED_YELLOW_PIN, LOW); saveYellowValue =actionLEDYellow; }}}}
Создать правила
Есть 4 правила:
- ЕСЛИ Температура датчика DHT11 A1 больше 32, а влажность больше 34 ЗАТЕМ отправьте актеру A1 DHT11 действие setValue с led_red =1, led_yellow =1
- ЕСЛИ Температура датчика DHT11 A1 больше 32, а влажность меньше 35 ЗАТЕМ отправьте актеру A1 DHT11 действие setValue с led_red =1, led_yellow =0
- ЕСЛИ Температура датчика A1 DHT11 меньше 33, а влажность больше 34 ЗАТЕМ отправьте актеру A1 DHT11 действие setValue с led_red =0, led_yellow =1
- ЕСЛИ влажность датчика DHT11 A1 ниже 35, а температура ниже 33 ЗАТЕМ отправьте актеру A1 DHT11 действие setValue с led_red =0, led_yellow =0
Демо-видео
Обратите внимание, что вам нужно подождать, пока температура не нагреется (светодиод горит) и не остынет (светодиод не горит). Красный светодиод загорается через 37 секунд и выключается через 1:13 секунды. В демонстрационном видео показаны только изменения температуры. Я использовал фен, чтобы изменить температуру вокруг датчика DHT11.
.
Код
- artik_dht11_sensor.ino
- artik_led_actor.ino
artik_dht11_sensor.ino C / C ++
#include#include #include #include "DHT.h" #define DHTPIN 2 // к какому цифровому выводу мы подключены # определить DHTTYPE DHT11 / / DHT 11DHT dht (DHTPIN, DHTTYPE); const char * _SSID ="[Wi-Fi SSID]"; const char * _PASSWORD ="[Пароль Wi-Fi]"; // ARTIK Cloud MQTT paramschar mqttCloudServer [] ="api.artik.cloud"; int mqttCloudPort =8883; char mqttCloudClientName [] ="ARTIK-Arduino"; char mqttCloudUsername [] ="[id-устройства]"; char mqttCloudPassword [] ="[токен устройства]"; char mqttCloudDataOut [] ="/v1.1/messages/[ид-устройства]"; WiFiSSLClient ipCloudStack; MQTTClient mqttCloudClient; char buf [128]; float температура, влажность; int n =0; void getNextSample (float * Temperature, float * Humidity) {// Подождите несколько секунд между измерениями. задержка (2000); // Считывание температуры или влажности занимает около 250 миллисекунд! // Показания датчика также могут быть "старыми" до 2 секунд (это очень медленный датчик) * Humidity =dht.readHumidity (); // Считываем температуру в градусах Цельсия (по умолчанию) * Temperature =dht.readTemperature (); // Считываем температуру по Фаренгейту (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 ("Температура ="); Serial.println (* Температура); Serial.print ("Влажность ="); Serial.println (* влажность);} void setup () {Serial.begin (57600); dht.begin (); // Настройка Wi-Fi WiFi.begin (_SSID, _PASSWORD); в то время как (WiFi.status ()! =WL_CONNECTED) {задержка (500); Serial.print ("."); } Serial.println (); Serial.println («WiFi подключен»); Serial.print ("IP-адрес:"); Serial.println (WiFi.localIP ()); mqttCloudClient.begin (mqttCloudServer, mqttCloudPort, ipCloudStack); Serial.println («запустить ARTIK Cloud connect»); Serial.println (); в то время как (! mqttCloudClient.connect (mqttCloudClientName, mqttCloudUsername, mqttCloudPassword)) {Serial.print ("*"); задержка (500); }} void messageReceived (тема строки, полезная нагрузка строки, char * байты, длина целого числа без знака) {} void sendToArtikCloud (температура поплавка, влажность поплавка) {loadBuffer (температура, влажность); // загружаем текущие значения в буфер mqttCloudClient.publish (mqttCloudDataOut, buf);} void loadBuffer (плавающая температура, плавающая влажность) {StaticJsonBuffer <200> jsonBuffer; JsonObject и dataPair =jsonBuffer.createObject (); dataPair ["температура"] =температура; dataPair ["влажность"] =влажность; dataPair.printTo (buf, sizeof (buf));} void loop () {if (++ n> 10) {Serial.println ("Остановлено."); выход (0); } mqttCloudClient.loop (); задержка (1000); getNextSample (&температура, &влажность); Serial.println («Издательство ...»); Serial.println (); sendToArtikCloud (температура, влажность); задержка (15000);}
artik_led_actor.ino C / C ++
#include#include #include #define LED_RED_PIN 11 # define LED_YELLOW_PIN 13 # define RED_DELAY 5000 # define YELLOW_DELAY 10000const char * _SSID ="[Wi-Fi SSID ] "; const char * _PASSWORD =" [Пароль Wi-Fi] "; // ARTIK Cloud MQTT paramschar mqttCloudServer [] ="api.artik.cloud"; int mqttCloudPort =1883; char mqttCloudClientName [] ="ARTIK-Arduino"; char mqttCloudUsername [] ="[id-устройства]"; char mqttCloudPassword [] ="[токен устройства]"; char mqttCloudActionsIn [] ="/v1.1/actions/[device-id]"; WiFiClient ipCloudStack; MQTTClient mqttCloudClient; char buf [128]; int savedRedValue, savedYellowValue; беззнаковое длинное saveRedTime, savedYellowTime; void setup () {Serial.begin (57600); pinMode (LED_RED_PIN, ВЫХОД); pinMode (LED_YELLOW_PIN, ВЫХОД); saveRedValue =savedYellowValue =0; // Настройка Wi-Fi WiFi.begin (_SSID, _PASSWORD); в то время как (WiFi.status ()! =WL_CONNECTED) {задержка (500); Serial.print ("."); } Serial.println (); Serial.println («WiFi подключен»); Serial.print ("IP-адрес:"); Serial.println (WiFi.localIP ()); mqttCloudClient.begin (mqttCloudServer, mqttCloudPort, ipCloudStack); Serial.println («запустить ARTIK Cloud connect»); Serial.println (); в то время как (! mqttCloudClient.connect (mqttCloudClientName, mqttCloudUsername, mqttCloudPassword)) {Serial.print ("*"); задержка (500); } mqttCloudClient.subscribe (mqttCloudActionsIn);} void messageReceived (тема String, полезная нагрузка String, char * байты, длина целого числа без знака) {Serial.print ("topic ="); Serial.println (тема); Serial.print ("payload ="); Serial.println (полезная нагрузка); Serial.print ("байты ="); Serial.println (байты); Serial.print ("длина ="); Serial.println (длина); parseBuffer (полезная нагрузка);} void parseBuffer (String payload) {StaticJsonBuffer <200> jsonBuffer; Строка json =payload; JsonObject &root =jsonBuffer.parseObject (json); const char * nameparam =root ["действия"] [0] ["имя"]; const int actionLEDRed =root ["действия"] [0] ["параметры"] ["led_red"]; const int actionLEDYellow =root ["действия"] [0] ["параметры"] ["led_yellow"]; Serial.print ("имя ="); 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); saveRedValue =actionLEDRed; } saveRedTime =миллис (); } else {если (savedRedValue! =actionLEDRed) {if (millis () - savedRedTime> RED_DELAY) {digitalWrite (LED_RED_PIN, LOW); saveRedValue =actionLEDRed; }}} if (actionLEDYellow ==1) {if (savedYellowValue! =actionLEDYellow) {digitalWrite (LED_YELLOW_PIN, HIGH); saveYellowValue =actionLEDYellow; } saveYellowTime =millis (); } else {если (savedYellowValue! =actionLEDYellow) {if (millis () - savedYellowTime> YELLOW_DELAY) {digitalWrite (LED_YELLOW_PIN, LOW); saveYellowValue =actionLEDYellow; }}}} недействительный цикл () {mqttCloudClient.loop (); задержка (500); }
Производственный процесс