CƠ SỞ LÝ THUYẾT1.1 Tổng quan đề tài 1.1.1 Đặt vấn đề Ngày nay với sự phát triển vượt bậc của khoa học kỹ thuật, điện tử đã được ứng dụng ởrất nhiều lĩnh vực trong thực tế để phục vụ nhu
CƠ SỞ LÝ THUYẾT
Tổng quan đề tài
Hiện nay, sự phát triển mạnh mẽ của khoa học kỹ thuật đã dẫn đến việc ứng dụng điện tử trong nhiều lĩnh vực, nhằm đáp ứng nhu cầu chăm sóc sức khỏe và bảo vệ tính mạng cũng như tài sản của con người.
Khi đời sống con người ngày càng nâng cao, việc sử dụng bếp gas và các sản phẩm gas để nấu nướng trở nên phổ biến Tuy nhiên, vấn đề an toàn khi sử dụng gas cũng cần được chú trọng, vì tiếp xúc lâu dài với khí gas ở nồng độ cao có thể gây ngộ độc và thậm chí tử vong Hơn nữa, khí gas rò rỉ vào không khí có thể dễ dàng bắt lửa, dẫn đến cháy nổ, ảnh hưởng nghiêm trọng đến an toàn của người sử dụng và những người xung quanh Do đó, việc phát hiện và xử lý sự cố cháy nổ do rò rỉ gas là cực kỳ cần thiết, đặc biệt đối với sinh viên thường sử dụng bình gas mini không đảm bảo chất lượng Nhận thấy tầm quan trọng của vấn đề này, nhóm đã quyết định chọn đề tài liên quan đến an toàn gas làm nội dung chính cho đồ án môn học.
Thiết bị chữa cháy cho hộ gia đình giúp phát hiện kịp thời khí gas rò rỉ và ngọn lửa, từ đó ngăn chặn các tình huống nguy hiểm có thể xảy ra Việc sử dụng thiết bị này không chỉ đảm bảo an toàn cho gia đình mà còn góp phần dập tắt đám cháy hiệu quả.
Trong xã hội hiện đại, việc sử dụng khí đốt (khí gas) cho nấu ăn và trong các ngành công nghiệp ngày càng phổ biến Trước đây, khoảng 15 năm, khí đốt chủ yếu chỉ được sử dụng tại thành phố, trong khi nông thôn vẫn phụ thuộc vào bếp rạ và củi Hiện nay, gần như 99% hộ gia đình từ nông thôn đến thành phố đã chuyển sang sử dụng khí đốt để nấu ăn Tuy nhiên, khi khí gas bị rò rỉ, nguy cơ cháy nổ rất cao, chỉ cần một tia lửa điện từ ổ cắm hay thiết bị điện là có thể dẫn đến hỏa hoạn, ảnh hưởng nghiêm trọng đến tài sản và tính mạng con người.
Trong 6 tháng đầu năm 2024, cả nước ghi nhận 2.222 vụ cháy, dẫn đến 57 người thiệt mạng và nhiều người bị thương, theo thông cáo báo chí của Cục Cảnh sát Phòng cháy, Chữa cháy và Cứu nạn Cứu hộ.
45 người, thiệt hại về tài sản ước tính sơ bộ thành tiền khoảng 127,9 tỷ đồng.”
Nhóm nghiên cứu tập trung vào việc phát hiện khí gas và ngọn lửa, nhằm ngăn chặn hỏa hoạn, bảo vệ tính mạng con người và tài sản.
Mục tiêu đồ án nhóm đặt ra sau khi hoàn thành là:
Mục tiêu kiến thức của bài viết bao gồm việc nắm bắt cấu trúc phần cứng, sơ đồ khối và nguyên lý làm việc của mạch điều khiển; tìm hiểu lập trình Arduino; ứng dụng hệ điều hành thời gian thực FreeRTOS vào thực hành; và biết cách thực hiện một đồ án hoàn chỉnh để phục vụ cho đồ án tốt nghiệp sau này.
Sản phẩm được thiết kế nhằm đảm bảo hoạt động ổn định với đầy đủ chức năng cần thiết để cảnh báo nguy cơ cháy nổ và dập tắt đám cháy Với kích thước nhỏ gọn và tính thẩm mỹ cao, sản phẩm không chỉ tiện lợi mà còn phù hợp với không gian sống hiện đại Hơn nữa, giá thành của sản phẩm được điều chỉnh hợp lý, đáp ứng nhu cầu của người tiêu dùng ngày nay.
Tổng quan về Arduino và hệ điều hành thời gian thực
Có thể mọi người đã quen lập trình trên PC, với những ngôn ngữ như C, C++, C#, Java, Python, Ruby
Phần mềm trên PC chỉ chiếm khoảng 10% sản lượng phần mềm trên thị trường, trong khi 90% còn lại là mã điều khiển các thiết bị điện tử như tivi, máy giặt, điều hòa và tủ lạnh Lập trình cho các thiết bị này được gọi là embedded computing hoặc physical computing, cho phép con người tương tác với các thiết bị thực Để thiết kế và thể hiện ý tưởng một cách nhanh chóng, việc sử dụng các nền tảng prototyping là rất cần thiết, và Arduino là một trong những nền tảng phổ biến nhất hiện nay.
Arduino là một bo mạch lập trình dễ học, cho phép tương tác với các thiết bị phần cứng như cảm biến và động cơ Với ngôn ngữ lập trình tương tự C/C++, người dùng không cần nhiều kiến thức về điện tử để phát triển các ứng dụng thú vị Arduino cũng hỗ trợ nhiều bo mạch mở rộng (shield) như Ethernet shield để kết nối Internet, Motor shield để điều khiển động cơ, và GSM shield để nhận tin nhắn, giúp người dùng dễ dàng "lắp ghép" các thành phần và sáng tạo ứng dụng theo nhu cầu.
Có thể kể ở đây một số ứng dụng hay của Arduino:
Arduino là bộ xử lý trung tâm phổ biến cho nhiều loại robot, nhờ vào khả năng đọc dữ liệu từ các thiết bị cảm biến và điều khiển động cơ hiệu quả.
Game tương tác: chúng ta có thể dùng Arduino để tương tác với Joystick, màn hình, để chơi các trò như Tetrix, phá gach, Mario
Máy bay không người lái.
Và nhiều ví dụ khác nữa,
Arduino, mặc dù là một bo mạch nhỏ, nhưng có thể được áp dụng trong nhiều ứng dụng thú vị Để phát triển ứng dụng dựa trên Arduino, cần những kiến thức và công cụ cần thiết.
Rất đơn giản, chỉ cần IDE phát, một dây kết nối USB loại A-B, và một bo mạch Arduino là có thể bắt đầu.
Ngôn ngữ lập trình của Arduino là C/C++, nhưng lập trình với Arduino đơn giản hơn nhiều so với lập trình trực tiếp với vi điều khiển nhờ vào việc sử dụng các thư viện để giao tiếp với phần cứng Các thư viện này có thể được xem như các lớp C++ wrapper giúp dễ dàng điều khiển các thiết bị ngoại vi như LCD, cảm biến, và động cơ Người dùng chỉ cần kết hợp các thư viện này để tạo ra ứng dụng riêng cho mình Một chương trình Arduino, được gọi là sketch, sẽ được tải lên bo mạch Arduino qua cổng USB.
Phân tích chương trình: có 2 method quan trọng nhất là setup() và loop().
Hàm setup() trong Arduino có nhiệm vụ khởi tạo chế độ cho các ngoại vi và chỉ được thực hiện một lần khi bo mạch được reset Trong chương trình này, setup() được sử dụng để cấu hình các chân 4, 5, 6, 7 của Arduino sang chế độ output.
Hàm loop() là chương trình chính của Arduino, nơi mà đoạn code sẽ được thực thi liên tục Trong loop(), hàm digitalWrite() được sử dụng để thiết lập mức điện áp cho các chân (pin) ở trạng thái cao (HIGH) hoặc thấp (LOW) Bên cạnh đó, hàm delay() cho phép chương trình tạm ngưng trong một khoảng thời gian nhất định, với đối số là số mili giây mà người dùng chỉ định.
1.2.2 Hệ điều hành thời gian thực FreeRTOS
Hệ điều hành thời gian thực FreeRTOS (Real Time Operating Systeam) được phái triển bởi Real Time Engineers Ltd, sáng lập và sở hữu vởi Richard Barry
FreeRTOS là một hệ điều hành nhúng lý tưởng cho các thiết bị nhỏ gọn, với việc triển khai tối giản các chức năng như quản lý bộ nhớ và tác vụ cơ bản Nó cung cấp các hàm API quan trọng cho cơ chế đồng bộ, nhưng không bao gồm các giao tiếp mạng, driver hay hệ thống quản lý tệp như những hệ điều hành nhúng cao cấp khác.
FreeRTOS mang lại nhiều ưu điểm nổi bật, hỗ trợ đa dạng các kiến trúc vi điều khiển với kích thước nhỏ gọn chỉ 4.3 Kbytes sau khi biên dịch trên Arduino Được viết bằng ngôn ngữ C, nó có thể được sử dụng và phát triển với nhiều trình biên dịch C khác nhau như GCC, OpenWatcom, Keil, IAR, và Eclipse FreeRTOS cho phép chạy không giới hạn các tác vụ đồng thời, không hạn chế quyền ưu tiên thực thi và tận dụng tối đa khả năng của phần cứng Ngoài ra, nó cũng hỗ trợ triển khai các cơ chế điều độ giữa các tiến trình như queues, counting semaphore và mutexes.
Trong hệ điều hành thời gian thực (RTOS), các tác vụ (task) có bốn trạng thái chính: Ready, nơi tác vụ đã sẵn sàng thực thi nhưng chưa được thực hiện do có các tác vụ khác có độ ưu tiên tương đương hoặc cao hơn đang chạy; Running, khi tác vụ đang trong quá trình thực thi; Blocked, trạng thái chờ đợi một sự kiện xảy ra, có thể là một khoảng thời gian hoặc một tín hiệu từ tác vụ khác; và Suspended, trạng thái treo, tương tự như Blocked nhưng khác ở cách chuyển đổi giữa các trạng thái.
Ready State Chỉ khi gọi hàm vTaskResume() thì task bị treo mới được chuyển sang trạng thái Ready để có thể thực thi.
Trong FreeRTOS, mỗi Task được gán một tên để phục vụ cho việc debug, kích thước ngăn xếp, tham số truyền vào, và một mức ưu tiên có thể được xác định khác nhau tùy thuộc vào thư viện (có thể là càng thấp càng ưu tiên hoặc ngược lại) Ngoài ra, mỗi Task còn có một con trỏ đại diện (xTaskHandle) để điều khiển từ một Task khác Khi tạo Task, hệ thống trả về pdPASS nếu thành công và pdFAIL nếu không đủ bộ nhớ heap để tạo Task.
Khi xây dựng một task, cần lưu ý rằng mỗi task nên được thiết kế như một "siêu vòng lặp" để tránh việc chip bị reset khi task hoàn thành các lệnh Để đảm bảo điều này, hãy sử dụng hàm vTaskDelete() để xóa task trước khi nó kết thúc.
Hàm void vApplicationIdleHook(void) được sử dụng để định nghĩa chức năng của Idle Task trong FreeRTOS Khi có công việc được chỉ định trong hàm này, nó sẽ được thực hiện khi Task Idle được gọi Để sử dụng chức năng này, cần thiết lập giá trị configUSE_IDLE_HOOK bằng 1 trong file FreeRTOSConfig.h.
Idle Task là một tác vụ mặc định được tạo ra khi gọi hàm vTaskStartScheduler(); nó có mức độ ưu tiên bằng 0 và chỉ được kích hoạt khi không có tác vụ nào đang chạy Tác vụ này có thể được cấu hình để đưa hệ thống vào trạng thái tiết kiệm năng lượng.
Khi các tác vụ (Task) đang thực hiện mà gặp hàm delay, chúng sẽ bị chặn (Block) trong một khoảng thời gian Sau khi thời gian chặn kết thúc, các tác vụ sẽ tiếp tục chạy từ vị trí bị chặn, chứ không khởi động lại từ đầu.
1.2.2.2 Quản lý hàng đợi Queue
Hàng đợi Queue: Gửi và nhận đồng thời xoá
Mailbox : Gửi và nhận nhưng không xoá cho tới khi bên gửi ghi đè
Tổng quan về Telegram Messenger
Telegram Messenger là một dịch vụ nhắn tin tức thời miễn phí, không có quảng cáo, có thể dễ dàng cài đặt trên điện thoại thông minh (Android và iPhone) cũng như máy tính (PC, Mac và Linux) Nền tảng này cho phép người dùng tạo và tương tác với các bot, mang lại trải nghiệm nhắn tin đa dạng và tiện lợi.
Bot là ứng dụng bên thứ ba hoạt động trong Telegram, cho phép người dùng tương tác thông qua tin nhắn, lệnh và yêu cầu nội tuyến Người dùng có thể điều khiển bot bằng cách gửi yêu cầu HTTPS tới Telegram Bot API.
ESP32/ESP8266 sẽ tương tác với bot Telegram để nhận và xử lý tin nhắn cũng như gửi phản hồi.
Mở Telegram và làm theo các bước tiếp theo để tạo Telegram Bot Đầu tiên, tìm kiếm
“botfather” và nhấp vào BotFather như hình bên dưới hoặc mở liên kết t.me/botfather NhấnSTART để bắt đầu cuộc trò chuyện.
Type /newbot và làm theo hướng dẫn để tạo bot Nhập name và username.
Khi bot được tạo thành công, bạn sẽ nhận được thông báo kèm theo liên kết truy cập vào bot và mã token của bot Hãy lưu trữ mã token này để ESP32/ESP8266 có thể tương tác hiệu quả với bot.
Hình 1.4 Link và token của bot
Để lấy user ID trong tài khoản Telegram, bạn hãy tìm kiếm “IDBot” hoặc truy cập liên kết t.me/myidbot Sau đó, bắt đầu cuộc trò chuyện với bot và gõ lệnh /getid để nhận phản hồi với user ID Hãy lưu lại user ID này để kết nối với ESP32/ESP8266.
Hình 1.5 Lấy User ID của bot
1.3.3 Thư viện Universal Telegram Bot Để ESP32 tương tác được với bot Telegram, sử dụng thư viện UniversalTelegramBot do Brian Lough tạo ra, cung cấp giao diện dễ sử dụng cho Telegram Bot API. Để cài đặt UniversalTelegramBot vào Arduino IDE của bạn , bạn có thể sử dụng LibraryManager (có sẵn từ IDE phiên bản 1.6.2) Mở IDE và nhấp vào menu Sketch rồi IncludeLibrary > Manage Libraries.
Hình 1.6 Hướng dẫn cài thư viện UniversalTelegramBot
After opening Manage Libraries, you will see a list of installed or available libraries To install UniversalTelegramBot, search for "UniversalTelegramBot," scroll through the list, and click on it.
Hình 1.7 Hoàn tất cài thư viện
Bạn sẽ thấy phiên bản đích của UniversalTelegramBot (phiên bản 1.3.0 ) được liệt kê.
Finally, click on the settings and wait for the IDE to install UniversalTelegramBot, which may take some time depending on your connection speed Once the installation is complete, an "Installed" tag will appear next to the UniversalTelegramBot library, allowing you to close the Library Manager You can now find UniversalTelegramBot in the Sketch > Include Library menu.
PHÂN TÍCH THIẾT KẾ ĐỀ TÀI
Chức năng của thiết bị
Sau khi hoàn thiện thiết bị cảnh báo nguy cơ cháy nổ sẽ có những chức năng sau:
Khi không phát hiện khí gas (khói) và ngọn lửa thiết bị sẽ ở trạng thái bình thường và đèn led thông báo màu xanh.
Khi nồng độ khí gas (khói) và ngọn lửa vượt quá mức cho phép, thiết bị sẽ phát ra âm thanh cảnh báo và đèn LED màu đỏ sẽ sáng lên, đồng thời máy bơm nước cũng được kích hoạt.
Đồng bộ dữ liệu môi trường từ thiết bị lên trên ứng dụng Telegram, đồng thời cảnh báo trên ứng dụng.
Các khối trong thiết bị:
Khối nhận dữ liệu thu thập thông tin từ các cảm biến và chuyển giao dữ liệu này cho khối xử lý trung tâm Tại khối xử lý trung tâm, dữ liệu sẽ được xử lý và sau đó được gửi đến các khối hiển thị và khối đồng bộ dữ liệu để đảm bảo tính đồng bộ cho ứng dụng.
Khối xử lý trung tâm
Khối đồng bộ dữ liệu
Thiết kế phần cứng
Arduino Uno là bảng mạch vi điều khiển nguồn mở dựa trên vi điều khiển Microchip ATmega328, được phát triển bởi Arduino.cc Với các chân đầu vào/đầu ra Digital và Analog, nó có khả năng giao tiếp với nhiều bảng mạch mở rộng khác nhau Arduino Uno rất phù hợp cho những người mới bắt đầu và đam mê điện tử, lập trình Nhờ vào nền tảng mở của Arduino.cc, người dùng có thể dễ dàng xây dựng các dự án như lập trình Robot, xe tự hành, và điều khiển thiết bị LED một cách nhanh chóng.
Điện áp đầu vào(khuyên dùng) : 7-12V.
Điện áp đầu vào (giới hạn): 6-20V.
Số chân Digital: 14 (of which 6 provide PWM output).
Dòng điện DC trên mỗi chân I/O: 20 mA.
Dòng điện DC trên chân 3.3V: 50 mA.
Flash Memory: 32 KB (ATmega328P) of which 0.5 KB used by bootloader.
Tốc độ thạch anh: 16 MHz.
Bảng mạch được trang bị một LED tích hợp nối với chân D13, cho phép LED phát sáng khi chân ở mức cao (HIGH) và tắt khi ở mức thấp (LOW).
VIN: Chân này dùng để cấp nguồn ngoài (điện áp cấp từ 7-12VDC).
5V: Điện áp ra 5V (dòng điện trên mỗi chân này tối đa là 500mA).
3V3: Điện áp ra 3.3V (dòng điện trên mỗi chân này tối đa là 50mA).
GND: Là chân mang điện cực âm trên board.
Chân IOREF trên Arduino UNO xác định điện áp hoạt động của vi điều khiển và cho phép đọc điện áp này Tuy nhiên, chân IOREF không được sử dụng để cấp nguồn cho mạch.
Hình 2.3 Các chân Arduino Uno R3.
The ATmega328 microcontroller features 32 KB of Flash memory, of which 0.5 KB is allocated for the bootloader It includes 2 KB of SRAM (Static Random Access Memory) for storing declared variable values, with memory usage increasing as more variables are declared Notably, data stored in SRAM is lost when power is removed Additionally, the microcontroller provides 1 KB of EEPROM (Electrically Erasable Programmable Read-Only Memory) for persistent data storage.
Là nơi có thể đọc và ghi dữ liệu vào đây và không bị mất dữ liệu khi mất nguồn. [6]
2.2.1.2 Cảm biến khí gas, Khói MQ-2
Hình 2.3 Cảm biến khí gas, khói MQ-2.
Cảm biến khí ga MQ2 là thiết bị quan trọng trong việc phát hiện các loại khí như LPG, i-butan, propane, methane, alcohol, hydrogen, và khói Với độ nhạy cao và thời gian phản hồi nhanh, cảm biến này cung cấp giá trị đọc từ chân Analog của vi điều khiển, giúp người dùng dễ dàng giám sát và quản lý an toàn khí gas.
Tính hiệu đầu ra: tương tự (analog) và digital.
Hoạt động trong thời gian dài, ổn định
Điện áp chuyển tiếp Đỏ và Vàng: 1.9V ~ 2.4V DC
Dòng điện tiêu thụ: 80 dB.
Nhiệt độ hoạt động:-20 °C đến +70 °C.
2.2.1.5 Cảm biến cháy Flame Sensor
Hình 2.6 Cảm biến cháy Flame Sensor.
Cảm biến phát hiện lửa (flame sensor) là thiết bị quan trọng trong các ứng dụng như xe robot chữa cháy và cảm biến lửa Với tầm phát hiện lên đến 80cm và góc quét 60 độ, cảm biến này hoạt động hiệu quả nhất khi phát hiện lửa có bước sóng từ 760nm đến 1100nm.
Cảm biến phát hiện lửa (flame sensor) có hai ngõ ra tín hiệu là Digital và Analog rất dễ dử dụng.
Tín hiệu ra: Digital 3.3 - 5VDC tùy nguồn cấp hoặc Analog
ESP32 là vi điều khiển giá rẻ, tiết kiệm năng lượng, hỗ trợ WiFi và Bluetooth chế độ kép Sử dụng bộ vi xử lý Tensilica Xtensa LX6 với cả hai biến thể lõi kép và lõi đơn, ESP32 tích hợp nhiều linh kiện như công tắc antenna, RF balun, bộ khuếch đại công suất, bộ khuếch đại thu nhiễu thấp, bộ lọc và module quản lý năng lượng Được phát triển bởi Espressif Systems, công ty Trung Quốc có trụ sở tại Thượng Hải, ESP32 được sản xuất bởi TSMC với công nghệ 40 nm và là sản phẩm kế thừa của vi điều khiển ESP8266.
Wifi: 802.11 B/g/n/E/I (802.11N @ 2.4 GHz lên đến 150 Mbit/S)
Bluetooth: 4.2 BR/EDR BLE 2 chế độ điều khiển
Bộ nhớ: 448 Kbyte ROM, 520 Kbyte SRAM, 6 Kbyte SRAM trên RTC và QSPI Hỗ trợ đèn flash / SRAM chip
GPIO kỹ thuật số: 24 chân (một số chân chỉ làm đầu vào)
Kỹ thuật số Analog với ADC 12bit SAR hỗ trợ đo lường lên đến 18 kênh, bao gồm một số chân có khả năng tích hợp bộ khuếch đại với tính năng lập trình tăng.
Bảo mật: IEEE 802.11, bao gồm cả WFA, WPA/WPA2 và WAPI
Phần cứng tăng tốc mật mã học: AES, SHA-2, RSA, hình elip mật mã Đường Cong (ECC), số ngẫu nhiên Máy phát điện (RNG)
2.2.1.7 Module 1 Relay mức thấp 5VDC
Hình 2.8 Module Relay mức thấp 5VDC
Module 1 Relay gồm 1 rơ le hoạt động tại điện áp 5VDC, chịu được hiệu điện thế lên đến 250VAC 10A Module 1 relay kích mức thấp được thiết kế chắc chắn, khả năng cách điện tốt Trên module đã có sẵn mạch kích relay sử dụng transistor và IC cách ly quang giúp cách ly hoàn toàn mạch điều khiển (vi điều khiển) với rơ le bảo đảm vi điều khiển hoạt động ổn định Có sẵn header rất tiện dụng khi kết nối với vi điều khiển Module này tuân thủ các tiêu chuẩn an toàn quốc tế, khu vực đầu vào và khu vực tải có các khe cách ly. Thông số kỹ thuật:
Điều khiển đóng ngắt điện DC hoặc AC, có thể điều khiển tải AC 220V 10A
Có tiếp điểm thường mở và thường đóng: o NO: thường mở (khi tiếp điểm đóng lại) o COM: chung o NC: thường đóng (khi tiếp điểm mở ra)
Đầu vào: o Điện áp: 5VDC o Tín hiệu vào điều khiển: 0V Tín hiệu là 0 thì Relay đóng, tín hiệu là 1 thì Relay mở
Đầu ra: o Tiếp điểm Relay 220V 10A (Lưu ý tiếp điểm, không phải điện áp đầu ra) o NC: thường đóng o NO: thường mở o COM: chân chung
Hình 2.9 Máy bơm nước mini 5V
Máy bơm nước mini 5V có kích thước nhỏ gọn và sử dụng điện áp 3~5VDC Với thiết kế bơm chìm, động cơ của máy có khả năng chống nước, cho phép hoạt động hiệu quả khi ngâm trong nước Sản phẩm này thích hợp cho việc bơm nước và dung dịch trong các thiết kế nhỏ, mô hình tưới cây, hồ cá và tiểu canh.
Điện áp sử dụng: 3~5VDC.
Dòng điện sử dụng: 100~200mA.
Đường kính ngoài ống dẫn: 7.5mm
2.2.2 Sơ đồ lắp đặt mô phỏng
Hình 2.10 Sơ đồ lắp đặt mô phỏng trên Proteus.
Chân TX, RX của Arduino Uno R3 nối với chân RX, TX của ESP32 Dev Module.
Cảm biến MQ2 nối chân Analog A0 với chân A0 của Arduino Uno R3.
Cảm biến lửa nối chân Digital D0 với chân số 5 của Arduino Uno R3.
Chân dương của đèn led xanh và đỏ nối vào chân số 2 và chân số 3 của Arduino Uno R3.
Chân dương của còi chíp nối vào chân số 6 của Arduino Uno R3.
Chân 5V của Arduino Uno R3 nối chung tới cảm biến MQ2, cảm biến lửa.
Chân GND của Arduino Uno R3 được nối chung tới các chân GND của ESP32, cảm biến MQ2, cảm biến lửa, còi chíp và 2 đèn led xanh, đỏ.
Thiết kế phần mềm
Hình 2.11 Sơ đồ hệ thống
Về thiết kế phần mềm, trong hệ thống gồm 2 đoạn mã chạy trên 2 thiết bị đó là Arduino Uno R3 và ESP32.
Trên Arduino Uno R3, tác vụ readSenorsTask liên tục đọc trạng thái của cảm biến lửa và khói, cập nhật các biến toàn cục fireDetected và smokeDetected, và tạm dừng 100 ms trước khi thực hiện lần đọc tiếp theo, đảm bảo dữ liệu luôn được cập nhật kịp thời cho các tác vụ khác Tác vụ controlDevicesTask kiểm tra trạng thái phát hiện lửa và khói để điều khiển các thiết bị cảnh báo, kích hoạt còi, đèn đỏ và relay khi phát hiện, đồng thời tắt đèn xanh Hàm này cũng gửi thông tin phát hiện qua giao tiếp Serial để giám sát từ xa, với chức năng được duy trì bởi vòng lặp vô tận và các khoảng thời gian chờ giữa các lần kiểm tra.
ESP32 kết nối với mạng WiFi đã chỉ định và thiết lập thời gian hiện tại thông qua NTP Sau khi kết nối thành công, nó gửi tin nhắn khởi động đến Telegram Thiết bị chỉ nhận dữ liệu và truyền tin nhắn thông báo qua Telegram.
// Pin definitions const int redled = 2; const int greenled = 3; const int buzz = 4; const int smokeSspin = A0; const int flamePin = 5; const int relay = 6;
// Shared variables volatile bool fireDetected = false; volatile bool smokeDetected = false;
// Function declarations void setupPins(); void readSensorsTask(void *pvParameters); void controlDevicesTask(void *pvParameters); void setup() {
// Create tasks xTaskCreate(readSensorsTask, "Read Sensors", 128, NULL, 1,
&SensorTaskHandle); xTaskCreate(controlDevicesTask, "Control Devices", 128, NULL, 1,
// The loop is empty as everything is handled by FreeRTOS tasks } void setupPins() { pinMode(relay, OUTPUT); pinMode(redled, OUTPUT); pinMode(greenled, OUTPUT); pinMode(buzz, OUTPUT); pinMode(flamePin, INPUT);
(void) pvParameters; for (;;) { int flameState = digitalRead(flamePin); int smokeValue = analogRead(smokeSspin); if (flameState == LOW) { fireDetected = true;
} vTaskDelay(pdMS_TO_TICKS(100)); // Delay for 100 ms
(void) pvParameters; for (;;) { if (fireDetected || smokeDetected) { digitalWrite(greenled, LOW); digitalWrite(relay, HIGH); digitalWrite(buzz, HIGH); digitalWrite(redled, HIGH);
Serial.println(analogRead(smokeSspin)); vTaskDelay(pdMS_TO_TICKS(3000)); // Delay for 3000 ms
} else { digitalWrite(relay, LOW); digitalWrite(redled, LOW); digitalWrite(greenled, HIGH); digitalWrite(buzz, LOW);
Serial.println(analogRead(smokeSspin)); vTaskDelay(pdMS_TO_TICKS(100)); // Delay for 100 ms
#define BOT_TOKEN "7313163708:AAF5aY8N7ISZQkl2YS50_Dqvab05bjC55sA"
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
// Initialize Serial for communication with Arduino Uno
// Shared variables int FlameState = -1; int SmokeValue = -1; void setup() {
Serial.begin(115200); // Initialize Serial monitor for debugging mySerial.begin(115200, SERIAL_8N1, 16, 17); // RX, TX pins on the ESP32
Serial.println("ESP32 is ready to receive data from Arduino Uno");
} void loop() { if (mySerial.available()) {
String data = mySerial.readStringUntil('\n'); // Read the incoming data
// Process the received data int indexFlame = data.indexOf("Fire detected: "); int indexSmoke = data.indexOf(", Smoke concentrate: "); if (indexFlame >= 0 && indexSmoke > indexFlame) {
FlameState = data.substring(indexFlame + 15, indexSmoke).toInt();
SmokeValue = data.substring(indexSmoke + 21).toInt();
String message = "Alert! "; if(FlameState == 1 || SmokeValue >= 300){ if(FlameState == 1){ message += " Fire detected by fire sensor! ";
} if(SmokeValue >= 300){ message += " Smoke level is too high: " + String(SmokeValue);
} bot.sendMessage(CHAT_ID, message, ""); delay(1000);
} delay(100); // Small delay to prevent overwhelming the Serial }
// Function to connect to WiFi void connectToWiFi() {
Serial.print("Connecting to WiFi");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) {
Serial.print("Connected to WiFi IP address: ");
Serial.println(WiFi.localIP()); secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Set root certificate for Telegram
Serial.print("Retrieving time: "); configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP time_t now = time(nullptr); while (now < 24 * 3600) {
Serial.print("."); delay(100); now = time(nullptr);
Serial.println(now); bot.sendMessage(CHAT_ID, "Bot started up", "");