1.1Yêu cầu bài tập lớnTrong khuôn khổ bài tập lớn môn học Thiết kế hệ thống nhúng, nhóm chúng em quyết địnhchọn đề tài: “Hệ thống giám sát nhiệt độ và độ ẩm theo thời gian thực.” Đề tài
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI TRƯỜNG ĐIỆN – ĐIỆN TỬ
-
BÁO CÁO BÀI TẬP LỚN
Đề tài : Hệ thống đo nhiệt độ, độ ẩm và ánh sáng
Giảng viên hướng dẫn TS Nguyễn Cảnh Quang
Lê Đình Hiệp Dương Minh Huy
Vũ Mạnh Trung
Hà Nội, 02/2022
20191827 20191891 20192127
Trang 2MC LC
CHƯƠNG 1 TỔNG QUAN ĐỀ TÀI 2
1.1 YÊU CẦU BÀI TẬP LỚN 2
1.2 MỤC TIÊU THIẾT KẾ 3
CHƯƠNG 2 GIỚI THIỆU PHẦN CỨNG 4
2.1 NGUYÊN LÝ CÁC MODULE PHẦN CỨNG 4
2.1.1 Kit ESP32 DOIT DEVKIT V1 4
2.1.2 Module cảm biến nhiệt độ, độ ẩm DHT11 5
2.1.3 Màn hình LCD 7
CHƯƠNG 3 SƠ ĐỒ KHỐI 7
3.1 SƠ ĐỒ KHỐI, LƯU ĐỒ THUẬT TOÁN GIAO TIẾP GIỮA VI ĐIỀU KHIỂN ESP32 VÀ MODULE PHẦN CỨNG 8
3.2 LẬP TRÌNH SUPER LOOP CHẠY TỪNG TASK MỘT TỪ TRÊN XUỐNG DƯỚI 9
CHƯƠNG 4 SƠ ĐỒ NGUYÊN LÍ 9
4.1 CÁC NGOẠI ESP32 VI CẦN SỬ DỤNG 9
4.2 SƠ ĐỒ GHÉP NỐI VI ĐIỀU KHIỂN VÀ MODULE PHẦN CỨNG 10
CHƯƠNG 5 MÔ PHỎNG VÀ CHẠY THỬ 12
5.1 MÔ PHỎNG 12
5.2 KẾT QUẢ CHẠY THỬ TRÊN MÔ PHỎNG 12
CHƯƠNG 6 KẾT QUẢ VÀ ĐÁNH GIÁ 12
6.1 CÁC KẾT QUẢ ĐẠT ĐƯỢC 12
6.2 PHÂN TÍCH VÀ ĐÁNH GIÁ KẾT QUẢ 12
TÀI LIỆU THAM KHẢO 13
Trang 31.1 Yêu cầu bài tập lớn
Trong khuôn khổ bài tập lớn môn học Thiết kế hệ thống nhúng, nhóm chúng em quyết định chọn đề tài: “Hệ thống giám sát nhiệt độ và độ ẩm theo thời gian thực.” Đề tài chúng em được trình bày gồm 5 chương:
Chương 1: Tổng quan đề tài
Chương 2: Giới thiệu phần cứng
Chương 3: Sơ đồ khối
Chương 4: Sơ đồ nguyên lí
Chương 5: Mô phỏng và chạy thử
Chương 5: Kết quả và đánh giá
Chúng em xin cảm ơn thầy Nguyễn Cảnh Quang đã luôn tận tình hướng dẫn chúng em trong suốt quá trình học trên lớp và thực hiện đề tài, do kiến thức chúng em còn rất nhiều hạn chế nên đề tài còn rất nhiều sai sót, mong thầy góp ý và chỉnh sửa để chúng em tiến bộ hơn Em xin chân thành cảm ơn!
1.2 Mục tiêu thiết kế
Triển khai ứng dụng thời gian thực trên vi điều khiển ESP32 với các yêu cầu:
Lập trình vi điều khiển ESP32 giao tiếp với cảm biến DHT11 và cảm biến quang cds hiển thị thông số lên LCD, truyền thông số lên web server Cài đặt thời gian và thông số bộ lập lịch từ máy tính
Gửi dữ liệu đo được lên web server
Trang 4CHƯƠNG 2 GIỚI THIỆU PHẦN CỨNG 2.1.1 Nguyên lý các module phần cứng
2.1.2 Vi điều khiển STM32F103C8T6
STM32F103C8T6 là vi điều khiển 32bit, thuộc họ F1 của dòng chip STM32 hãng ST
- Lõi ARM COTEX M3
- Tốc độ tối đa 72Mhz
- Bộ nhớ :
64 kbytes bộ nhớ Flash
20 kbytes SRAM
- Clock, reset và quản lý nguồn
Điện áp hoạt động từ 2.0 → 3.6V
Sử dụng thạch anh ngoài từ 4Mhz → 20Mhz
Thạch anh nội dùng dao động RC ở mode 8Mhz hoặc 40Khz
Trang 5Thông số kĩ thuật:
Bộ vi xử lý LX6 32-bit lõi đơn hoặc lõi kép với xung nhịp lên đến 240 MHz
520 KB SRAM, 448 KB ROM và 16 KB SRAM RTC
Hỗ trợ kết nối Wi-Fi 802.11 b / g / n với tốc độ lên đến 150 Mbps
Hỗ trợ cho cả thông số kỹ thuật Bluetooth v4.2 và BLE cổ điển
2.1.3 Kit ESP32 DOIT DEVKIT V1
Hình 1 Kit ESP32 DOIT DEVKIT V1 1
ESP32 là một hệ thống vi điều khiển trên chip (SoC) giá rẻ của Espressif Systems, nhà phát triển của ESP8266 SoC Nó là sự kế thừa của SoC ESP8266 và có cả hai biến thể lõi đơn và lõi kép của bộ vi xử lý 32-bit Xtensa LX6 của Tensilica với Wi-Fi và Bluetooth tích hợp Dưới đây là một số thông số kỹ thuật của kit:
Trang 6Điện áp hoạt động: 2.2 V 3.6 V
Bộ vi xử lý LX6 32-bit lõi đơn hoặc lõi kép với xung nhịp lên đến 240 MHz
Tích hợp cổng USB để nạp Bootloader hoặc sử dụng ngoại vi USB
Hỗ trợ kết nối Wi-Fi 802.11 b / g / n với tốc độ lên đến 150 Mbps
Kết nối nối tiếp bao gồm 4 x SPI, 2 x I2C, 2 x I2S, 3 x UART
2.1.4 Module cảm biến nhiệt độ, độ ẩm DHT11
Hình 2 Module DHT11 2
DHT11 là cảm biến nhiệt độ, độ ẩm rất thông dụng hiện nay vì chi phí giá rẻ và rất dễ lấy dữ liệu thông qua giao tiếp 1-wire Cảm biến được tích hợp bộ tiền xử lý tín hiệu giúp dữ liệu nhận
về được chính xác mà không cần phải thông qua mạch xử lý tín hiệu nào Dưới đây là một số thông số kỹ thuật:
Điện áp hoạt động: 35 VDC
Dải đo độ ẩm: 20%90% RH, sai số 5% RH
Dải đo nhiệt độ: 0 50 , sai số 2 ℃ ℃ ℃
Tần số lấy mẫu tối đa: 1 Hz
Khoảng cách truyền tối đa: 20 m
Sơ đồ chân module DHT11 gồm 2 chân cấp nguồn và 1 chân tín hiệu Hiện nay trên thị trường có hai loại thông dụng được đóng gói với 3 chân hoặc 4 chân
Nguyên lý hoạt động :
Trang 7Hình 3 Kết nối module DHT11 với vi điều khiển
Vi điều khiển giao tiếp với DHT11 theo chuẩn 1 wire với 2 bước:
Gửi yêu cầu đo tới DHT11, sau đó đợi DHT11 phản hồi
Khi DHT11 sẵn sàng giao tiếp, nó sẽ gửi lại 5 byte dữ liệu chứa giá trị nhiệt độ và độ ẩm
do được
Dưới đây là chi tiết các bước thực hiện:
Bước 1:
1 Đầu tiên vi điều khiển gửi tín hiệu Start: cấu hình chân DATA ở chế độ OUTPUT, kéo chân DATA xuống mức logic 0 trong khoảng thời gian tối thiểu 18 ms
2 Vi điều khiển kéo chân DATA lên mức logic 1, sau đó cấu hình lại chế độ INPUT
3 Sau khoảng thời gian 2040 s, DHT11 sẽ kéo chân DATA xuống mức logic 0 Trong trường hợp quá 40 s mà chân DATA vẫn chưa được kéo xuống mức logic 0 nghĩa là giao tiếp với DHT11 thất bại
4 Chân DATA sẽ được giữ ở mức logic 0 thời gian 80 s sau đó nó được kéo lên mức logic 1 trong 80 s Vi điểu khiển xác định việc giao tiếp thành công hay không với DHT11 qua chân DATA
Bước 2 :
1 Giá trị nhiệt độ và độ ẩm đo được sẽ được DHT11 gửi về vi điều khiển dưới dạng 5 byte:
a Byte 1: giá trị phần nguyên của độ ẩm
b Byte 2: giá trị phần thập phân của độ ẩm
c Byte 3: giá trị phần nguyên của nhiệt độ
d Byte 4: giá trị phần thập phân của nhiệt độ
e Byte 5: byte checksum (nếu byte 5 bằng tổng giá trị 4 byte trên thì dữ liệu thu được là chính xác)
2 Sau khi xác nhận thành công yêu cầu giao tiếp với DHT11, nó sẽ gửi liên tiếp 40 bit về vi điều khiển:
Với mỗi bit dữ liệu gửi về vi điều khiển, DHT11 sẽ kéo chân DATA xuống mức logic 0 trong 50 s, sau đó:
Nó sẽ kéo chân DATA lên mức logic 1 và giữ trong 2628 s nếu dữ liệu truyền về vi điều khiển là bit 0
Trang 8Hình 4 Biểu diễn mức logic 0
Nó sẽ kéo chân DATA lên mức logic 1 và giữ trong 70 µs nếu dữ liệu truyền về vi điều khiển là bit 1
Hình 5 Biểu diễn mức logic 1 5
2.1.5 Cảm biến nhiệt độ LM35
Thông số kĩ thuật:
Điện áp hoạt động: 4-20 VDC
Dòng điện tiêu thụ: khoảng 60uA
Khoảng đo: -55°C đến 150°C
Điện áp tuyến tính theo nhiệt độ: 10mV/°C
Sai số: 0.25°C
Trang 92.1.6 Cảm biến nhiệt độ DS18B20
Thông số kĩ thuật:
Nguồn: 3 – 5.5V
Dải đo nhiệt độ: -55 đến 125 độ
Sai số: +- 0.5 độ C khi đo ở dải -10 – 85 độ C
2.1.7 Màn hình LCD
Hình 6 Màn hình LCD 1602 6
Màn hình LCD 1602 (Liquid Crystal Display) được sử dụng trong rất nhiều ứng dụng của vi điều khiển LCD 1602 có rất nhiều ưu điểm so với các dạng hiển thị khác như: khả năng hiển thị
ký tự đa dạng (chữ, số, ký tự đồ họa); dễ dàng đưa vào mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau Dưới đây là một số thông số kỹ thuật quan trọng:
Dải điện áp hoạt động: 2.75.5 VDC
Điện áp ra mức cao: > 2.4 VDC
Trang 10Điện áp ra mức thấp: < 0.4 VDC.
Dòng điện cấp nguồn: 350µA600µA
Nhiệt độ hoạt động: -3075 ℃
Tụ C và C có tác dụng lọc điện áp cấp cho tải tiêu thụ lấy từ đầu ra của IC LM1117, tụ 4 5
C4 giúp ổn định điện áp đầu ra cung cấp cho tải, tụ C có trở kháng lớn, có tác dụng lọc nhiễu 5
điện áp đầu ra (nhiễu là điện áp không mong muốn làm cho dạng điện áp ra hình răng cưa)
3.1 Sơ đồ khối, Lưu đồ thuật toán giao tiếp giữa vi điều khiển ESP32 và module phần cứng
Hình 13 Sơ đồ khối hệ thống
Trang 11Hình 14 Lưu đồ thuật toán chương trình
4.1 Mô phỏng
Nhóm em chọn mô phỏng trên web https://wokwi.com Nó là một trình mô phỏng trực tuyến cho các nền tảng Arduino và các phát triển Điện tử
4.2 Kết quả chạy thử trên mô phỏng
Trang 12Hình 19 Kết quả mô phỏng
5.1 Các kết quả đạt được
Trang 13Hình 20 Thử nghiệm mạch trên breadboard
Hình 21 Kết quả vi điều khiển gửi về web server
CODE:
Trang 14#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <PubSubClient.h>
#include <WiFi.h>
const char* mqtt_server = "172.20.10.2";
const char* mqtt_user = "haison-nguyenphuc";
const char* mqtt_password = "soncua2001";
uint16_t mqtt_port = 1883;
const char* mqtt_clientId = "ClientEsp32";
#define SSID "Minh Huy"
#define PASSWORD "Minhhuy1010"
#define MSG_BUFFER_SIZE 50
#define LED 2
WiFiClient wifiClient;
PubSubClient client(wifiClient);
#define DHT_SENSOR_PIN 25 // ESP32 pin GIOP23 connected to DHT11 sensor
#define DHT_SENSOR_TYPE DHT11
int cambien = 2; //Cảm biến nối chân số 5 Arduino
int giatri;
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x3F, 16 column and 2 rows DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
void setup()
{
Serial.begin(115200);
Serial2.begin(115200, SERIAL_8N1, 16, 17);
setupWiFi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Trang 15pinMode(LED, OUTPUT);
dht_sensor.begin(); //Khởi động cảm biến
pinMode(cambien, INPUT);
lcd.init(); //Khởi động LCD
lcd.backlight(); //Mở đèn
lcd.setCursor(0,0);
lcd.print("DO AM:");
lcd.setCursor(0,1);
lcd.print("C|F:");
}
void loop()
{
if (!client.connected()) {
reconnect();
}
client.loop();
digitalWrite(LED, HIGH);
float doam = dht_sensor.readHumidity(); //Đọc độ ẩm
float doC = dht_sensor.readTemperature(); //Đọc nhiệt độ C
float doF = dht_sensor.readTemperature(true); //Đọc nhiệt độ F
// Kiểm tra cảm biến có hoạt động hay không
if (isnan(doam) || isnan(doC) || isnan(doF))
{
Serial.println("Không có giá trị trả về từ cảm biến DHT"); return;
Trang 16}
Serial.print("humidity value: ");
Serial.print(doam);
lcd.setCursor(7,0); //con trỏ vị trí số 7, hiện ô số 8
lcd.print(doam);
lcd.setCursor(12,0); //Con trở ở vị trí 12, hiện ô 13
lcd.print("%");
Serial.print("% Temperature value: ");
Serial.print(doC);
Serial.print("°C | ");
Serial.print(doF);
Serial.println("°F");
giatri = analogRead(cambien); //Đọc giá trị cảm biến và gán vào biến giatri Serial.print("Cuong do anh sang: ");
Serial.println(giatri);
lcd.setCursor(5,1);
lcd.print(doC);
lcd.setCursor(10,1);
lcd.print("|");
lcd.setCursor(11,1);
lcd.print(doF);
client.publish("sensor1", String(doam).c_str());
client.publish("sensor2", String(doC).c_str());
client.publish("sensor3", String(doF).c_str());
delay(2000);
}
Trang 17//callback function is used to receive value from mqtt broker void callback(char* topic, byte* payload, unsigned int length) { }
void setupWiFi() {
WiFi.begin(SSID, PASSWORD);
Serial.println("Waiting for WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi Connected.");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection ");
if (client.connect(mqtt_clientId, mqtt_user, mqtt_password)) { Serial.println("connected");
// Once connected, publish an announcement
client.publish("connected", "hello world");
// and resubscribe
client.subscribe("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
Trang 18}
}
5.2 Phân tích và đánh giá kết quả
Trong khuôn khổ bài tập lớn môn học Thiết kế hệ thống nhúng, nhóm em đã làm được các công việc:
Lập trình vi điểu khiển giao tiếp với cảm biến DHT11, cảm biến quang trở CDS, LCD và truyền nhận dữ liệu với máy tính
Gửi dữ liệu lên web server và phân tích
Trang 19TÀI LIỆU THAM KHẢO
[1] https://www.sparkfun.com/datasheets/Components/DS1307.pdf
[2] https://lib.hpu.edu.vn/bitstream/handle/123456789/17890/7_NguyenNgocTrung_DCL30 1.pdf
[3] https://www.mouser.com/datasheet/2/758/DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
[4] https://www.windriver.com/solutions/learning/rtos