Home AssistantInternet of ThingsSmartHome

Bài 5 : Đọc dữ liệu nhiệt độ, độ ẩm từ DHT 11 hiển thị lên Home Assistant

Nối tiếp bài viết trước ,ở bài viết này lophocvui.com sẽ hướng dẫn bạn đọc dữ liệu từ cảm biến DHT 11  lên Home Assistant hiển thị giá trị và biểu đồ trạng thái  nhiệt độ ,độ ẩm cho ngôi nhà thông minh .

I/Yêu cầu phần cứng

  1. Những linh kiện cần chuẩn bị

  • Node MCU
  • DHT 11 (hoặc DHT 22)
  • Dây kết nối
  • Nguồn 5 VDC
  • Board test
  1. Sơ đồ kết nối

II/Cầu hình cho Home Assistant

Bạn hãy làm theo các bước ở bài viết trước để kết nối Home Assistant với dịch vụ MQTT ( xem tại đây)

Sau khi kết nối thành công với MQTT, để hiện thị nhiệt độ ,độ ẩm ta thêm đoạn code sau vào file configuration.yaml :

sensor:

  – platform: mqtt

    name: “Temperature”

    state_topic: “sensor/temperature”

    unit_of_measurement: ‘°C’

  – platform: mqtt

    name: “Humidity”

    state_topic: “sensor/humidity”

    unit_of_measurement: ‘%’

Các biến cấu hình :

platform: phương thức truyền nhận ( ở đây là MQTT)

name : Tên hiện thị lên Home Assistant

unit_of_measurement: đơn vị đo lường

state_topic: chủ đề MQTT được đăng kí để nhận các giá trị cảm biến

Bạn có thể xem các biến cấu hình đầy đủ tại đây:  https://www.home assistant.io/components/sensor.mqtt/

Bạn lưu lại file và reset lại Home Assistant , kết quả ta được như hình :

III/ Code Cho Node MCU

Ta nạp vào đoạn code sau đây cho Node MCU :

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include “DHT.h”
#define DHTTYPE DHT11   // DHT 11
// Cập nhật thông tin
// Thông tin về wifi
#define ssid “yourSSID”
#define password “yourPASSWORD”
// Thông tin về MQTT Broker
#define mqtt_server “yourIP_Broker” // Thay bằng thông tin của bạn
#define mqtt_topic_pub “sensor”   //Giữ nguyên nếu bạn tạo topic tên là demo
#define mqtt_topic_sub “sensor”
#define mqtt_user “lophocvui”    //Giữ nguyên nếu bạn tạo user là esp8266 và pass là 123456
#define mqtt_pwd “123456”const uint16_t mqtt_port = 1883; //Port của MQTT
WiFiClient espClient;
PubSubClient client(espClient);
const int DHTPin = D1;       //Đọc dữ liệu từ DHT11 ở chân D1 trên mạch esp8266
long lastMsg = 0;
char msg[50];
int value = 0;
// Xác định biến đếm và thời gian
long now = millis();
long lastMeasure = 0;
// Thiet Lap cam bien DHT.
DHT dht(DHTPin, DHTTYPE);
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  dht.begin();
}
// Hàm kết nối wifi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print(“Connecting to “);
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(“.”);
  }
  Serial.println(“”);
  Serial.println(“WiFi connected”);
  Serial.println(“IP address: “);
  Serial.println(WiFi.localIP());
}
// Hàm reconnect thực hiện kết nối lại khi mất kết nối với MQTT Broker
void reconnect() {
  // Chờ tới khi kết nối
  while (!client.connected()) {
    Serial.print(“Attempting MQTT connection…”);
    // Thực hiện kết nối với mqtt user và pass
    if (client.connect(“ESP8266Client”,mqtt_user, mqtt_pwd)) {
      Serial.println(“connected”);
      // Khi kết nối sẽ publish thông báo
      client.publish(mqtt_topic_pub, “ESP_reconnected”);
      // … và nhận lại thông tin này
      client.subscribe(mqtt_topic_sub);
    } else {
      Serial.print(“failed, rc=”);
      Serial.print(client.state());
      Serial.println(” try again in 5 seconds”);
      // Đợi 5s
      delay(5000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  if(!client.loop())
    client.connect(“ESP8266Client”);
  now = millis();
  // Publishes nhiệt độ,độ ẩm lên broker mỗi 30s
  if (now – lastMeasure > 1000) {
    lastMeasure = now;
  
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    float l = analogRead(A0);
    float light = 1024 – l;
    // Kiểm tra xem có bất kì lỗi nào không (nếu có thử lại)
    if (isnan(h) || isnan(t) /*|| isnan(l)*/) {
      Serial.println(“Failed to read from DHT sensor!”);
      return;
    }
    static char temperatureTemp[7];
    dtostrf(t, 6, 2, temperatureTemp);   
    static char humidityTemp[7];
    dtostrf(h, 6, 2, humidityTemp);
    // Publishes Temperature and Humidity values
    client.publish(“sensor/temperature”, temperatureTemp); //Để nguyên nếu bạn đăng kí topic là sensor/temperature
    client.publish(“sensor/humidity”, humidityTemp); //Để nguyên nếu bạn đăng kí topic là sensor/humidity
   
    Serial.print(“Humidity: “);
    Serial.print(h);
    Serial.print(” %\t Temperature: “);
    Serial.print(t);
    Serial.print(” *C “);
    Serial.print(“\n “);
  }
}

Sau khi nạp code hãy xem kiểm tra ở cửa sổ Serial để xem NodeMCU đã kết nối được với Home Assistant hay chưa như hình :

Và trên trang Home Assistant sẽ hiển thị lên nhiệt độ , độ ẩm như hình

Như vậy ta đã hiển thị được thành công giá trị nhiệt độ ,độ ẩm lên Home Assistant ,để đẹp hơn ta có thể tạo một danh sách để hiện thị giá trị cảm biến trên Home Assistant .Ta thêm đoạn code sau vào file group.yaml  :

sensor:
name: Sensor
icon: mdi:oil-temperature
view: no
entities:
– sensor.humidity
– sensor.temperature

Cấu hình đầy đủ cho file group.yaml bạn có thể xem tại đây

Kết quả ta được như hình :

Để hiện thị biểu đồ nhiệt độ độ ẩm ta tiếp tục thêm đoan code sau vào file configuration.yaml :

history_graph:
gr1:
name: Temperature
entities:
– sensor.temperature
gr2:
name: Humidity
entities:
– sensor.humidity

Cấu hình chi tiết bạn có thể xem tại đây : https://www.home-assistant.io/components/history_graph/

Và đây là thành quả sau các bước cấu hình bên trên :

Như vậy ta đã thành công khi đọc dữ liệu từ cảm biết DHT 11 hiển thị lên Home Assistant , bạn cũng có thể thay DHT 11 thành các biến khác và làm tương tự để hiển thị giá trị . Qua đó có thể kiểm soát được nhiệt độ ,độ ẩm của từng phòng trong hệ thống nhà thông minh.

Mọi thắc mắc bạn có thể comment bên dưới mỗi bài viết, lophocvui.com chúc các bạn thành công !!!

Related Articles

Close
Close