25 C
Hanoi
Chủ Nhật, Tháng Chín 25, 2022

THIẾT KẾ PHẦN CỨNG - NHẬN THIẾT KẾ ĐIỆN TỬ CHO SẢN PHẨM PHẦN CỨNG SỐ, IOT, CÔNG NGHIỆP,...

Home LẬP TRÌNH VI ĐIỀU KHIỂN ARDUINO ARDUINO VỚI HỆ THỐNG GIÁM SÁT VÀ BÁO ĐỘNG KHÍ GAS

ARDUINO VỚI HỆ THỐNG GIÁM SÁT VÀ BÁO ĐỘNG KHÍ GAS

Yêu cầu đề bài

Hệ thống giám sát và báo động khí gas được thực hiện với các số liệu ban đầu như sau:
– Hệ thống thu thập dữ liệu về nồng độ khí gas theo giá trị % để giám sát nồng độ khí gas có ở trong không khí.
– Hiển thị giá trị thu thập được trên LCD và trên trang web Thingspeak.com để theo dõi tình trạng nồng độ khí gas trong không khí.
– Nếu phát hiện nồng độ khí gas trong không khí tăng lên, có rò rỉ khí gas nguy hiểm sẽ báo động thông qua còi báo động, tin nhắn sms và gọi điện.

Các thiết bị liên quan

  • Cảm biến khí gas MQ2
  • Arduino Uno R3
  • Arduino Mega 2560
  • ESP8266 NodeMCU
  • LCD 16×2
  • Module NRF24L01 thu phát sóng vô tuyến
  • Module Sim 900A mini.

Cảm biến khí gas MQ2

Vật liệu nhạy cảm của cảm biến khí MQ-2 là SnO2, có độ dẫn thấp trong không khí trong lành. Khi tồn tại khí đốt mục tiêu, độ dẫn điện của cảm biến sẽ cao hơn cùng với nồng độ khí tăng lên.
Bộ cảm biến khí MQ-2 có độ nhạy cao đối với LPG, Propane và Hydrogen, cũng có thể được sử dụng cho Methane và hơi đốt khác, với chi phí thấp và thích hợp cho các ứng dụng khác nhau.

Đặc tính
▪ Độ nhạy tốt với khí đốt trong phạm vi rộng
▪ Độ nhạy cao đối với LPG, Propane và Hydrogen
▪ Tuổi thọ cao và chi phí thấp
▪ Mạch đơn giản
Ứng dụng
▪ Máy dò rò rỉ gas trong nước
▪ Máy dò khí đốt công nghiệp
▪ Máy dò khí xách tay

Module cảm biến khí gas MQ-2 là sự tích hợp thêm cho cảm biến MQ-2 một mạch điện đơn giản để khi cảm biến phát hiện khí dễ cháy thì độ nhạy của cảm biến tăng lên, cũng như độ dẫn điện cũng cao hơn dựa vào đó mạch điện đơn giản sẽ chuyển sang tín hiệu tương tự hay tín hiệu số cho người dùng tiện sử dụng.

Module được sử dụng rộng rãi trong công nghiệp và dân dụng do mạch đơn giản, nhỏ gọn và chi phí thấp. Có cả 2 tín hiệu đầu ra: Analog (A0), Digital (D0) và điện áp sử dụng 5V.

Bên cạnh MQ2, chúng ta còn gặp cả cảm biến khí hóa lỏng MQ5, cảm biến này được ứng dụng trong các thiết bị phát hiện sự rò rỉ gas trong dân dụng và cả trong công nghiệp. Cả MQ5 và MQ2 về cơ bản là các cảm biến khí nhưng phạm vi cảm nhận mật độ (nồng độ) các khí của chúng khác nhau. Ví dụ, MQ5 có thể cảm nhận LPG trong phạm vi rộng hơn từ 200 ppm đến 10 000 ppm, trong đó phạm vi của MQ2 đối với LPG là từ 5000 ppm đến 10 000 ppm. Tương tự MQ2 rất nhạy cảm với khói trong khi MQ5 không nhạy cảm với khói. Vì vậy, chúng ta sẽ không chọn cảm biến khí MQ5 để thiết kế thiết các bị báo khói hoặc các ứng dụng liên quan đến khói. MQ2 có thể cảm nhận được khí mêtan (CH4) với phạm vi lên tới 20000 ppm trong khi MQ5 có thể cảm nhận CH4 chỉ tối đa trong phạm vi 10000 ppm. Do đó, sự khác biệt giữa MQ5 và MQ2 nằm trong phạm vi giá trị cảm biến của nó. Tuỳ theo từng ứng dụng mà ta sẽ linh hoạt trong việc lựa chọn cảm biến, ví dụ ta không thể chọn MQ2 để cảm nhận mức LPG thấp trong phạm vi 700 ppm vì MQ2 có phạm vi cảm nhận khí LPG tối thiểu ở mật độ 5000 ppm và tối đa ở 10000 ppm, do đó ta nên chọn MQ5

Arduino Uno R3 và Arduino Mega 2560

Arduino Uno R3

Arduino Uno R3 là một board điều khiển phù hợp nhất cho những người mới bắt đầu sử dụng vi xử lí ATmega328. Nó có 14 đầu vào / đầu ra số (trong đó 6 chân có thể được sử dụng làm đầu ra PWM), 6 đầu vào analog, một thạch anh thạch anh 16 MHz, một kết nối USB, một jack cắm điện, một đầu ICSP và một nút reset. Nó chứa mọi thứ cần thiết để hỗ trợ vi điều khiển; chỉ đơn giản kết nối nó với một máy tính bằng cáp USB hoặc sử dụng nó với một bộ chuyển đổi AC sang DC hoặc pin để bắt đầu. Bạn có thể làm việc với UNO mà không phải lo lắng quá nhiều về việc làm sai, kịch bản xấu nhất bạn có thể gặp là thay thế chip với một vài đô la và bắt đầu lại.

Thông số kỹ thuật Arduino Uno R3
▪ Vi xử lý: Atmega328
▪ Điện áp hoạt động: 5V
▪ Điện áp đầu vào: 7-12V
▪ Điện áp đầu vào (Giới hạn): 6-20V
▪ Chân vào/ra (I/O) số: 14 (6 chân có thể cho đầu ra PWM)
▪ Chân vào tương tự: 6
▪ Chân I/O số PWM: 6
▪ Dòng điện trong mỗi chân I/O: 20mA
▪ Dòng điện chân nguồn 3.3V: 50mA
▪ Bộ nhớ Flash: 32 KB (ATmega328) với 0.5 KB sử dụng cho trình nạp khởi
động.
▪ SRAM: 2 KB (ATmega328)
▪ EEPROM: 1 KB (ATmega328)
▪ Xung nhịp: 16MHz
Arduino Mega 2560

Arduino Mega 2560 R3 là sản phẩm tiêu biểu cho dòng mạch Mega là dòng board mạch có nhiều cải tiến so với Arduino Uno (54 chân digital IO và 16 chân analog IO). Đặc biệt bộ nhớ flash của MEGA được tăng lên một cách đáng kể, gấp 4 lần so với những phiên bản cũ của UNO R3. Điều này cùng với việc trang bị 3 timer và 6 cổng interrupt khiến board mạch Mega hoàn toàn có thể giải quyết được nhiều bài toán hóc búa, cần điều khiển nhiều loại động cơ và xử lý song song nhiều luồng dữ liệu số cũng như tương tự.

Ngoài việc phát triển được ưu tiên, việc kế thừa cũng được đặc biệt lưu ý. Trên mạch MEGA các chân digital vẫn từ 0-13, analog từ 0-5 và các chân nguồn tương tự thiết kế của UNO. Do vậy chúng ta dễ dàng phát triển nghiên cứu theo kiểu gắp ghép module từ Arduino UNO bê sang Arduino Mega.

Thông số kỹ thuật Arduino Mega 2560
▪ Vi xử lý: ATmega2560
▪ Điện áp hoạt động: 5V
▪ Điện áp đầu vào (được đề nghị): 7-12V
▪ Điện áp đầu vào (giới hạn): 6-20V
▪ Số lượng chân I/O: 54 chân (trong đó có 15 chân PWM)
▪ Số lượng chân Input Analog: 16
▪ Dòng điện DC mỗi I/O: 20 mA
▪ Dòng điện DC với chân 3.3V: 50 mA
▪ Bộ nhớ Flash: 256KB trong đó có 8KB sử dụng cho trình nạp khởi động.
▪ SRAM: 8KB
▪ EEPROM: 4KB
▪ Xung nhịp: 16 MHz

Các module còn lại

LCD 16×02

Module NRF24L01

Module sử dụng chip truyền sóng nRF24L01 ưu việt về tốc độ truyền, khoảng cách, độ nhạy, bổ sung thêm pipelines, buffers, và tính năng auto-retransmit nhưng vẫn tương thích ngược với phiên bản cũ về cách sử dụng …nRF24L01 hoạt động trên dải tần 2.4GHz và sử dụng giao tiếp SPI, khoảng cách tối đa trong điều kiện không vật cản lên đến 100m.

Thông số kỹ thuật
▪ Điện thế hoạt động: 1.9V – 3.6V
▪ Có sẵn anthena sứ 2.4GHz.
▪ Truyền được 100m trong môi trường mở với 250kbps baud.
▪ Tốc độ truyền dữ liệu qua sóng: 250kbps to 2Mbps.
▪ Tự động bắt tay (Auto Acknowledge).
▪ Tự động truyền lại khi bị lỗi (auto Re-Transmit).
▪ Multiceiver – 6 Data Pipes.
▪ Các chân IO đều chịu được điện áp vào 5V.
▪ Lập trình được kênh truyền sóng trong khoảng 2400MHz đến 2525MHz
(chọn được 125 kênh).
▪ Thứ tự chân giao tiếp: GND, VCC, CS, CSN, SCK, MOSI, MISO, IQR

Node MCU

Kit thu phát Wifi ESP8266 NodeMCU là kit phát triển dựa trên nền chip Wifi SoC ESP8266 với thiết kế dễ sử dụng và đặc biệt là có thể sử dụng trực tiếp trình biên dịch của Arduino để lập trình và nạp code, điều này khiến việc sử dụng và lập trình các ứng dụng trên ESP8266 trở nên rất đơn giản.
Kit thu phát Wifi ESP8266 NodeMCU được dùng cho các ứng dụng cần kết nối, thu thập dữ liệu và điều khiển qua sóng Wifi, đặc biệt là các ứng dụng liên quan
đến IoT. Kit thu phát Wifi ESP8266 NodeMCU sử dụng chip nạp và giao tiếp UART mới và ổn định nhất là CP2102 có khả năng tự nhận Driver trên tất cả các hệ điều
hành Window và Linux, đây là phiên bản nâng cấp từ các phiên bản sử dụng IC nạp giá rẻ CH340.
Thông số kỹ thuật Kit Wi-fi ESP8266 NodeMCU
▪ Chip: ESP8266 Wifi SoC (ESP-12)
▪ WiFi: 2.4 GHz hỗ trợ chuẩn 802.11 b/g/n
▪ Điện áp hoạt động: 3.3V
▪ Điện áp vào: 5V thông qua cổng USB
▪ Số chân I/O: 11 (tất cả các chân I/O đều có Interrupt/PWM/I2C/One-wire,
trừ chân D0)
▪ Số chân Analog Input: 1 (điện áp vào tối đa 3.3V)
▪ Bộ nhớ Flash: 4MB
▪ Giao tiếp: Cable Micro USB
▪ Hỗ trợ bảo mật: WPA/WPA2
▪ Tích hợp: TCP/IP
▪ Lập trình trên các ngôn ngữ: C/C++, Micropython, NodeMCU – Lua

Có tới 17 chân GPIO. Chúng có thể được gán cho các chức năng khác nhau. Mỗi GPIO có thể được cấu hình với kéo lên (ngoại trừ XPD_DCDC, được cấu hình kéo xuống).
Các chân này được ghép với các chức năng khác như I2C, I2S, UART, PWM,
Điều khiển từ xa IR, v.v. Tất cả các chân IO kỹ thuật số được bảo vệ khỏi điện áp quá mức với mạch đảo
được kết nối giữa mạch dẫn và ground. Điện áp đảo thường là khoảng 6V, và điện áp giữ là 5.8V. Các thiết bị đầu ra cũng được bảo vệ khỏi điện áp đảo ngược với điốt.

Module Sim900A mini

Sim900A là được xem như là một chiếc điện thoại với các chức năng từ cơ bản như: nghe gọi, nhắn tin cho đến GPRS … Giao tiếp vật lý trong ứng dụng điện thoại của SIM900A là 60 chân, nó cung cấp tất cả các giao diện vật lý giữa module Sim và bo mạch của khách hàng:

▪ Có Serial port và Debug port giúp dễ dàng hơn trong việc phát triển ứng dụng.
▪ Một kênh audio bao gồm Input của Microphone và Ouput của Speaker.
▪ Có thể dễ dàng được cấu hình bằng lệnh AT qua cổng giao tiếp nối tiếp.
▪ Giao tiếp với simcard giống như điện thoại di động. SIM900A hỗ trợ giao thức TCP/IP, rất hữu ích cho việc truyền dữ liệu trên Internet. SIM900A được thiết kế với công nghệ tiết kiệm năng lượng vì vậy mức tiêu thụ chỉ ở mức 1.5mA ở trong chế độ SLEEP.
Để hiện thực việc nhắn tin qua sim900A thì chỉ cần Serial port của Sim900A để gửi, nhận các AT command.

Mạch nguồn:
Sim900A đòi hỏi nguồn khá khắt khe. Cụ thể, nguồn cung cấp cho SIM900A là nguồn DC 3,2V – 4,8V. Dòng điện cung cấp phải lớn hơn hoặc bằng 2A. Trong quá trình khởi động SIM900A, áp sẽ bị sụt áp. Nếu dòng cung cấp không đủ, điện áp sẽ bị sụt xuống dưới mức yêu cầu và SIM900A không thể khởi động được. Nếu điện áp lớn hơn 4.8V thì sim900A sẽ bị cháy.
Phần giao tiếp với sim card: Sim900A hỗ trợ 2 loại SIM Card: 1.8V và 3V. Sim900A sẽ tự xác định loại sim nào và cấp nguồn. Sim 900A hỗ trợ sử dụng loại sim 6 chân.

Giao tiếp với module sim900A qua AT conmand: Việc điều khiển Sim900a được thực hiện thông qua việc truyền các lệnh AT (các lệnh này thường bắt đầu bằng “AT”, dùng để điều khiển các thiết bị tương tác với mạng.
Ví dụ: Lệnh AT để gửi một tin nhắn :
AT+CMGS=”+84908556993” Lệnh AT để lấy danh sách tin nhắn:
AT+CMGL=”ALL” Lệnh AT để đọc tin nhắn: AT+GMGR = 1 Lệnh AT để xoá tin nhắn: AT+CMGD=1

Giới thiệu module GSM GPRS Sim900A Mini


Module GSM GPRS Sim900A Mini được thiết kế nhỏ gọn với chi phí thấp nhưng vẫn đảm bảo được khả năng hoạt động tốt. Mạch được thiết kế ra các chân cơ bản của SIM900A, tích hợp khe sim kích cỡ thông thường và Anten. Mạch SIM900A được thiết kế để có khả năng cấp nguồn trực tiếp 5V và nguồn không cần phải có dòng lớn (nhờ có diode và tụ bù), có thể cấp trực tiếp từ 5V của Arduino hoặc từ cổng usb máy tính, các chân GIPO của SIM900A cũng có thể giao tiếp trực tiếp ở mức logic 3-5VDC.
Thông số kỹ thuật:
▪ IC chính: Sim900A
▪ Nguồn cấp: 4.5-5V, có thể sử dụng với nguồn dòng thấp từ 500mAh trở lên (như cổng USB, nguồn từ Board Arduino). Nên dùng nguồn 2A để đảm bảo hiệu suất hoạt động của SIM.
▪ Tích hợp khe Sim kích thước chuẩn.
▪ Tích hợp led báo trạng thái Sim900A
▪ Tích hợp tụ bù điện dung cao và Diode giảm áp để có thể cấp 5V DC và nguồn dòng thấp.
▪ Dòng khi ở chế độ chờ: 10 mA
▪ Dòng khi hoạt động: 100 mA đến 2A.
▪ Kích thước: 2.5 cm x 3.1 cm
Chức năng các chân
▪ VCC: Nguồn vào 5V.
▪ TXD: Chân truyền Uart TX.
▪ RXD: Chân nhận Uart RX.
▪ Headphone: Chân phát âm thanh.
▪ Microphone: Chân nhận âm thanh (phải gắn thêm Micro từ GND vào chân
này thì mới thu được tiếng).
▪ GND: Chân Mass, cấp 0V.

Thiết kế phần cứng

Sơ đồ khối hệ thống

Chức năng các khối
Khối nguồn: Cung cấp nguồn hoạt động cho hệ thống.
Khối cảm biến khí gas: Đo nồng độ khí gas và gửi về Arduino xử lí.
Khối hiển thị LCD: Hiển thị nồng độ khí gas đo được và trạng thái an toàn hay nguy hiểm.
Khối báo động tại chỗ: Phát ra tiếng báo động tại chỗ khi cảm biến ở bất cứ nơi đâu trong hệ thống phát hiện có nguy hiểm.
Khối thu phát sóng RF: Thu phát sóng RF để giao tiếp giữa khối xử lý thứ cấp và khối xử lý trung tâm.
Khối báo động qua tin nhắn: Gửi tin nhắn cho số điện thoại đã đặt trước khi phát hiện có khí gas rò rỉ quá chuẩn cho phép.
Khối đưa dữ liệu lên web: Thu thập dữ liệu cảm biến đưa lên trang web để tiện theo dõi.
Khối xử lý thứ cấp (tại chỗ đặt cảm biến): Thu nhận dữ liệu từ cảm biến và xử lý, nếu vượt quá giới hạn cho phép thì gửi tín hiệu báo nguy hiểm cho khối xử lí trung tâm xử lý.
Khối xử lý trung tâm: Hiển thị nơi xảy ra rò rỉ khí lên màn LCD, đồng thời gửi tin nhắn cảnh báo đến số điện thoại đặt trước cũng như là gửi tín hiệu đến tất cả các khối xử lí thứ cấp để mở chuông báo động toàn hệ thống khi nhận được tín hiệu báo nguy hiểm từ bất kì khối xử lí thứ cấp nào.

Sơ đồ nguyên lí bộ xử lí thứ cấp

Giải thích nguyên lí toàn hệ thống

Cảm biến khí gas MQ-2 ở các nơi liên tục thu thập giá trị khí gas từ môi trường về so sánh với ngưỡng cho phép do người dùng đặt. Bên cạnh đó, những số liệu thu được đó sẽ được up lên web thingspeak.com qua module ESP8266 MCU và vẽ thành biểu đồ nhầm dễ dàng kiểm soát. Khi nồng độ khí gas chưa vượt quá giới hạn thì cho phép thì các kênh cảnh báo là chuông, module sim900a sẽ không có tín hiệu gì. LCD hiện thị trạng thái an toàn.

Khi nồng độ khí gas vượt quá mức cho phép khối xử lí thứ cấp sẽ gửi tín hiệu cảnh báo đến khối xử lí trung tâm qua Module thu phát sóng RF nRF24L01 2.4 Ghz. Tín hiệu cảnh báo đó là 1 mã riêng biệt mà khối xử lí trung tâm có thể phân biệt với các khối xử lí thứ cấp khác. Sau khi nhận được tín hiệu cảnh báo chuông ở khối xử lí trung tâm sẽ reo lên đồng thời gửi tin nhắn, gọi điện đến số điện thoại được cài đặt thông báo rằng nồng độ khí gas vượt quá mức cho phép. LCD ở khối xử lí trung tâm hiển thị khu vực của khối xử lí thứ cấp nào đang rò rỉ. Song song đó khối xử lí trung tâm cũng sẽ gửi tín hiệu đến tất cả các khối xử lí thứ cấp khác để phát tín hiệu cho chuông reo và hiển thị lên LCD khu vực nào đang xảy ra rò rỉ để có biện pháp phòng chống kịp thời, hướng di chuyển hợp lí tránh khu vực nguy hiểm.

Chương trình trên Arduino IDE

Chương trình trạm thu 1

// chuong trinh tram thu 1
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int msg[1];
int msg5[1];
int value,per;
RF24 radio(7,8);
const uint64_t pipe1 = 0xE8E8F0F0E1LL;//GUI MEGA
const uint64_t pipe3 = 0xF0F0F0F000LL; //NHAN MEGA
#include <LiquidCrystal.h>
//Khai báo các chân LCD kết nối với arduino
LiquidCrystal lcd(2, 3, 4, 5, 6, 9);
void setup(){
 Serial.begin(9600);
 radio.begin();
radio.openWritingPipe(pipe1);
 lcd.begin(16, 2); // Khai báo LCD là loại 16x2
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("loading..."); // In ra chữ "Warming up"
 for(int i = 1; i <= 2; i++) // Đợi 120 giây để làm nóng cảm biến
 {
 lcd.setCursor(0, 1); // Đưa con trỏ về cột 0 hàng 1
 lcd.print(i); // In ra số giây đã đếm
 delay(1000); // Trễ 1000ms
 }
 lcd.clear(); // Xóa màn hình LCD
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("Ready!"); // In ra chữ Ready
 delay(1000); // Trễ 1000ms
 pinMode(10,OUTPUT); //dieu khien relay loa
 digitalWrite(10,0);
}
void loop(){
 value = analogRead(A0); //Đọc nồng độ khí gas.
 per = map(value, 0, 1023, 0, 100); // Chuyển nồng độ khí gas về đơn vị %.
 lcd.setCursor(0,1);
 lcd.print("ND GAS KV1:");
 lcd.setCursor(12,1);
 lcd.print(per);
 if (per<10)
 {
 lcd.print("% ");
 }
 else if (per<100)
 {
lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 int i=0;
 for(i=1; i<=5;i++)
 {
 radio.begin();
 radio.openWritingPipe(pipe1);
 radio.stopListening();
 msg[0] = per;
 radio.write(msg, 1);
 Serial.println(msg[0]);
 Serial.println(i);
 radio.begin();
 radio.openWritingPipe(pipe3);
 radio.startListening();
 delay(5);
 if (radio.available())
 {
 {
 radio.read(msg5, 1);
 Serial.println("nhan trung tam");
 Serial.println(msg5[0]);
 if (msg5[0] == 100)
 {
 digitalWrite(10, 1);
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
lcd.print("KV1 NGUY HIEM ");
 }
 else if (msg5[0] == 110)
 {
 digitalWrite(10, 1);
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2 NGUY HIEM ");
 }
 else if (msg5[0] == 111)
 {
 digitalWrite(10, 1);
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1,2 NGUY HIEM");
 }
 else
 {
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1 AN TOAN ");
  digitalWrite(10, 0);
 }
 }
 }
 }
}

Chương trình trạm thu 2

// Chuong trinh tram thu 2
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int msg2[1];
int msg5[1];
int value,per;
RF24 radio(7,8);
const uint64_t pipe2 = 0x00000000000F;
const uint64_t pipe4 = 0xF0F0F0F0FFLL;
#include <LiquidCrystal.h>
//Khai báo các chân LCD kết nối với arduino
LiquidCrystal lcd(2, 3, 4, 5, 6, 9);
void setup(){
 Serial.begin(9600);
 radio.begin();
 radio.openWritingPipe(pipe2);
 lcd.begin(16, 2); // Khai báo LCD là loại 16x2
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("loading..."); // In ra chữ "Warming up"
 for(int i = 1; i <= 2; i++) // Đợi 120 giây để làm nóng cảm biến
 {
 lcd.setCursor(0, 1); // Đưa con trỏ về cột 0 hàng 1
 lcd.print(i); // In ra số giây đã đếm
 delay(1000); // Trễ 1000ms
 }
 lcd.clear(); // Xóa màn hình LCD
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("Ready!"); // In ra chữ Ready
 delay(1000);
 pinMode(10,OUTPUT); //dieu khien relay loa
 digitalWrite(10,0);
 }
void loop(){
 value = analogRead(A0); //Đọc nồng độ khí gas.
 per = map(value, 0, 1023, 0, 100); // Chuyển nồng độ khí gas về đơn vị
%.
 msg2[0] = per;
 lcd.setCursor(0,1);
 lcd.print("ND GAS KV2:");
 lcd.setCursor(12,1);
 lcd.print(per);
 if (per<10)
 {
 lcd.print("% ");
 }
 else if (per<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
int i=0;
 for(i=1; i<=5;i++)
 {
 radio.begin();
 radio.openWritingPipe(pipe2);
 radio.stopListening();
 msg2[0] = per;
 radio.write(msg2, 1);
 Serial.println(msg2[0]);
 Serial.println(i);
 radio.begin();
 radio.openWritingPipe(pipe4);
 radio.startListening();
 delay(5);
 if (radio.available())
 {
 {
 radio.read(msg5, 1);
 Serial.println("nhan trung tam");
 Serial.println(msg5[0]);
 if (msg5[0] == 100)
 {
 digitalWrite(10, HIGH);
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1 NGUY HIEM ");
 }
 else if (msg5[0] == 110)
 {
 digitalWrite(10, HIGH);
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2 NGUY HIEM ");
 }
 else if (msg5[0] == 111)
 {
 digitalWrite(10, HIGH);
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1,2 NGUY HIEM");
 }
 else
 {
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2 AN TOAN ");
 digitalWrite(10, LOW);
 }
 }
 }
 }
}

Khối xử lí trung tâm

//❖ Chương trình bộ xử lí trung tâm.
// Chương trình Mega
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <avr/interrupt.h>
int dem_timer =0;
// Khai báo các chân LCD kết nối với arduino
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);
SoftwareSerial SIM900(16,17);
String textSMS1="KHU VUC 1 NGUY HIEM";
String textSMS2="KHU VUC 2 NGUY HIEM";
String textSMS3="KHU VUC 1,2 NGUY HIEM";
int value,per,sav;
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
int trang_thai_goi=0;
int trang_thai_tn=0;
char tempchar;
int gh=20;
int msg[1];
int msg2[1];
int msg5[1];
RF24 radio(7,8);
const uint64_t pipe1 = 0xE8E8F0F0E1LL; //RF1
const uint64_t pipe2 = 0x00000000000F;//RF2
const uint64_t pipe3 = 0xF0F0F0F000LL; //gui RF1
const uint64_t pipe4 = 0xF0F0F0F0FFLL; //gui RF2
void setup() {
 Serial.begin(9600);
 Serial1.begin(9600);
 SIM900.begin(9600);
 radio.begin();
 radio.openReadingPipe(1,pipe1);
 radio.openReadingPipe(1,pipe2);
 radio.startListening();//Giao tiếp sóng giữa 3 board
 lcd.begin(16, 2); // Khai báo LCD là loại 16x2
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("loading..."); // In ra chữ "loading..."
 delay(1000); // Trễ 1000ms
 lcd.clear(); // Xóa màn hình LCD
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("Ready!"); // In ra chữ Ready
 set_up_timer();
 pinMode(6,OUTPUT); //chân relay diều khiển chuông
 digitalWrite(6,0);
}
void loop() {
 Nhan_NRF_Canh_Bao1();
 Nhan_NRF_Canh_Bao2();
 Hienthi_LCD();
 Serial.println("gui du lieu web");
 Serial1.print('a'+String(msg[0])+'b'+String(msg2[0])+'!');
 Kiem_Tra_Nguy_Hiem();
 Truyen_NRF1();
 Truyen_NRF2();
}
void Hienthi_LCD()
{
 if ((msg[0] < gh)&(msg2[0] < gh))
 {
 lcd.setCursor(0,1); // Đưa con trỏ về cột 0 hàng 1
 lcd.print("KV1:");
 lcd.print(msg[0]);
 if (msg[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(8,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2:");
 lcd.print(msg2[0]);
 if (msg2[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg2[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(0,0);
 lcd.print(" AN TOAN ");
 }
 else if ((msg[0] >= gh)&(msg2[0] < gh))
 {
 lcd.setCursor(0,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1:");
 lcd.print(msg[0]);
 if (msg[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(8,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2:");
 lcd.print(msg2[0]);
 if (msg2[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg2[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print(" KV1 NGUY HIEM ");
 }
 else if ((msg[0] < gh)&(msg2[0] >= gh))
 {
 lcd.setCursor(0,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1:");
 lcd.print(msg[0]);
 if (msg[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(8,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2:");
 lcd.print(msg2[0]);
 if (msg2[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg2[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 0
 lcd.print(" KV2 NGUY HIEM ");
 }
 else
 {
 lcd.setCursor(0,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV1:");
 lcd.print(msg[0]);
 if (msg[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(8,1); // Đưa con trỏ về cột 0 hàng 0
 lcd.print("KV2:");
 lcd.print(msg2[0]);
 if (msg2[0]<10)
 {
 lcd.print("% ");
 }
 else if (msg2[0]<100)
 {
 lcd.print("% ");
 }
 else
 {
 lcd.print("%");
 }
 lcd.setCursor(0,0); // Đưa con trỏ về cột 0 hàng 1
 lcd.print("KV1,2 NGUY HIEM");
 }
}
void Nhan_NRF_Canh_Bao1()
{
 radio.begin();
 radio.openReadingPipe(1,pipe1);
 radio.startListening();
 delay(10);
 if (radio.available())
 {
 radio.read(msg, 1);
 Serial.println("nhan nong do 1");
 Serial.println(msg[0]);
 }
 else{Serial.println("khong co tin hieu 1");}
}
 void Nhan_NRF_Canh_Bao2()
{
 radio.begin();
 radio.openReadingPipe(1,pipe2);
 radio.startListening();
 delay(10);
 if (radio.available())
 {
 radio.read(msg2, 1);
 Serial.println("nhan nong do 2");
 Serial.println(msg2[0]);
 }
 else{Serial.println("khong co tin hieu 2");}
}
void Kiem_Tra_Nguy_Hiem()
{
 if((msg[0] >= gh)&(msg2[0] < gh))
 {
 msg5[0] = 100;
 trang_thai_goi=1;
 trang_thai_tn=1;
 digitalWrite(6, 1);//> 40% mở loa
 }
 else if((msg[0] < gh)&(msg2[0] >= gh))
 {
 msg5[0] = 110;
 trang_thai_goi=1;
 trang_thai_tn=2;
 digitalWrite(6, 1);//> 40% mở loa
 }
 else if((msg[0] >= gh)&(msg2[0] >= gh))
 {
 msg5[0] = 111;
 trang_thai_goi=1;
 trang_thai_tn=3;
 digitalWrite(6, 1);//> 40% mở loa
 }
 else if((msg[0] < gh)&(msg2[0] < gh))
 {
 msg5[0] = 001;
 trang_thai_goi=0;
 trang_thai_tn=0;
 digitalWrite(6, 0);//> 40% tắt loa
 }
}
void Truyen_NRF1()
{
 radio.begin();
 radio.openWritingPipe(pipe3);
 radio.stopListening();
 radio.write(msg5, 1);
 Serial.println("bat loa he thong1");
 Serial.print("msg5 :");
 Serial.println(msg5[0]);
}
 void Truyen_NRF2()
{
 radio.begin();
 radio.openWritingPipe(pipe4);
 radio.stopListening();
 radio.write(msg5, 1);
 Serial.println("bat loa he thong2");
 Serial.print("msg5 :");
 Serial.println(msg5[0]);
 }
void goi()
{
 if (trang_thai_tn == 1){
 delay(20);
 if (trang_thai_tn == 1){
 if((dem_timer<160)&(dem_timer>10)){
 SIM900.println("ATD+841692753665;"); // GỌI ĐẾN SỐ 01692753665 => BẠN THAY SỐ ĐIỆN THOẠI CẦN GỌI/NHẮN TIN ĐẾN
 }
 else
 { SIM900.println(); }
 }
 }
 else if (trang_thai_tn == 2){
 delay(20);
 if (trang_thai_tn == 2){
 if((dem_timer<160)&(dem_timer>10)){
 SIM900.println("ATD+841692753665;"); // GỌI ĐẾN SỐ
 }
 else
 { SIM900.println(); }
 }
 }
 else if (trang_thai_tn == 3){
 delay(20);
 if (trang_thai_tn == 3){
 if((dem_timer<160)&(dem_timer>10)){
 SIM900.println("ATD+841692753665;"); // GỌI ĐẾN SỐ
 }
 else
 { SIM900.println(); }
 }
 }
}
void SMS()
{
if (trang_thai_tn == 1){
 delay(20);
 if (trang_thai_tn == 1){
 if((dem_timer<=10)&(dem_timer>0)){
 sendSMS(textSMS1);//GỬI TÍN HIÊU SMS
 Serial.println("GUI SMS");//IN RA MÀN HINH
 }
 }
 }
else if (trang_thai_tn == 2){
 delay(20);
 if (trang_thai_tn == 2){
 if((dem_timer<=10)&(dem_timer>0)){
 sendSMS(textSMS2);//GỬI TÍN HIÊU SMS
 Serial.println("GUI SMS");//IN RA MÀN HINH
 }
 }
 }
else if (trang_thai_tn == 3){
 delay(20);
 if (trang_thai_tn == 3){
 if((dem_timer<=10)&(dem_timer>0)){
 sendSMS(textSMS3);//GỬI TÍN HIÊU SMS
 Serial.println("GUI SMS");//IN RA MÀN HINH
 }
 }
 }
}
 void sendSMS(String message)
{
 SIM900.print("AT+CSCS=\"GSM\"\r\n");  // Lệnh AT để gửi in
nhắn SMS
 SIM900_response(500);
 SIM900.print("AT+CMGF=1 \r\n"); // Bắt đầu quá trình gửi tin
nhắn
 SIM900_response(500);
 SIM900.print("AT+CMGS=\"+841692753665\"\r"); // Số điên thoại của
người nhân theo format quốc tế
 SIM900_response(500);
 SIM900.print(message); // gửi nội dung tin nhắn
 SIM900_response(500);
 SIM900.print((char)26); // Kết thúc lênh gửi
 SIM900_response(5000);
}
void SIM900_response(int time)
{
int tnow = millis();
while ((millis()-tnow) < time){
 if (SIM900.available()){
 tempchar = (char)SIM900.read();
 if (tempchar == '\r'){
 Serial.print("/R/");
 }
 else if (tempchar == '\n'){
 Serial.println("/N/");
 }
 else Serial.print(tempchar);
 }
 }
}
void set_up_timer()
{
 cli(); // tắt ngắt toàn cục
 /* Reset Timer/Counter1 */
 TCCR1A = 0;
 TCCR1B = 0;
 TIMSK1 = 0;
 /* Setup Timer/Counter1 */
 TCCR1B |= (1 << CS11) | (1 << CS10); // prescale = 64
 TCNT1 = 40536;
 TIMSK1 = (1 << TOIE1); // Overflow interrupt enable
 sei();
}
ISR (TIMER1_OVF_vect)
{
 TCNT1 = 40536;
 if(trang_thai_goi == 1){
 dem_timer=dem_timer+1;
 if((trang_thai_tn == 1)||(trang_thai_tn == 2)||(trang_thai_tn == 3))
 {
 if (dem_timer == 260) {dem_timer=11;}
 }
 }
 else if (trang_thai_goi == 0)
 { dem_timer=0;}
}

Tham khảo: Đoàn Thanh Đủ




LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Chia sẻ PCB KIT ESP32

Mạch nguyên lý schemaic: Download toàn bộ project phần mềm Altium: DOWNLOAD Một vài hình ảnh thiết kế trên Altium:

Chia sẻ PCB Ethernet Gigabit Switch 5 Port

Mạch nguyên lý Schematic: DOWNLOAD ALTIUM PROJECT Một số hình ảnh 3D và 2D của mạch: Lớp TOP: Lớp 2: Lớp 3:Lớp Bottom:

Chia sẻ PCB mạch Hub USB2.0 dùng FE1.1S

DOWNLOAD PROJECT (ALTIUM) Mạch thiết kế trên phần mềm Altium, 2 lớp, dùng cho mục đích thử nghiệm.

Chia sẻ PCB nguồn công nghiệp VRB2405YMD-20WR3

Công suất đầu ra 20 Vin (VDC) 18~36 Vout (VDC) 5 Số đầu ra 1 Điện áp cách ly 1500     DOWNLOAD  

Recent Comments