15 C
Hanoi
Thứ Sáu, Tháng Mười Hai 3, 2021
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 Đủ




106 COMMENTS

  1. Hi just wanted to give you a brief heads up and let you know a few of the pictures aren’t loading correctly.
    I’m not sure why but I think its a linking issue.
    I’ve tried it in two different internet browsers and both show the same outcome.

  2. An interesting discussion is definitely worth comment.

    I do think that you ought to write more on this subject matter, it may not be a taboo subject but usually people do not talk about such issues.
    To the next! Best wishes!!

  3. Türkiyenin en iyi markası olan şampuanlar ile bir
    adım önde giden hc careye bir de a href=”https://www.lekekremim.com/”>leke kremi satışı
    eklenmiştir. Cilt lekeleri doğum lekeleri gibi
    bir çok lekelere karşı kesin çözüm sunmaktadır en iyi leke kremi sitesi lekekremim.com dan leke kremi satın alabilirsiniz

  4. First of all I would like to say awesome blog! I had a quick question which I’d like to ask if
    you don’t mind. I was curious to know how you center yourself and clear your head before
    writing. I have had trouble clearing my mind in getting my ideas out.
    I truly do enjoy writing but it just seems like the first 10 to
    15 minutes are generally wasted simply just trying to figure out how to begin. Any ideas or tips?
    Kudos!

    Here is my web site; best CBD gummies

  5. İnstagram takipçi satın al son zamanlarda binlerce kişi tarafından araştırılmaktadır. İnstagram takipçi satın al hizmetinden faydalanmak için alacağınız sitenin güvenilir olması gerekmektedir. Güvenilir instagram takipçi satın almak için bizi tercih etmenizde fayda vardır. İnstagram takipçi satın al hizmeti için en güvenilir site ile karşınızdayız!

  6. İnstagram’da yükselişin kolay yolu takipçi satın almak. Sizde hesabınızı daha hızlı bir şekilde yükseltmek için instagram takipçi satın alabilirsiniz. Websitemizi ziyaret ederek, bizimle daima iletişime geçebilir ve instagram takipçi satın alma işleminizde yardım alabilirsiniz.

  7. İnstagram takipçi satın al son zamanlarda binlerce kişi tarafından araştırılmaktadır. İnstagram takipçi satın al hizmetinden faydalanmak için alacağınız sitenin güvenilir olması gerekmektedir. Güvenilir instagram takipçi satın almak için bizi tercih etmenizde fayda vardır. İnstagram takipçi satın al hizmeti için en güvenilir site ile karşınızdayız!

  8. İnstagram takipçi satın al ve hesabını yükselişe geçir! Ucuz instagram takipçi satın alma paketleri sunan sitemiz ile takipçi sayınızı yükselişe geçirmeye başlayın. Kaliteli ve aktif instagram takipçi satın alma paketleri sunan sitemiz ile hesabınızı popüler hale getirin. İnstagram takipçi satın al hizmetini kullanmak için Türkiye’nin en güvenilir instagram takipçi satın alma sitesini ziyaret edin.

  9. Türk takipçi ve güvenilir takipçi satın alarak takipçinizi yükseltebilirsiniz. Sizde sosyal medya uygulamalarında daha fazla beğeni, takipçi ve izlenme için takipçi satın alabilirsiniz. Hadi gelin ve instagram takipçi satın alarak takipçi yükseltin.

  10. İnstagram takipçi satın alma sitesi ile takipçi arttırmak artık çok kolay! İnstagram takipçi satın al paketlerimiz ile takipçi sayınızı güvenle yükseltebilirsiniz. Güvenilir ve ucuz instagram takipçi satın al hizmetimiz ile tanışmak için sitemizi ziyaret edin. İnstagram takipçi satın al hizmetimizi denemek için güvenilir instagram takipçi satın alma sitemizi inceleyin. En güvenilir instagram takipçi satın alma paketleri sadece sitemizde.

  11. İnstagram hesabınızı canlandırmak için, türk takipçi satın alma sitemizi ziyaret edebilirsiniz. En güvüvenilir ve en hızlı şekilde siparişleriniz tamamlanmaktadır. Faturalı hizmet ile resmi bir şekilde takipçi satın alabilirsiniz. İnstagram 100, 500 veya 1000 takipçi paketlerinden hesabın için seçim yap ve takipçi satın al.

  12. İnstagram’da yükselişin kolay yolu takipçi satın almak. Sizde hesabınızı daha hızlı bir şekilde yükseltmek için instagram takipçi satın alabilirsiniz. Websitemizi ziyaret ederek, bizimle daima iletişime geçebilir ve instagram takipçi satın alma işleminizde yardım alabilirsiniz.

  13. You will come away deeply revitalized and with the confidence to bring these Tantric practices to your students. Teachers will get a certificate for 100 continuing education hours or as a module of the YTT 300. Join this world-renowned teaching team, Yogrishi Vishvketu and Yog Sundari and Guest Teachers for 72 hours of Live online teaching and a range of other learning support tools to fully integrate your learning throughout the course. This is a rare opportunity to participate in one of our advanced modules right from your home location, in which the 100-hour module can be counted toward your YTT 500 accreditation. https://akhandayoga.com/ We offered our Raj Yoga module virtually last summer to great success and many of the students found their focus and engagement with teachers and other students was actually enhanced in the interactive online format. Shiva Shakti Power is designed to be an intensive, providing you with an embodied and practical understanding of Classical Kundalini Yoga. The course will take place over two weekends followed by a six-day intensive from April through mid-May. Classes take place on Zoom as four 1.5-hour sessions per day. Class time is posted in Pacific Time (LA Time), but is accessible to people in time zones anywhere from LA to Milan. Have you been practicing or even teaching Yoga for a while and want to explore Ayurveda and how to work its magic for radiant living in alignment with your constitution? Understanding Ayurveda more deeply will help you bring Yoga into all areas of your life and help teachers identify the most effective techniques to help individual students achieve balance and wellness.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Tắt kính lúp hình vuông trong Altium

Tắt kính lúp của sổ PCB  trên Altium Sử dụng phím tắt: Shift+M Tham khảo thêm một số phím tắt khác trên phần mềm Altium Designer: Thiết...

Tổng hợp trang web liên quan thiết kế phần cứng điện tử

4 trang web tải thư viện SCH/PCB và 3D https://www.ultralibrarian.com/ https://componentsearchengine.com/ https://octopart.com/ https://www.snapeda.com/ https://componentsearchengine.com/ 2 trang tìm 3D cho thư viện của các bạn bao gồm: https://www.3dcontentcentral.com/ https://grabcad.com/library 4 trang cung cấp các...

Mạch đóng ngắt Relay sử dụng Transistor

Giới thiệu về Relay Rơ le (Relay) là một công tắc chuyển đổi hoạt động bằng điện. Dòng điện chạy qua cuộn dây của rơ...

Nạp Bootloader cho Arduino Pro Micro

Bootloader là một chương trình nhỏ được nạp sẵn vào chip vi điều khiển trên Arduino, nhờ đó bạn lập trình cho Arduino một...

Recent Comments