Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Компоненты и материалы
| Arduino MKR1000 | 2 |
| Датчик температуры и влажности DHT11 (4 пина) | 1 |
| Светодиод (любой) | 2 |
Приложения и онлайн-сервисы
- Samsung ARTIK Cloud for IoT (устарел, используется как пример)
- Arduino IDE
О проекте
Проект использует две платы MKR1000: одна с датчиком DHT11 (измеряет температуру и влажность), вторая — с двумя светодиодами (имитируют актуаторы: кондиционер и вентилятор). Данные с датчика отправляются в ARTIK Cloud по MQTT. Настроены правила (Rules), которые поступают команды на светодиоды.
Настройка Arduino IDE
Установите через Library Manager:
- WiFi101 — гайд
- MQTT by Joel Gaehwiler
- ArduinoJson
Подробнее о работе с ARTIK Cloud см. в ранней статье.
Настройка датчика DHT11 (устройство-датчик)
- Создайте Device Type: DHT11 Sensor.
- Подключите Device: DHT11 Sensor A1.
- Подключите железо (см. фото).
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;
Отправка данных:
void sendToArtikCloud(float temperature, float humidity) {
loadBuffer(temperature, humidity);
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));
}
Настройка актуаторов (LED — устройство-исполнитель)
- Device Type: DHT11 Actor.
- Device: DHT11 Actor A1.
- Подключите светодиоды (см. фото).
MQTT-параметры (порт 1883 для нешифрованного):
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;
Прием MQTT-действий:
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
parseBuffer(payload);
}
Парсинг и обработка:
void parseBuffer(String payload) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
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"];
// Управление красным LED с задержкой выключения
if (actionLEDRed == 1) {
if (savedRedValue != 1) { digitalWrite(LED_RED_PIN, HIGH); savedRedValue = 1; }
savedRedTime = millis();
} else {
if (savedRedValue != 0 && millis() - savedRedTime > RED_DELAY) {
digitalWrite(LED_RED_PIN, LOW); savedRedValue = 0;
}
}
// Аналогично для желтого LED
}
Создание правил (Rules)
4 правила:
- IF temp > 32 AND humidity > 34 THEN led_red=1, led_yellow=1
- IF temp > 32 AND humidity < 35 THEN led_red=1, led_yellow=0
- IF temp < 33 AND humidity > 34 THEN led_red=0, led_yellow=1
- IF humidity < 35 AND temp < 33 THEN led_red=0, led_yellow=0
Демо-видео
Красный LED загорается на 37 сек, гаснет на 1:13. Использовался фен для нагрева датчика. Видео показывает только реакцию на температуру.
Код
artik_dht11_sensor.ino (C/C++)
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include <WiFi101.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char* _SSID = "[Wi-Fi SSID]";
const char* _PASSWORD = "[Wi-Fi Password]";
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) {
delay(2000);
*Humidity = dht.readHumidity();
*Temperature = dht.readTemperature();
Serial.print("Temperature="); Serial.println(*Temperature);
Serial.print("Humidity="); Serial.println(*Humidity);
}
void setup() {
Serial.begin(57600);
dht.begin();
WiFi.begin(_SSID, _PASSWORD);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println(); Serial.println("WiFi connected");
Serial.print("IP: "); Serial.println(WiFi.localIP());
mqttCloudClient.begin(mqttCloudServer, mqttCloudPort, ipCloudStack);
Serial.println("Connecting to ARTIK Cloud...");
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);
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...");
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]";
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 = 0, savedYellowValue = 0;
unsigned long savedRedTime = 0, savedYellowTime = 0;
void setup() {
Serial.begin(57600);
pinMode(LED_RED_PIN, OUTPUT);
pinMode(LED_YELLOW_PIN, OUTPUT);
WiFi.begin(_SSID, _PASSWORD);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.println(); Serial.println("WiFi connected");
Serial.print("IP: "); Serial.println(WiFi.localIP());
mqttCloudClient.begin(mqttCloudServer, mqttCloudPort, ipCloudStack);
while (!mqttCloudClient.connect(mqttCloudClientName, mqttCloudUsername, mqttCloudPassword)) {
Serial.print("*"); delay(500);
}
mqttCloudClient.subscribe(mqttCloudActionsIn);
}
void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
parseBuffer(payload);
}
void parseBuffer(String payload) {
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
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"];
if (actionLEDRed == 1) {
if (savedRedValue != 1) { digitalWrite(LED_RED_PIN, HIGH); savedRedValue = 1; }
savedRedTime = millis();
} else {
if (savedRedValue != 0 && millis() - savedRedTime > RED_DELAY) {
digitalWrite(LED_RED_PIN, LOW); savedRedValue = 0;
}
}
if (actionLEDYellow == 1) {
if (savedYellowValue != 1) { digitalWrite(LED_YELLOW_PIN, HIGH); savedYellowValue = 1; }
savedYellowTime = millis();
} else {
if (savedYellowValue != 0 && millis() - savedYellowTime > YELLOW_DELAY) {
digitalWrite(LED_YELLOW_PIN, LOW); savedYellowValue = 0;
}
}
}
void loop() {
mqttCloudClient.loop();
delay(500);
}
Производственный процесс
- Проект с датчиком DHT11: индикация температуры светодиодами и пьезо-динамиком на Arduino
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Arduino MKR1000: полное руководство по распиновке, питанию и старту для IoT