CHƯƠNG IV
LẬP TRÌNH VÀ KIỂM THỬ 4.1. LẬP TRÌNH.
Trong đồ án này chúng em đã sử dụng ngôn ngữ C và ESPHome để lập trình cho kit wifi ESP8266 vì qua quá trình khảo sát em thấy ngôn ngữ C và ESPHome là một ngôn ngữ thông dụng, dễ dàng tương thích với nhiêu thiết bị khác nhau.
4.1.1. Giới thiệu về ngôn ngữ C.
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết các ứng dụng.
C là một ngôn ngữ lập trình tương đối nhỏ gọn vận hành gần với phần cứng và nó giống với ngôn ngữ Assembler hơn hầu hết các ngôn ngữ bậc cao. Hơn thế, C đôi khi được đánh giá như là "có khả năng di động", cho thấy sự khác nhau quan trọng giữa nó với ngôn ngữ bậc thấp như là Assembler, đó là việc mã C có thể được dịch và thi hành trong hầu hết các máy tính, hơn hẳn các ngôn ngữ hiện tại trong khi đó thì Assembler chỉ có thể chạy trong một số máy tính đặc biệt. Vì lý do này C được xem là ngôn ngữ bậc trung.
C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn trong mẫu hình lập trình thủ tục mà lại không đặt gánh nặng lên vai người viết ra trình dịch C, là những người bề bộn với các đặc tả phức tạp của ngôn ngữ. Cuối cùng C có thêm những chức năng sau:
- Một ngôn ngữ cốt lõi đơn giản, với các chức năng quan trọng chẳng hạn như là những hàm hay việc xử lý tập tin sẽ được cung cấp bởi các bộ thư viện các thủ tục.
- Tập trung trên mẫu hình lập trình thủ tục, với các phương tiện lập trình theo kiểu cấu trúc.
- Một hệ thống kiểu đơn giản nhằm loại bỏ nhiều phép toán không có ý nghĩa thực dụng.
- Dùng ngôn ngữ tiền xử lý, tức là các câu lệnh tiền xử lý C, cho các nhiệm vụ như là định nghĩa các macro và hàm chứa nhiều tập tin mã nguồn (bằng cách dùng câu lệnh tiền xử lý dạng #include chẳng hạn).
- Mức thấp của ngôn ngữ cho phép dùng tới bộ nhớ máy tính qua việc sử dụng kiểu dữ liệu pointer.
4.1.2. Giới thiệu về ESPHome.
Hình 4.1. ESPHome.
ESPHome là một công cụ đọc file cấu hình và tạo tệp nhị phân firmware tùy chỉnh. Cũng giống như trong Home Assistant, cấu hình được viết bằng YAML. ESPHome hỗ trợ một danh sách dài các cảm biến, có thể được cấu hình chỉ với một vài dòng YAML. Bên cạnh đó, ESPHome có thể điều khiển đèn, màn hình và nhiều thứ khác. Trong ESPHome, tất cả các thiết bị được gọi là các nút.
ESPHome (trước đây được gọi là esphomelib và hiện thuộc sở hữu của Nabu- Casa) là một công cụ mà bạn có thể tạo firmware tùy chỉnh cho các bo mạch dựa trên ESP8266 và ESP32. Firmware tùy chỉnh nghe có vẻ phức tạp nhưng ESPHome làm cho nó trở nên dễ dàng.
Bạn sẽ không cần bất kỳ kỹ năng lập trình nào để bắt đầu với ESPHome và nếu bạn có khả năng định cấu hình Home Assistant bằng YAML, bạn sẽ cảm thấy mọi thứ rất đơn giản. ESPHome là người bạn đồng hành hoàn hảo với Home Assistant. Có một tích hợp chính thức được tích hợp sẵn cho Home Assistant và các thiết bị ESPHome (hoặc các nút) trên mạng của bạn sẽ được phát hiện tự động.
ESPHome là một công cụ đọc file cấu hình và tạo tệp nhị phân firmware tùy chỉnh. Cũng giống như trong Home Assistant, cấu hình được viết bằng YAML. ESPHome hỗ trợ một danh sách dài các cảm biến, có thể được cấu hình chỉ với một vài dòng YAML. Bên cạnh đó, ESPHome có thể điều khiển đèn, màn hình và nhiều thứ khác. Trong ESPHome, tất cả các thiết bị được gọi là các nút. ESPHome có thể được cài đặt như một tiện ích bổ sung Home Assistant. Cũng giống như Home Assistant, ESPHome được xây dựng bằng ngôn ngữ lập trình Python và có thể được cài đặt nguyên bản.
4.2. CODE CHƯƠNG TRÌNH.
4.2.1. Code chương trình sử dụng ngôn ngữ C.
#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 "Wifi-Free"
#define password "66668888"
// Thông tin về MQTT Broker
#define mqtt_server "hassio.local" #define mqtt_topic_pub "test"
#define mqtt_topic_sub "test"
#define mqtt_user "lophocvui" #define mqtt_pwd "123456"
const uint16_t mqtt_port = 1883; //Port của MQTT WiFiClient espClient;
PubSubClient client(espClient);
const int DHTPin = D4; //Đọc dữ liệu từ DHT11 ở chân D4 trên mạch esp826 6
long lastMsg = 0;
char msg[50];
int value = 0;
// Timers auxiliar variables
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 new temperature and humidity every 30 seconds if (now - lastMeasure > 1000) { lastMeasure = now; float h = dht.readHumidity(); float t = dht.readTemperature(); // Check if any reads failed and exit early (to try again). 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);
dtostrf(h, 6, 2, humidityTemp);
// Publishes Temperature and Humidity values
client.publish("sensor/temperature", temperatureTemp); client.publish("sensor/humidity", humidityTemp);
Serial.print("Humidity: "); Serial.print(h);
Serial.print(" %\t Temperature: "); Serial.print(t);
Serial.print(" *C "); Serial.print("\n "); }
}
4.2.2. Code chương trình cấu hình bằng ESPHome.
esphome: name: living_room_nodemcu platform: ESP8266 board: nodemcuv2 wifi: ssid: "TP-LINK_8E0C" password: "97099475"
# Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Living Room Nodemcu" password: "YHJT3OyhCmM7" captive_portal: # Enable logging logger: # Enable Home Assistant API api: ota: sensor: - platform: dht pin: D2 temperature: name: "Living Room Temparature"
humidity:
name: "Living Room Humidity"
update_interval: 5s model: DHT11
4.2.3. Kiểm thử.
Hình 4.2.Trang chủ của Home Assistant.
Hình 4.4. Giao diện dòng lệnh của ESPHome.
Hình 4.6. Code giao diện hiển thị nhiệt độ và độ ẩm dưới dạng History-graph.
KẾT LUẬN
Việc thiết kế hệ thống điều khiển thiết bị và giám sát nhiệt độ, độ ẩm từ xa qua internet có ý nghĩa rất to lớn, có thể ứng dụng trong nhiều lĩnh vực của đời sống xã hội và trong công nghiệp. Ngoài ra, module wifi kết hợp với Home Assistant cũng mở ra rất nhiều hướng ứng dụng khác, phục vụ tốt cho việc học tập và nghiên cứu của sinh viên. Việc xây dựng hệ thống giám sát nhiệt độ, độ ẩm từ xa qua internet này cũng liên quan đến nhiều nền tảng kiến thức từ những kiến thức lý thuyết cho đến những kiến thức thực tiễn.
Hướng phát triển của đề tài:
Trong thời gian tới, em sẽ tiếp tục nghiên cứu phát triển đề tài theo hướng sau đây:
- Tăng tính chính xác và ổn định của hệ thống.
- Phát triển thêm nhiều chức năng cho hệ thống.
- Tích hợp nhiều module hơn nữa phù hợp với nhiều đối tượng người dùng
TÀI LIỆU THAM KHẢO https://www.home-assistant.io/docs/configuration/ https://filegi.com/tech-term/binary-file-165/ https://esphome.io/devices/esp8266.html https://theorangeone.net/posts/esphome-dht-sensor/ https://www.hackster.io/colinodell/mqtt-temperature-and-humidity-monitor-for- home-assistant-27b8d1