Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

Компоненты и материалы

Arduino MKR1000 2
Датчик температуры и влажности DHT11 (4 пина) 1
Светодиод (любой) 2

Приложения и онлайн-сервисы

О проекте

Проект использует две платы MKR1000: одна с датчиком DHT11 (измеряет температуру и влажность), вторая — с двумя светодиодами (имитируют актуаторы: кондиционер и вентилятор). Данные с датчика отправляются в ARTIK Cloud по MQTT. Настроены правила (Rules), которые поступают команды на светодиоды.

Настройка Arduino IDE

Установите через Library Manager:

  1. WiFi101 — гайд
  2. MQTT by Joel Gaehwiler
  3. ArduinoJson

Подробнее о работе с ARTIK Cloud см. в ранней статье.

Настройка датчика DHT11 (устройство-датчик)

  1. Создайте Device Type: DHT11 Sensor.
  2. Подключите Device: DHT11 Sensor A1.
  3. Подключите железо (см. фото).
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

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));
}
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

Настройка актуаторов (LED — устройство-исполнитель)

  1. Device Type: DHT11 Actor.
  2. Device: DHT11 Actor A1.
  3. Подключите светодиоды (см. фото).
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

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
}
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

Создание правил (Rules)

Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

4 правила:

  1. IF temp > 32 AND humidity > 34 THEN led_red=1, led_yellow=1
  2. IF temp > 32 AND humidity < 35 THEN led_red=1, led_yellow=0
  3. IF temp < 33 AND humidity > 34 THEN led_red=0, led_yellow=1
  4. IF humidity < 35 AND temp < 33 THEN led_red=0, led_yellow=0
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

Демо-видео

Красный LED загорается на 37 сек, гаснет на 1:13. Использовался фен для нагрева датчика. Видео показывает только реакцию на температуру.

Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud
Arduino MKR1000 + DHT11: MQTT IoT-демо на Samsung ARTIK Cloud

Код

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

Производственный процесс

  1. Проект с датчиком DHT11: индикация температуры светодиодами и пьезо-динамиком на Arduino
  2. Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
  3. FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
  4. DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
  5. Создание пользовательских LED-часов с будильником — видно с 12 метров
  6. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  7. Оптимизированные решения питания для проектов на Arduino
  8. Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
  9. Пошаговое руководство: сборка умного четырёхногого робота на Arduino
  10. Arduino MKR1000: полное руководство по распиновке, питанию и старту для IoT