Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.88 MB, 33 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THÔNG</b>
<b>HÀ NỘI – 2024</b>
MỤC LỤC HÌNH ẢNH...4
LỜI MỞ ĐẦU...6
CHƯƠNG 1. CƠ SỞ LÝ THUYẾT...7
1.1 Giới thiệu Bot trên Telegram...7
1.2.1 Cách tạo Bot...7
1.2.2 Cách thêm Bot trong hội nhóm...10
1.2 Tính bảo mật của ứng dụng Telegram...11
1.3 Lựa chọn Telegram Bot API...12
2.2.1 Danh sách linh kiện và chức năng...16
2.2.2 Thiết kế hệ thống trên phần mềm ALTIUM...17
2.2.3 Mạch thực tế...18
2.3 THIẾT KẾ PHẦN MỀM...18
2.3.1 Khởi tạo Bot...18
2.3.2 Telegram bot button...19
2.3.1 Điều khiển 4 thiết bị đầu ra ở Telegram...20
2.3.2 Điều khiển thiết bị sử dụng cảm biến chạm...21
2.3.3 Khối tạo biểu độ nhiệt độ độ ẩm...21
2.3.4 Thiết lập ngưỡng cho nhiệt độ, độ ẩm...25
TÀI LIỆU THAM KHẢO...33
Giáo trình & bài giảng Tiếng Việt:...33
Tài liệu tham khảo Tiếng Anh:...33
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">Hinh 1.1 Tìm kiếm từ khóa BotFather...7
Hinh 1. 2 Chọn BotFather...8
Hinh 1. 3 Khởi chạy BotFather...8
Hinh 1. 4 Tạo bot mới...8
Hinh 1. 5 Tạo tên cho Bot khởi tạo...9
Hinh 1. 6 Username của Bot...9
Hinh 1. 7 Tin nhắn tạo Bot thành công...10
Hinh 1. 8 Tìm kiếm nhóm muốn thêm Bot...10
Hinh 1. 9 Chọn biểu tượng thêm thành viên trong hội nhóm...11
Hinh 1. 10 Thêm Bot muốn tham gia với hội nhóm...11
Hình 1.13 Trang chủ của QuickChart...12
Hình 1.14 Sơ đồ chân ESP-WROOM-32-30 chân...13
Hình 2. 9 Các bước để lấy mã token trong Telegram...18
Hình 2. 10 Inline Keyboards trong ứng dụng Telegram...19
Hình 2. 11 Kết quả chạy chương trình khởi đầu dùng Inline Keyboard...20
Hình 2. 12 Kết quả giao diện điều khiển Inline Keyboard...20
Hình 2.13 Giao diện chọn ngưỡng theo nhiệt độ và độ ẩm...25
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">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 ninhtrong không gian sống. Với việc tích hợp các cơng nghệ tiên tiến như Internet ofThings (IoT), và tự động hóa, nhà thơng minh khơng chỉ mang lại sự thoải mái và tiệnlợ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 ánhsáng, nhiệt độ đến quản lý thiết bị gia đình từ xa, dự án nhà thơng minh mang đến trảinghiệ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:
<b>Chương 1: Cơ sở lý thuyết.</b>
<b>Chương 2: Thiết kế hệ thống.</b>
<b>Chương 3: Kết quả sản phẩm và đánh giá hoạt động.</b>
Dưới đây em xin trình bày chi tiết các phần trong nội dung của đề tài.
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">Chương này sẽ trình những kiến thức tổng quan cần thiết để phát triển một chatbotbao gồm các nội dung chính như: Tổng quan về chatbot, tính bảo mật của Telegram,lựa chọn API và giao thức giao tiếp kết nối giữa các thiết bị.
thứ ba được thực hiện với API Telegram Bot. Các bot Telegram về cơ bản là tàikhoản Telegram tự động có thể trị chuyện hoặc thêm làm bạn bè vào các cuộctrị chuyện, nhóm hoặc kênh của mình.
hạn nghiêm ngặt về những gì người dùng có thể tạo, Telegram cho phép ngườidùng của họ tạo Telegram Bots cho hầu hết mọi thứ.
<i><b>1.2.1 Cách tạo Bot</b></i>
<i>Hinh 1.1 Tìm kiếm từ khóa BotFather</i>
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8"><i>Hinh 1. 2 Chọn BotFather</i>
Bước 3: Nhập lệnh /start và nhấn Enter để bắt đầu tạo bot mới:
<i>Hinh 1. 3 Khởi chạy BotFather</i>
<i>Hinh 1. 4 Tạo bot mới</i>
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9"><i>Hinh 1. 5 Tạo tên cho Bot khởi tạo</i>
<i>Hinh 1. 6 Username của Bot</i>
Bước 7: Hệ thống sẽ gửi tin nhắn báo tạo bot Telegram thành công:
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10"><i>Hinh 1. 7 Tin nhắn tạo Bot thành công</i>
<i><b>1.2.2 Cách thêm Bot trong hội nhóm</b></i>
<i>Hinh 1. 8 Tìm kiếm nhóm muốn thêm Bot</i>
tượng thêm thành viên ở khung màu đỏ:
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11"><i>Hinh 1. 9 Chọn biểu tượng thêm thành viên trong hội nhóm</i>
<i>Hinh 1. 10 Thêm Bot muốn tham gia với hội nhóm</i>
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úpcủ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 haingười dùng khi khơng có sự đồng ý của họ
Telegram là ứng dụng trò chuyện miễn phí và độ bảo mật cực kỳ cao.
khơng thể truy cập được.
hóa đầu cuối (end – to – end).
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12"> 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ã
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ênmáy chủ của ngươif dùng.
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ả q trình mã hóa và giao tiếp vớiAPI Telegram cho người dùng.
giản cung cấp phiên bản đơn giản hóa của API Telegram.
QuickChart là một dịch vụ tạo hình ảnh biểu đồ một cách nhanh chóng.Những hìnhảnh này phù hợp để nhúng vào email. SMS, Chatbot và các định dạng khác. Biểu đồđược hiện thị bởi Chảt.js, một thư viện biểu đồ nguồn phổ biến.
<i>Hình 1.13 Trang chủ của QuickChart</i>
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">ESP32 là một module Wi-Fi và Bluetooth tích hợp, được phát triển bởi EspressifSystem. Được ra mắt vào năm 2016 , ESP32 được biết đến như một phiên bản nângcấ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ácthiế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ườidù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ộngvà cảm biến bên ngồi.
Có sẵn nhiều framework và công cụ phát triển như Arduino IDE, ESP-IDE (EspressifIoT Development Framework),MicroPython và PlatfrormIO, giúp việc phát triển ứngdụng trở nên dễ dàng hơn.
<i>Hình 1.14 Sơ đồ chân ESP-WROOM-32-30 chân</i>
<b>HTTPS (Hypertext Transfer Protocol Secure) là giao thức truyền tải siêu văn bản</b>
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ảomậ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.
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14"><i>Hình 1.16 Mơ tả giao thức HTTPS</i>
<b>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</b>
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óacơ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ênlạc, “khóa cơng khai” (public key) và “khóa riêng” (private key). Bất cứ thứ gì đượcmã 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áctiê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 đó.
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
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">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ườidùng.
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16"><i><b>2.2.1 Danh sách linh kiện và chức năng</b></i>
<i>Hình 2.5 Lớp 3D</i>
<i><b>2.2.3 Mạch thực tế</b></i>
<i>Hình 2.8 Mạch thực tế</i>
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ị.
<i><b>2.3.1 Khởi tạo Bot </b></i>
Khi người dùng khởi tạo Bot thành cơng thì Botfather sẽ gửi tin nhắn đến baogồm Token của Bot.
muốn.
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><i>Hình 2. 9 Các bước để lấy mã token trong Telegram</i>
<small>UniversalTelegramBot bot</small><b><small>(</small></b><small>BOT_TOKEN</small><b><small>,</small></b><small> clientTCP</small><b><small>);</small></b>
<i><b>2.3.2 Telegram bot button</b></i>
tới bot (Khơng gửi tin nhắn đến cuộc trị chuyện), sau đó người lập trình xử lýbot để có thể hiển thị kết quả mong muốn tới cuộc trò chuyện.
<small>String BOT_TOKEN </small><b><small>=</small></b> <small>"6691707417:AAF0INIQzjme0ODUPY0_Yb9tWd1p9tIbVk4"</small><b><small>;</small></b><small> //bot token lay tu bot father</small>
<small>String CHAT_ID </small><b><small>=</small></b> <small>"-4088291504"</small><b><small>;</small></b>
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19"><i>Hình 2. 10 Inline Keyboards trong ứng dụng Telegram</i>
Xây dựng chương trình tạo Inline Keyboard cho giao diện bắt đầu:
<small>String keyboardJson </small><b><small>=</small></b><small> F</small><b><small>(</small></b><small>"[[{ \"text\" : \"LIGHT\", \"callback_data\" :\"light\" },{ \"text\" : \"TEMPERATURE-HUMIDITY\", \"callback_data\" :\"temhu\" }],"</small><b><small>);</small></b>
<small>keyboardJson </small><b><small>+=</small></b>
<small>F"[{\"text\" : \"STATUS\", \"callback_data\" : \"STATUS\"}],"</small><b><small>);</small></b>
<small>keyboardJson </small><b><small>+=</small></b><small> F</small><b><small>(</small></b><small>"[{\"text\" : \"SETUP THRESHOLD\", \"callback_data\": \"/set\"}]]"</small><b><small>);</small></b>
<small>bot</small><b><small>.</small></b><small>sendMessageWithInlineKeyboard</small><b><small>(</small></b><small>CHAT_ID</small><b><small>,</small></b> <small>"NHÀ THƠNG MINH"</small><b><small>,</small></b> <small>""</small><b><small>,</small></b>
<i>Hình 2. 11 Kết quả chạy chương trình khởi đầu dùng Inline Keyboard</i>
<i><b>2.3.1 Điều khiển 4 thiết bị đầu ra ở Telegram.</b></i>
Code tạo giao diện điều khiển
<b><small>if</small></b> <small>text </small><b><small>==</small></b><small> F</small><b><small>(</small></b><small>"light"</small><b><small>))</small></b>
<small> String keyboardJson </small><b><small>=</small></b><small> F</small><b><small>(</small></b><small>"[[{ \"text\" : \"ON LED 1\", \"callback_data\" : \"ON1\" },{ \"text\" : \"OFF LED 1\", \"callback_data\" : \"OFF1\" }],"</small><b><small>);</small></b>
<small> keyboardJson </small><b><small>+=</small></b><small> F</small><b><small>(</small></b><small>"[{ \"text\" : \"ON LED </small>
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20"><small>2\", \"callback_data\" : \"OFF2\" }],"</small><b><small>);</small></b>
<small> keyboardJson </small><b><small>+=</small></b><small> F</small><b><small>(</small></b><small>"[{ \"text\" : \"ON LED </small>
<small>3\", \"callback_data\" : \"onfan1\" },{ \"text\" : \"OFF LED 3\", \"callback_data\" : \"offfan1\" }],"</small><b><small>);</small></b>
<small> keyboardJson </small><b><small>+=</small></b><small> F</small><b><small>(</small></b><small>"[{ \"text\" : \"ON LED </small>
<small>4\", \"callback_data\" : \"onfan2\" },{ \"text\" : \"OFF LED 4\", \"callback_data\" : \"offfan2\" }],"</small><b><small>);</small></b>
<small> keyboardJson </small><b><small>+=</small></b><small> F</small><b><small>(</small></b><small>"[{ \"text\" : \"ON </small>
<small>ALL\", \"callback_data\" : \"onall\" },{ \"text\" : \"OFF ALL\", \"callback_data\" : \"offall\" }]]"</small><b><small>);</small></b>
<small> bot</small><b><small>.</small></b><small>sendMessageWithInlineKeyboard</small><b><small>(</small></b><small>CHAT_ID</small><b><small>,</small></b> <small>"LED LIGHTS"</small><b><small>,</small></b> <small>""</small><b><small>,</small></b>
Kết quả :
<i>Hình 2. 12 Kết quả giao diện điều khiển Inline Keyboard</i>
Đ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.
<i><b>2.3.2 Điều khiển thiết bị sử dụng cảm biến chạm</b></i>
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.
<small>attachInterrupt</small><b><small>(</small></b><small>switch_4</small><b><small>,</small></b><small>thietbi4</small><b><small>,</small></b><small>FALLING</small><b><small>);</small></b>
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21"><i><b>2.3.3 Khối tạo biểu độ nhiệt độ độ ẩm</b></i>
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 :
<small>void Creat_data</small><b><small>()</small></b>
<small> long epochTime </small><b><small>=</small></b><small> timeClient</small><b><small>.</small></b><small>getEpochTime</small><b><small>();</small></b> <small>// Lấy epoch time</small>
<small> float Humidity </small><b><small>=</small></b><small> dht</small><b><small>.</small></b><small>readHumidity</small><b><small>();</small></b>
<small> float Temperature </small><b><small>=</small></b><small> dht</small><b><small>.</small></b><small>readTemperature</small><b><small>();</small></b>
<small> Serial</small><b><small>.</small></b><small>println</small><b><small>(</small></b><small>Humidity</small><b><small>);</small></b>
<small> Serial</small><b><small>.</small></b><small>println</small><b><small>(</small></b><small>Temperature</small><b><small>);</small></b>
<small> </small><b><small>if</small></b> <small>isnan</small><b><small>(</small></b><small>Humidity</small><b><small>)||</small></b><small> isnan</small><b><small>(</small></b><small>Temperature</small><b><small>))</small></b>
<small> Serial</small><b><small>.</small></b><small>println</small><b><small>(</small></b><small>"Lỗi khi đọc dữ liệu từ cảm biến DHT!"</small><b><small>);</small></b>
<small> </small><b><small>return;</small></b>
<small> </small><b><small>}</small></b>
<small> ReportData</small><b><small>.</small></b><small>push</small><b><small>({</small></b><small>Temperature</small><b><small>,</small></b><small> Humidity</small><b><small>,</small></b><small> epochTime</small><b><small>});}</small></b>
<small>void Delete_data</small><b><small>(unsigned</small></b> <small>long t</small><b><small>){</small></b>
<small> </small><b><small>while</small></b> <small>ReportData</small><b><small>.</small></b><small>size</small><b><small>()&&</small></b><small> ReportData</small><b><small>[].</small></b><small>EpochTime_number </small><b><small><</small></b><small> t</small><b><small>){</small></b>
<small> Serial</small><b><small>.</small></b><small>print</small><b><small>(</small></b><small>"xoa "</small><b><small>);</small></b>
<small> ReportData</small><b><small>.</small></b><small>shift</small><b><small>();</small></b>
<small> </small><b><small>}}</small></b>
<small>String EpochTime_to_string</small><b><small>(</small></b> <small>unsignedlong number</small><b><small>){</small></b>
<small> time_t timestamp </small><b><small>=</small></b><small> number</small><b><small>;</small></b>
<small> tmElements_t t</small><b><small>;</small></b>
<small> breakTime</small><b><small>(</small></b><small>timestamp</small><b><small>,</small></b><small> t</small><b><small>);</small></b>
<small> char buffer</small><b><small>[</small></b><small>25</small><b><small>];</small></b>
<small> sprintf</small><b><small>(</small></b><small>buffer</small><b><small>,</small></b> <small>"%4d-%02d-%02dT%02d:%02d:%02dZ"</small><b><small>,</small></b><small> t</small><b><small>.</small></b><small>Year </small><b><small>+</small></b> <small>1970</small><b><small>,</small></b>
<small>tMonth</small><b><small>,</small></b><small> t</small><b><small>.</small></b><small>Day</small><b><small>,</small></b><small> t</small><b><small>.</small></b><small>Hour</small><b><small>,</small></b><small> t</small><b><small>.</small></b><small>Minute</small><b><small>,</small></b><small> t</small><b><small>.</small></b><small>Second</small><b><small>);</small></b>
<small> </small><b><small>return</small></b><small> String</small><b><small>(</small></b><small>buffer</small><b><small>);}</small></b>
<small>String Build_axisX</small><b><small>()</small></b>
<small> String left_time </small><b><small>=</small></b><small> EpochTime_to_string</small><b><small>(</small></b><small>start_time</small><b><small>);</small></b>
<small> String right_time </small><b><small>=</small></b><small> EpochTime_to_string</small><b><small>(</small></b><small>end_time</small><b><small>);</small></b>
<small> String times </small><b><small>=</small></b> <small>"'" left_time </small><b><small>+</small></b> <small>"',""'" right_time </small><b><small>+</small></b> <small>"'"</small><b><small>;</small></b>
<small> Serial</small><b><small>.</small></b><small>print</small><b><small>(</small></b><small>times</small><b><small>);</small></b>
<small> </small><b><small>return</small></b><small> times</small><b><small>;</small></b>
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22"><small>String str2 </small><b><small>=</small></b> <small>"],'datasets':</small>
<small>String str3 </small><b><small>=</small></b> <small>"]},</small>
<small>String str4 </small><b><small>=</small></b> <small>"]}]},'options':{'legend':{'position':'bottom'},'title':{'text':'Chart.jsTimeScale'},'scales':{'xAxes':[{'type':'time','time':{'parser':'YYYY-MM-</small>
<small> </small>
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.
</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23"> 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’.
<small> String str2 </small><b><small>=</small></b> <small>"],'datasets':</small>
<small> String str3 </small><b><small>=</small></b> <small>"]},</small>
<small> String str4 </small><b><small>=</small></b> <small>"]}]},'options':{'legend':{'position':'bottom'},'title':{'text':'Chart.jsTimeScale'},'scales':{'xAxes':[{'type':'time','time':{'parser':'YYYY-MM-</small>
<small> String times</small><b><small>,</small></b><small> nhiet_do</small><b><small>,</small></b><small> do_am</small><b><small>;</small></b>
<small> Data_x </small><b><small>=</small></b><small> Build_axisX</small><b><small>();</small></b>
<small> </small><b><small>for</small></b> <small>int i </small><b><small>=</small></b> <small>0 i </small><b><small><</small></b><small> ReportData</small><b><small>.</small></b><small>size</small><b><small>();</small></b><small> i</small><b><small>++)</small></b>
<small> nhiet_do </small><b><small>+=</small></b> <small>"{'x':'"</small>
<small>EpochTime_to_string</small><b><small>(</small></b><small>ReportData</small><b><small>[].</small></b><small>EpochTime_number</small><b><small>)+</small></b> <small>"','y':"</small>
<small>String</small><b><small>(</small></b><small>ReportData</small><b><small>[].</small></b><small>temperatures</small><b><small>)+</small></b> <small>"}"</small><b><small>;</small></b>
<small> do_am </small><b><small>+=</small></b> <small>"{'x':'"</small>
<small>EpochTime_to_string</small><b><small>(</small></b><small>ReportData</small><b><small>[].</small></b><small>EpochTime_number</small><b><small>)+</small></b> <small>"','y':"</small>
<small>String</small><b><small>(</small></b><small>ReportData</small><b><small>[].</small></b><small>humiditys</small><b><small>)+</small></b> <small>"}"</small><b><small>;</small></b>
</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">Trong đoạn code trên ta có thể thấy có 1 hàm lớn để tạo ảnh là “create_image()” có chức năng ghép nối các data dữ liệu về nhiệt độ, độ ẩm, và thời gian theo form biểu đồđã xây dựng từ trước. Có thể hiểu nó như một q trình đóng gói sản phẩm trước khi gửi đi.
Sau khi đã tạo biểu đồ thàng công . Bước tiếp theo là gửi ảnh tới Telegram khi có yêu cầu. Khi có yêu cầu từ bảng điều khiển Telegram thì ta sẽ gửi ảnh lên Telegram bằng việc sử dụng phương thức GET theo chuẩn HTTP. Vi xử lý sẽ gửi yêu cầu theo phương thức GET .Sau đó nếu u cầu được gửi thành cơng thì Telegram sẽ gửi phản hồi response là 200 tức thành cơng, khác là khơng thành cơng (xảy ra có thể do kết nốimạng không ổn định ở vi xử lý hay thiết bị điều khiển Telegram).
Code thực hiện chức năng gửi nhiệt độ - độ ẩm hiện tại và biểu đồ nhiệt độ - độ ẩm
<small> </small><b><small>elseif</small></b> <small>text </small><b><small>==</small></b> <small>"2 hours"</small><b><small>){</small></b>
<small> unsignedlong EpochTime </small><b><small>=</small></b><small> timeClient</small><b><small>.</small></b><small>getEpochTime</small><b><small>();</small></b>
<small> time_t timestamp </small><b><small>=</small></b><small> EpochTime</small><b><small>;</small></b>
<small> tmElements_t times</small><b><small>;</small></b>
<small> breakTime</small><b><small>(</small></b><small>timestamp</small><b><small>,</small></b><small> times</small><b><small>);</small></b>
<small> start_time </small><b><small>=</small></b><small> EpochTime </small><b><small>-</small></b> <small>3600 times</small><b><small>.</small></b><small>Minute </small><b><small>*</small></b> <small>60 times</small><b><small>.</small></b><small>Second</small><b><small>;</small></b>
<small> </small><b><small>if</small></b> <small>ReportData</small><b><small>[].</small></b><small>EpochTime_number </small><b><small>>=</small></b><small> start_time </small><b><small>+</small></b> <small>6060</small>
<small> start_time </small><b><small>+=</small></b> <small>6060</small><b><small>;</small></b>
<small> </small><b><small>}</small></b>
<small> Delete_data</small><b><small>(</small></b><small>start_time</small><b><small>);</small></b>
<small> end_time </small><b><small>=</small></b><small> start_time </small><b><small>+</small></b> <small>2</small> <b><small>*</small></b> <small>6060</small>
<small> String tam </small><b><small>=</small></b><small> create_image</small><b><small>();</small></b>
<small> String url </small><b><small>=</small></b><small> url_send_photo </small><b><small>+</small></b><small> tam</small><b><small>;</small></b>
<small> Serial</small><b><small>.</small></b><small>print</small><b><small>(</small></b><small>"Error send photo. Error code: "</small><b><small>);</small></b>
<small> Serial</small><b><small>.</small></b><small>println</small><b><small>(</small></b><small>httpResponseCode</small><b><small>);</small></b>
<small> </small><b><small>}</small></b>
<small> http</small><b><small>.</small></b><small>end</small><b><small>();</small></b>
<small>}</small>
</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25"><i><b>2.3.4 Thiết lập ngưỡng cho nhiệt độ, độ ẩm</b></i>
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.
Kết quả :
<i>Hình 2.13 Giao diện chọn ngưỡng theo nhiệt độ và độ ẩm.</i>
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.<small> </small><b><small>if</small></b> <small>text </small><b><small>==</small></b> <small>"temp"</small><b><small>){</small></b>
<small> bot</small><b><small>.</small></b><small>sendMessage</small><b><small>(</small></b><small>CHAT_ID</small><b><small>,</small></b> <small>"Bạn hãy nhập ngưỡng cho nhiệt độ (min-max): "</small><b><small>);</small></b>
<small> flag_temp </small><b><small>=true</small></b>
<small> flag_hum </small><b><small>=false</small></b>
<small> </small><b><small>}</small></b>
<small> </small><b><small>elseif</small></b> <small>text </small><b><small>==</small></b> <small>"hum"</small><b><small>){</small></b>
<small> bot</small><b><small>.</small></b><small>sendMessage</small><b><small>(</small></b><small>CHAT_ID</small><b><small>,</small></b> <small>"Bạn hãy nhập ngưỡng cho độ ẩm max): "</small><b><small>);</small></b>
<small> Serial</small><b><small>.</small></b><small>println</small><b><small>(</small></b><small>text</small><b><small>);</small></b>
<small> </small><b><small>if</small></b> <small>text</small><b><small>.</small></b><small>startsWith</small><b><small>(</small></b> <small>"/"</small><b><small>)&&</small></b><small> flag_temp</small><b><small>){</small></b>
<small> flag_temp </small><b><small>=false;</small></b>
<small> textMax </small><b><small>=</small></b><small> text</small><b><small>.</small></b><small>substring</small><b><small>(,</small></b> <small>6</small><b><small>);</small></b>
<small> TemMax </small><b><small>=</small></b><small> textMax</small><b><small>.</small></b><small>toInt</small><b><small>();</small></b>
<small> textMin </small><b><small>=</small></b><small> text</small><b><small>.</small></b><small>substring</small><b><small>(,</small></b> <small>3</small><b><small>);</small></b>
</div>