Báo cáo đồ án thiết kế điện tử - Đề tài IOT Smarthome automation System - được đánh giá cao Dự án nhà thông minh là một nỗ lực hiện đại để tối ưu hóa sự tiện nghi và an ninh trong không gian sống. Với việc tích hợp các công nghệ tiên tiến như Internet of Things (IoT), và tự động hóa, nhà thông minh không chỉ mang lại sự thoải mái và tiện lợi mà còn tăng cường sự an toàn và tiết kiệm năng lượng. Từ việc điều chỉnh ánh sáng, nhiệt độ đến quản lý thiết bị gia đình từ xa, dự án nhà thông minh mang đến trải nghiệm sống hiện đại và tiên tiến cho cư dân, đồng thời giúp tối ưu hóa quản lý và sử dụng tài nguyên. Nội dung chính của đề tài: • Chương 1: Cơ sở lý thuyết. • Chương 2: Thiết kế hệ thống. • Chương 3: Kết quả sản phẩm và đánh giá hoạt động.
CƠ SỞ LÝ THUYẾT
Giới thiệu Bot trên Telegram
Được giới thiệu vào năm 2015, Telegram Bots là ứng dụng trò chuyện của bên thứ ba được thực hiện với API Telegram Bot Các bot Telegram về cơ bản là tài khoản Telegram tự động có thể trò chuyện hoặc thêm làm bạn bè vào các cuộc trò chuyện, nhóm hoặc kênh của mình.
Trong khi các ứng dụng nhắn tin khác như WhatsApp và Kakao đặt ra các giới hạn nghiêm ngặt về những gì người dùng có thể tạo, Telegram cho phép người dùng của họ tạo Telegram Bots cho hầu hết mọi thứ.
Bước 1: Trên Telegram, tìm kiếm Botfather:
Hinh 1.1 Tìm kiếm từ khóa BotFather
Bước 2: Chọn BotFather có tích xanh:
Bước 3: Nhập lệnh /start và nhấn Enter để bắt đầu tạo bot mới:
Bước 4: Nhấn vào lệnh /newbot:
Bước 5: Nhập tên bot mà người dùng muốn tạo:
Hinh 1 5 Tạo tên cho Bot khởi tạo
Bước 6: Nhập username cho Bot của người dùng tạo:
Bước 7: Hệ thống sẽ gửi tin nhắn báo tạo bot Telegram thành công:
Hinh 1 7 Tin nhắn tạo Bot thành công 1.2.2 Cách thêm Bot trong hội nhóm
Bước 1: Mở ứng dụng Telegram, nhập tên nhóm lên khung chat muốn thêm Bot:
Hinh 1 8 Tìm kiếm nhóm muốn thêm Bot
Bước 2: Chọn tên của nhóm để hiển thị khung Group Infor, sau đó nhấn biểu tượng thêm thành viên ở khung màu đỏ:
Hinh 1 9 Chọn biểu tượng thêm thành viên trong hội nhóm
Bước 3: Chọn tên Bot muốn thêm, sau đó ấn nút add ở dưới cùng:
Hinh 1 10 Thêm Bot muốn tham gia với hội nhóm
Bước 4: Kết quả thành công sau khi thêm Bot
Tính bảo mật của ứng dụng Telegram
Telegram sử dụng biện pháp mã hóa đầu cuối giống như WhatsApp và Signal. Loại mã hóa này chuyển đổi tin nhắn thành mật mã mà không cần sự trợ giúp của máy chủ ở giữa khiến nó gần như không thể truy cập vào giao tiếp giữa hai người dùng khi không có sự đồng ý của họ
Cơ chế bảo mật của Telegram:
Telegram là ứng dụng trò chuyện miễn phí và độ bảo mật cực kỳ cao
Cơ chế bảo mật của Telegram tốt đến mức các công ty của Nga cũng không thể truy cập được.
Cuộc gọi, tin nhắn, đoạn chat của người dùng trên Telegram được mã hóa đầu cuối (end – to – end).
Dữ liệu sẽ được mã hóa ngay tại điện thoại của người gửi chuyển đến điện thoại người nhận và sau đó được giải mã
Lựa chọn Telegram Bot API
Telegram Bots là những tài khoản đặc biệt không yêu cầu thêm số điện thoại để thiết lập Các tài khoản này đóng vai trò là giao diện cho mã chạy ở đâu đó trên máy chủ của ngươif dùng.
Để sử dụng tính năng này, người dùng không cần biết bất kỳ điều gì về cách thức hoạt động của giao thức mã hóa MTProto của nhà phát triển
Máy chủ trung gian của hãng sẽ xử lý tất cả quá trình mã hóa và giao tiếp với API Telegram cho người dùng
Người dùng có thể giao tiếp với máy chủ này thông qua giao diện HTTPS đơn giản cung cấp phiên bản đơn giản hóa của API Telegram.
QUICK CHART
QuickChart là một dịch vụ tiện lợi giúp người dùng tạo hình ảnh biểu đồ một cách nhanh chóng, dễ dàng Các biểu đồ này có thể được nhúng vào nhiều định dạng khác nhau, bao gồm email, SMS, Chatbot Điểm nổi bật của QuickChart là sử dụng Chart.js, một thư viện biểu đồ nguồn mở phổ biến, để tạo nên những biểu đồ trực quan và chuyên nghiệp.
Hình 1.13 Trang chủ của QuickChart
GIỚI THIỆU VỀ ESP32
ESP32 là một module Wi-Fi và Bluetooth tích hợp, được phát triển bởi Espressif System Được ra mắt vào năm 2016 , ESP32 được biết đến như một phiên bản nâng cấp của ESP8266 với nhiều tính năng và khả năng mở năng mở rộng hơn.
Ngoài Wi-Fi và Bluetooth , ESP32 còn hỗ trợ các giao tiếp khác như UART, SPI, I2C, GPIO, PWM và nhiều giao tiếp khác, tạo điều kiện thuận lợi cho việc kết nối với các thiết bị và cảm biến khác ESP32 cung cấp các chân GPIO đa dạng cho phép người dùng mở rộng chức năng của module thông qua việc kết nối với các module mở rộng và cảm biến bên ngoài.
Có sẵn nhiều framework và công cụ phát triển như Arduino IDE, ESP-IDE (Espressif IoT Development Framework),MicroPython và PlatfrormIO, giúp việc phát triển ứng dụng trở nên dễ dàng hơn.
Hình 1.14 Sơ đồ chân ESP-WROOM-32-30 chân
GIAO THỨC HTTPS
HTTPS (Hypertext Transfer Protocol Secure) là giao thức truyền tải siêu văn bản an toàn Thực chất, đây chính là giao thức HTTP nhưng tích hợp thêm Chứng chỉ bảo mật SSL nhằm mã hóa các thông điệp giao tiếp để tăng tính bảo mật Có thể hiểu,HTTPS là phiên bản HTTP an toàn, bảo mật hơn.
Hình 1.16 Mô tả giao thức HTTPS
HTTPS hoạt động tương tự như HTTP, tuy nhiên được bổ sung thêm chứng chỉ SSL
(Secure Sockets Layer – tầng ổ bảo mật) hoặc TLS (Transport Layer Security – bảo mật tầng truyền tải) Hiện tại, đây là các tiêu chuẩn bảo mật hàng đầu cho hàng triệu website trên toàn thế giới.
Cả SSL và TLS đều sử dụng hệ thống PKI (Public Key Infrastructure -hạ tầng khóa công khai) không đối xứng Hệ thống này sử dụng hai “khóa” để mã hóa thông tin liên lạc, “khóa công khai” (public key) và “khóa riêng” (private key) Bất cứ thứ gì được mã hóa bằng khóa công khai chỉ có thể được giải mã bởi khóa riêng và ngược lại Các tiêu chuẩn này đảm bảo các nội dung sẽ được mã hóa trước khi truyền đi, và giải mã khi nhận Điều này khiến hacker dù có chen ngang lấy được thông tin cũng không thể
“hiểu” được thông tin đó.
KẾT LUẬN CHƯƠNG
Qua những kiến thức tổng quan đã được tìm hiểu và nghiên cứu, tham khảo từ nhiều nguồn khác nhau, chúng em đã quyết định và hình dung được thiết kế hệ thống của em gồm những phần chính sau:
Sử dụng vi xử lý là ESP32 để xử lý các tác vụ
Các thiết bị trong nhà được giao tiếp với nhau qua giao thức HTTPS.
Sử dụng trang web QuickChart để thực hiện vẽ biểu đồ nhiệt độ, độ ẩm
THIẾT KẾ HỆ THỐNG
TỔNG QUAN VỀ HỆ THỐNG
Hình 2.1 Sơ đồ hệ thống.
Mô tả sơ lược về hệ thống Hệ thống nhà thông minh sử dụng esp32 bao gồm các chức năng:
Điều khiển 4 thiết bị đầu ra qua Telagram chatbot “điều khiển được từ xa” Hay cũng có thể điều khiển trực tiếp qua cảm biến chạm (ở đây bọn em sử dụng 4 đèn là 4 thiết bị đầu ra).
Đo nhiệt độ , độ ẩm (được đọc từ cảm biến DHT22) gửi tin nhắn về Telegram chatbot bằng dạng text và biểu đồ.
Thực hiện cài đặt ngưỡng cho nhiệt độ và độ ẩm, nếu nhiệt độ (độ ẩm) vượt quá khoảng đã được cài đặt thì sẽ thực hiện bật (tắt) thiết bị và thông báo tới người dùng.
THIẾT KẾ PHẦN CỨNG
2.2.1 Danh sách linh kiện và chức năng
STT Khối Tên linh kiện Chức nămg trong hệ thống
1 Vi điều khiển ESP32 Xử lý tất cả các tác vụ
Là công tăng có tác dụng bật tắt các thiệt bị Cảm biến nhiệt độ DTH22 Đo nhiệt độ, độ ẩm
Là khối Relay bao gồm trans, trở, diode, opto quang.
Khi nhận tín hiệu kích từ VĐK, relay sẽ bật các thiết bị.
4 Khối nguồn Module nguồn HiLink Chuyển từ 220v -> 5v
2.2.2 Thiết kế hệ thống trên phần mềm ALTIUM
Hình 2.2 Sơ đồ nguyên lý 2.2.2.2 Bản vẽ PCB
Hình 2.5 Lớp 3D 2.2.3 Mạch thực tế
THIẾT KẾ PHẦN MỀM
Phần này sẽ thiết kế các giao diện và các chức năng để điều khiển các thiết bị.
Mỗi Bot Telgram đều có một mã token khác nhau.
Khi người dùng khởi tạo Bot thành công thì Botfather sẽ gửi tin nhắn đến bao gồm Token của Bot.
Người lập trình sẽ sử dụng Bot Tọken kết hợp với Bot Api để tạo ra Bot mong muốn.
Hình 2 9 Các bước để lấy mã token trong Telegram
Khởi tạo Bot: Sử dụng thư viện sẵn có UniversalTelegramBot
UniversalTelegramBot bot(BOT_TOKEN, clientTCP);
Bàn phím Inline mới cho phép người dùng nhấp và gửi tin nhắn đến bot (không gửi đến cuộc trò chuyện), sau đó lập trình viên có thể xử lý bot để hiển thị kết quả như mong muốn trong cuộc trò chuyện.
String BOT_TOKEN = "6691707417:AAF0INIQzjme0ODUPY0_Yb9tWd1p9tIbVk4"; // bot token lay tu bot father
Hình 2 10 Inline Keyboards trong ứng dụng Telegram
Xây dựng chương trình tạo Inline Keyboard cho giao diện bắt đầu:
String keyboardJson = F("[[{ \"text\" : \"LIGHT\", \"callback_data\" :
\"light\" },{ \"text\" : \"TEMPERATURE-HUMIDITY\", \"callback_data\" :
F("[{\"text\" : \"STATUS\", \"callback_data\" : \"STATUS\"}],"); keyboardJson += F("[{\"text\" : \"SETUP THRESHOLD\", \"callback_data\" : \"/set\"}]]"); bot.sendMessageWithInlineKeyboard(CHAT_ID, "NHÀ THÔNG MINH", "", keyboardJson);
Hình 2 11 Kết quả chạy chương trình khởi đầu dùng Inline Keyboard
2.3.1 Điều khiển 4 thiết bị đầu ra ở Telegram
Code tạo giao diện điều khiển if (text == F("light")) {
String keyboardJson = F("[[{ \"text\" : \"ON LED
1\", \"callback_data\" : \"ON1\" },{ \"text\" : \"OFF LED
1\", \"callback_data\" : \"OFF1\" }],"); keyboardJson += F("[{ \"text\" : \"ON LED
2\", \"callback_data\" : \"ON2\" },{ \"text\" : \"OFF LED
2\", \"callback_data\" : \"OFF2\" }],"); keyboardJson += F("[{ \"text\" : \"ON LED
3\", \"callback_data\" : \"onfan1\" },{ \"text\" : \"OFF LED
3\", \"callback_data\" : \"offfan1\" }],"); keyboardJson += F("[{ \"text\" : \"ON LED
4\", \"callback_data\" : \"onfan2\" },{ \"text\" : \"OFF LED
4\", \"callback_data\" : \"offfan2\" }],"); keyboardJson += F("[{ \"text\" : \"ON
ALL\", \"callback_data\" : \"onall\" },{ \"text\" : \"OFF
ALL\", \"callback_data\" : \"offall\" }]]"); bot.sendMessageWithInlineKeyboard(CHAT_ID, "LED LIGHTS", "", keyboardJson);
Hình 2 12 Kết quả giao diện điều khiển Inline Keyboard
Điều khiển bật tắt 4 thiết bị đầu ra qua Telegram, khi ta nhấn từng nút trên bảng điều khiển.
2.3.2 Điều khiển thiết bị sử dụng cảm biến chạm
Sử dụng ngắt (attachInterrupt) với kiểu kích hoạt là “FALLING” FALLING : kích hoạt khi trạng thái của chân digital chuyển từ mức điện áp cao sang mức điện áp thấp. Gọi hàm ngắt trong Setup với mức kích hoạt là FALLING. attachInterrupt(switch_1,thietbi1,FALLING); attachInterrupt(switch_2,thietbi2,FALLING); attachInterrupt(switch_3,thietbi3,FALLING); attachInterrupt(switch_4,thietbi4,FALLING);
Các hàm chức năng. void thietbi1() { state_tb1 = ~state_tb1;
Serial.println("TB1"); digitalWrite(relay_1, state_tb1);
} void thietbi2() { state_tb2 = ~state_tb2;
Serial.println("TB2"); digitalWrite(relay_2, state_tb2);
} void thietbi3() { state_tb3 = ~state_tb3;
Serial.println("TB3"); digitalWrite(relay_3, state_tb3);
} void thietbi4() { state_tb4 = ~state_tb4;
Serial.println("TB4"); digitalWrite(relay_4, state_tb4);
2.3.3 Khối tạo biểu độ nhiệt độ độ ẩm
Bước đầu của tạo ảnh là tạo data cho ảnh Đọc data nhiệt độ, độ ẩm từ cảm biến
DHT22 và tạo data thời thời gian thực bằng việc sử dụng hàm tính thời gian thực echotime() trong thư viện NTPClient.h.
Code tạo data : void Creat_data() { long epochTime = timeClient.getEpochTime(); // Lấy epoch time float Humidity = dht.readHumidity(); float Temperature = dht.readTemperature();
Serial.println(Temperature); if (isnan(Humidity) || isnan(Temperature)) {
Serial.println("Lỗi khi đọc dữ liệu từ cảm biến DHT!"); return;
ReportData.push({Temperature, Humidity, epochTime});
} void Delete_data(unsigned long t) { while (ReportData.size() > 0 && ReportData[0].EpochTime_number < t) {
String EpochTime_to_string( unsigned long number) { time_t timestamp = number; tmElements_t t; breakTime(timestamp, t); char buffer[25]; sprintf(buffer, "%4d-%02d-%02dT%02d:%02d:%02dZ", t.Year + 1970, t.Month, t.Day, t.Hour, t.Minute, t.Second); return String(buffer);
String left_time = EpochTime_to_string(start_time);
String right_time = EpochTime_to_string(end_time);
String times = "'" + left_time + "'," + "'" + right_time + "'";
Serial.print(times); return times;
Hàm “Creat_data() ” có chức năng lấy dữ liệu từ cảm biến DHT22 và thời hiện tại và gửi vào cấu trúc ReportData.
Hàm “Delete_data(unsigned long t) ” có chức năng làm mới lại data dữ liệu sau khoảng thời gian t (2 giờ).
Hàm “EpochTime_to_string( unsigned long number) ” có chức năng tính toán thời gian thực, tạo data thời gian.
Hàm “Build_axisX() ” tạo thời gian bắt đầu và kết thúc cho trục biểu diễn thời gian.
Sau khi chúng ta đã tạo data xong Thì chúng ta đến bước tạo ảnh Đầu tiên tạo một mã Json tạo biểu đồ theo yêu cầu hiển thị.
String str1 = "https://quickchart.io/chart?c={'type':'line','data':
[{'label':'Nhietdo','borderColor':'blue','fill':false,'borderWidth':3,'da ta':[";
{'label':'Doam','borderColor':'green','fill':false,'borderWidth':3,'data' :[";
String str4 = "]}]},'options':{'legend':{'position':'bottom'},'title':
{'text':'Chart.jsTimeScale'},'scales':{'xAxes':[{'type':'time','time':
DDTHH:mm:ssZ','unit':'minute','unitStepSize':15,'displayFormats':
{'display':false,'labelString':'Time'},'ticks':{'major':
{'enabled':true}}}],'yAxes':[{'id':'y-axis-
1','position':'left','scaleLabel':{'display':false,'labelString':'Nhi? tđ?','fontColor':'rgba(255,0,0,1)'},'ticks':
{'min':0,'max':100,'stepSize':10,'fontColor':'rgba(255,0,0,1)'}},
{'id':'y-axis-2','position':'right','scaleLabel':
{'display':false,'labelString':'Đ?? m','fontColor':'rgba(0,0,255,1)'},'ticks':
{'min':0,'max':100,'stepSize':10,'fontColor':'rgba(0,0,255,1)'}}]},'plugi ns':{'datalabels':
{'display':true,'color':'gray','align':'right','formatter':function(value ,context)
{index=context.dataIndex;data=context.dataset.data;if(index==a.length -1)return(data[index].y);return('');}}}}}";
Bốn biến string (str1,str2,str3,str4) trên chứa mã Json vẽ biều đồ đã được phác họa và được link đến trang Wed Quickchart.
Mô tả biểu đồ: Biểu đồ sẽ có 2 cột Y1 và Y2 lần lượt là thang nhiệt độ và độ ẩm Với thang nhiệt độ biểu diễn giá trị từ 0℃ đến 40℃, thang độ ẩm từ 55% đến 40℃ đến 40℃, thang độ ẩm từ 55% , thang độ ẩm từ 55% đến 95% Còn trục X biểu diễn thời gian trong 2h và độ chia là 15’
//Creat_data(); int sizee = ReportData.size();
String str1 = "https://quickchart.io/chart?c={'type':'line','data':
[{'label':'Nhietdo','borderColor':'blue','fill':false,'borderWidth':3,'da ta':[";
{'label':'Doam','borderColor':'green','fill':false,'borderWidth':3,'data' :[";
String str4 = "]}]},'options':{'legend':{'position':'bottom'},'title': {'text':'Chart.jsTimeScale'},'scales':{'xAxes':[{'type':'time','time':
DDTHH:mm:ssZ','unit':'minute','unitStepSize':15,'displayFormats':
{'display':false,'labelString':'Time'},'ticks':{'major':
{'enabled':true}}}],'yAxes':[{'id':'y-axis-
1','position':'left','scaleLabel':{'display':false,'labelString':'Nhi? tđ?','fontColor':'rgba(255,0,0,1)'},'ticks':
{'min':0,'max':100,'stepSize':10,'fontColor':'rgba(255,0,0,1)'}},
{'id':'y-axis-2','position':'right','scaleLabel':
{'display':false,'labelString':'Đ?? m','fontColor':'rgba(0,0,255,1)'},'ticks':
{'min':0,'max':100,'stepSize':10,'fontColor':'rgba(0,0,255,1)'}}]},'plugi ns':{'datalabels':
{'display':true,'color':'gray','align':'right','formatter':function(value ,context)
{index=context.dataIndex;data=context.dataset.data;if(index==a.length -1)return(data[index].y);return('');}}}}}";
String times, nhiet_do, do_am;
Data_x = Build_axisX(); for (int i = 0; i < ReportData.size(); i++) { nhiet_do += "{'x':'" +
EpochTime_to_string(ReportData[i].EpochTime_number) + "','y':" +
String(ReportData[i].temperatures) + "}"; do_am += "{'x':'" +
EpochTime_to_string(ReportData[i].EpochTime_number) + "','y':" +
String(ReportData[i].humiditys) + "}"; if (i < ReportData.size() - 1) { do_am += ","; nhiet_do += ",";
String graphURL = str1 + Data_x.c_str() + str2 + nhiet_do + str3 + do_am + str4; //+times+str5;
Serial.println(graphURL); return graphURL;
Trong đoạn mã trên, hàm "create_image()" đảm nhiệm vai trò đóng gói các dữ liệu về nhiệt độ, độ ẩm, và thời gian theo biểu đồ có sẵn Quá trình này tương tự như đóng gói sản phẩm trước khi gửi đi.
Khi có yêu cầu từ bảng điều khiển Telegram, vi xử lý sẽ gửi ảnh lên Telegram bằng phương thức GET theo chuẩn HTTP Telegram sẽ phản hồi với mã 200 nếu yêu cầu thành công, nếu không sẽ trả về mã khác (do kết nối mạng không ổn định).
Code thực hiện chức năng gửi nhiệt độ - độ ẩm hiện tại và biểu đồ nhiệt độ - độ ẩm if (text == "now") { float t = dht.readTemperature(); float h = dht.readHumidity();
String temp = "Nhiệt độ: "; temp += float(t); temp += "*C\n"; temp += " Độ ẩm: "; temp += float(h); temp += " %"; bot.sendMessage(CHAT_ID, temp, "");
} else if (text == "2 hours") { unsigned long EpochTime = timeClient.getEpochTime(); time_t timestamp = EpochTime; tmElements_t times; breakTime(timestamp, times); start_time = EpochTime - 3600 - times.Minute * 60 - times.Second; if (ReportData[0].EpochTime_number >= start_time + 60 * 60 ) { start_time += 60 * 60;
Delete_data(start_time); end_time = start_time + 2 * 60 * 60 ;
String url = url_send_photo + tam;
Serial.println(url); http.begin( url); int httpResponseCode = http.GET(); if (httpResponseCode > 0) { response = http.getString();
Serial.println("Sending photo: " + response);
Serial.print("Error send photo Error code: ");
2.3.4 Thiết lập ngưỡng cho nhiệt độ, độ ẩm
Mục đích của việc cài đặt ngưỡng tự động này là giúp người dùng có thể tự cài đặt ngưỡng bật thiết bị trong phòng một cách tự động theo nhiệt độ và độ ẩm trong phòng được cảm biến ghi lại.
Tạo giao diện chọn. if (text == F("/set")) {
F("[[{ \"text\" : \"Temperature\", \"callback_data\" : \"temp\" },
{ \"text\" : \"Humidity\", \"callback_data\" : \"hum\" }]]"); bot.sendMessageWithInlineKeyboard(CHAT_ID, "SETUP THRESHOLD", "", keyboardJson);
Hình 2.13 Giao diện chọn ngưỡng theo nhiệt độ và độ ẩm.
Khi ta nhấn chọn “Temperture” hay “Humidity” thì hệ thống thông báo ngưỡng mà chúng ta muốn cài đặt và chúng ta nhậm theo đúng cú pháp để cài đặt, được minh họa như hình dưới đây.
Code thực hiện đọc ngưỡng người dùng nhập từ cửa sổ chat. if (text == "temp") { bot.sendMessage(CHAT_ID, "Bạn hãy nhập ngưỡng cho nhiệt độ
(min-max): "); flag_temp = true ; flag_hum = false ;
} else if (text == "hum") { bot.sendMessage(CHAT_ID, "Bạn hãy nhập ngưỡng cho độ ẩm (min- max): "); flag_hum = true; flag_temp = false ;
String text = bot.messages[i].text;
Serial.println(text); if (text.startsWith( "/") && flag_temp) { flag_temp = false; textMax = text.substring(4, 6);
TemMax = textMax.toInt(); textMin = text.substring(1, 3);
Serial.println("Nhan duoc gia tri:");
Serial.println(TemMin); text = "Nhan duoc gia tri: \n"; text += "Tempmax: "; text += float(TemMax); text += "\nTemMin: "; text += float(TemMin); bot.sendMessage(CHAT_ID, text, "");
} if ( text.startsWith( "/") && flag_hum) { flag_hum = false; textMax = text.substring(4, 6);
HumMax = textMax.toInt(); textMin = text.substring(1, 3);
Serial.println("Nhan duoc gia tri:");
Serial.println(HumMin); text = "Nhan duoc gia tri: \n"; text += "Hummax: "; text += float(HumMax); text += "\nHumMin: "; text += float(HumMin); bot.sendMessage(CHAT_ID, text, "");
Code thực hiện thông báo và điều khiển khi nhiệt độ vượt quá ngưỡng float Humidity = dht.readHumidity(); float Temperature = dht.readTemperature();
// -SETUP TEMPRERATURE - if (Temperature >= TemMax && !tempAlertSent) { // Nếu nhiệt độ lớn hơn
T max và thông báo chưa được gửi state_tb1 = 1; digitalWrite(relay_1, state_tb1);
String temp = "Nhiệt độ đã vượt quá "; temp += String(TemMax); // Sử dụng String() để chuyển đổi số thành chuỗi temp += "*C\n"; temp += "Thực hiện bật quạt"; bot.sendMessage(CHAT_ID, temp, ""); tempAlertSent = true; // Đánh dấu là thông báo đã được gửi
} else if (Temperature TemMin) { tempAlertSent = false;
// -SETUP-HUM - if (Humidity >= HumMax && !humAlertSent) { // Nếu Do am lớn hơn max và thông báo chưa được gửi state_tb3 = 1; digitalWrite(relay_3, state_tb3);
String hum = "Độ ẩm đã vượt quá "; hum += String(HumMax); // Sử dụng String() để chuyển đổi số thành chuỗi hum += "%\n"; hum += "Thực hiện bật hút ẩm"; bot.sendMessage(CHAT_ID, hum, ""); humAlertSent = true; // Đánh dấu là thông báo đã được gửi
} else if (Humidity TemMin) { humAlertSent = false;
KẾT LUẬN CHƯƠNG
Chương 2 đã hoàn thành phần thiết kế hệ thống, từ thiết kế chatbot, các chức năng trên chatbot cho đến thiết kế phần cứng.
KẾT QUẢ VÀ ĐÁNH GIÁ HỆ THỐNG
Kết quả đạt được
Giao diện khi hệ thống được khởi động :
Khi người dùng bấm vào LIGHT:
Khi người dùng chọn TEMPERATURE – HUMIDITY
Khi người dùng chọn STATUS
Khi người dùng chọn SETUP THRESHOLD
Thông báo khi độ ẩm vượt quá mức cài đặt :
Biểu đồ nhiệt độ - độ ẩm khi đo được trong 2 giờ :
Đánh giá
Các bước cài đặt và thêm bot vào hội nhóm đơn giản, dễ dàng với người dùng.
Tận dụng được tính năng bảo mật mạnh của Telegram (không phải tự mở cổng server ra internet).
Không phải cài thêm hoặc tự làm app riêng để điều khiển smarthome và người dùng đã quen thuộc với các app chat.
Với khả năng kết nối mọi lúc mọi nơi, người dùng có thể dễ dàng giám sát và điều khiển các thiết bị gia dụng thông minh từ xa, mang đến sự tiện lợi trong việc quản lý ngôi nhà.
Dữ liệu đầu vào đơn giản chỉ là dạng văn bản người dùng gõ máy, chưa có xử lý dữ liệu như ản hay nhận dạng tiếng nói.
Một số tính năng cao cấp như tùy chỉnh giao diện bot, tự động thêm hoặc xóa thành viên bằng bot, đang bị hạn chế do phụ thuộc vào API bot của Telegram.
Kết luận chương
Chương III là những kết quả đạt được, thử nghiệm với hệ thống thực tế để đưa ra những đánh giá ưu điểm và nhược điểm của hệ thống Từ đó có thể đưa ra những giải pháp lựa chọn phù hợp với người dùng smart home.