森林火災是森林中常見的危害,對野生動物和環境造成很大危害。如果可以在森林地區部署一個強大的系統來檢測火災并提醒消防當局立即采取行動,則可以避免這種情況。在這個項目中,目的是建立一個使用物聯網的森林火災檢測系統,該系統將檢測火災并通過物聯網向當局發送緊急警報。在這里,GSM/GPRS 模塊用于與物聯網服務器通信,因為通常在森林地區,網絡帶寬非常低或不可用。因此,2G 網絡更適合與服務器通信。
使用的組件
Arduino納米
SIM800L GPS/GPRS 模塊
3.7V鋰離子電池
火焰傳感器
點陣穿孔板
SIM800L 模塊工作
SIM800L 是一個緊湊型模塊,允許 GPRS 傳輸、發送/接收 SMS 和撥打語音電話。SIM800L 模塊上有兩個天線。 第一個用于環形天線,可以直接焊接在板上,另一個用于外部天線。
規格:
輸入電壓:3.4V - 4.2V
支持頻率:四頻(850 / 950 / 1800 /1900 MHz)
SIM卡插槽:micro SIM插槽
天線連接器:IPX
工作溫度范圍:-40 do + 85°C
基于物聯網的森林火災檢測系統框圖
如下框圖所示,該項目由火焰傳感器、Arduino Nano 和 SIM800L GSM/GPRS 模塊作為主要組件。火焰傳感器可以檢測到火災,該傳感器提供與火災狀態相對應的數字輸出,并由 Arduino Nano 接收。
Arduino 比較信號并在發生火災時觸發 SIM800L。SIM800L通過AT指令與thingspeak服務器進行通信。
Arduino IoT 火災探測 - 電路圖
如電路圖所示,火焰傳感器連接到 Arduino Nano 的數字輸入引腳。如果您有興趣,您還可以查看我們之前構建的其他簡單火災報警電路。
SIM800L 通過邏輯移位電阻連接到 Arduino Nano,因為 SIM800L 在 3.3v Logic 上工作。SIM800L 模塊單獨供電,因為它工作在 3.4-4.2V DC 和 5V DC 外部電源給 Arduino Nano。或者,此處可以使用 3.7-5 V 升壓轉換器來避免使用兩個電源。
用于基于物聯網的森林火災檢測的 Arduino 程序
按照電路圖完成硬件連接成功后,現在是時候將代碼刷入 Arduino 了。所以第一步是在代碼中包含所有必需的庫,在我的例子中是“?SoftwareSerial.h?”和“?String.h?”。
?
#include#include
?
下一步是定義連接 SIM800L 的 Arduino 的 RX、TX 引腳。
?
SoftwareSerial gprsSerial(10, 11);
?
在 setup() 中,進行了串行初始化、SIM800L 模塊初始化和 GPIO 引腳聲明等所有初級初始化。
?
無效設置() { pinMode(12,輸出); pinMode(9,輸入); gprsSerial.begin(9600); // GPRS 波特率 Serial.begin(9600); // GPRS 波特率 Module_Init(); }
?
在 SIM800L 模塊初始化函數中,調用了幾個 AT 命令來初始化模塊并了解模塊的狀態。各個 AT 命令的功能可以在 SIM800L 的 AT 命令表中找到。但這里唯一需要關注的是語句“?gprsSerial.println("AT+CSTT="www"")”,其中定義了運算符的訪問點。確保將正確的接入點名稱替換為“www”。
?
void Module_Init() { gprsSerial.println("AT"); 延遲(1000); gprsSerial.println("AT+CPIN?"); 延遲(1000); gprsSerial.println("AT+CREG?"); 延遲(1000); gprsSerial.println("AT+CGATT?"); 延遲(1000); gprsSerial.println("AT+CIPSHUT"); 延遲(1000); gprsSerial.println("AT+CIPSTATUS"); 延遲(2000); gprsSerial.println("AT+CIPMUX=0"); 延遲(2000); 顯示序列數據(); gprsSerial.println("AT+CSTT="www""); 延遲(1000); 顯示序列數據(); gprsSerial.println("AT+CIICR"); 延遲(3000); 顯示序列數據(); gprsSerial.println("AT+CIFSR"); 延遲(2000); 顯示序列數據(); gprsSerial.println("AT+CIPSPRT=0"); 延遲(3000); 顯示序列數據(); }
?
在 loop() 內部,來自引腳 12 的數字值被讀取并存儲在一個變量中。
?
int fire = digitalRead(12);
?
然后,當檢測到火災時,使用 if-else 循環來檢測 SIM800L 的觸發以采取必要的措施。如下圖,AT+CIPSTART用于連接Thingspeak服務器并啟動連接。AT+CIPSEND 用于向服務器發送數據。這里有一件重要的事情是將“?Thingspeak write API Key?”替換為您之前記錄的字符串中的實際密鑰。
?
gprsSerial.println("AT+CIPSTART="TCP","api.thingspeak.com","80"");//啟動連接 延遲(6000); 顯示序列數據(); gprsSerial.println("AT+CIPSEND");//開始向遠程服務器發送數據 delay(4000); 顯示序列數據(); String str = "GET https://api.thingspeak.com/update?api_key=ER43PWXXXXXQF0I&field1=" + String(1); 序列號.println(str); gprsSerial.println(str);//開始向遠程服務器發送數據
?
數據傳輸完成后,使用 AT+CIPSHUT 關閉連接。
?
gprsSerial.println("AT+CIPSHUT");//關閉連接 延遲(100);
?
森林火災探測系統 - 測試
要測試原型,首先需要將 Microsim 插入 SIM800L 插槽,如圖所示。然后將模塊上電,然后我們可以看到模塊中的 LED 閃爍。如果與初始啟動相比,LED 閃爍延遲,則表示它已獲得網絡,并已準備好連接到服務器。現在我們可以在 Thingspeak 服務器中看到狀態。
您還可以在下面鏈接的視頻中查看該項目的完整工作。希望你喜歡它并且能夠自己構建一個。如果您有任何問題,請將它們留在下面的評論中或使用我們的論壇。
代碼
#include
SoftwareSerial gprsSerial(10, 11);
#include
int flag = 0;
無效設置()
{
pinMode(9,輸出);
pinMode(12,輸入);
gprsSerial.begin(9600); // GPRS 波特率
Serial.begin(9600); // GPRS 波特率
Module_Init();
}
void loop()
{
if (gprsSerial.available())
Serial.write(gprsSerial.read());
int fire = digitalRead(12);
if (fire == 0)
{
digitalWrite(9, HIGH);
gprsSerial.println(“AT+CIPSTART=\”TCP\“,\”api.thingspeak.com\“,\”80\“”);
顯示序列數據();
gprsSerial.println(“AT+CIPSEND”);//開始向遠程服務器發送數據
delay(4000);
顯示序列數據();
String str = “GET https://api.thingspeak.com/update?api_key=ER43PXXXXXHQF0I&field1= ” + String(1);
序列號.println(str);
gprsSerial.println(str);//開始向遠程服務器發送數據
delay(4000);
顯示序列數據();
數字寫入(9,低);
gprsSerial.println((char)26);//發送
延遲(5000);//等待回復,重要!時間以互聯網
gprsSerial.println() 條件為準;
顯示序列數據();
gprsSerial.println(“AT+CIPSHUT”);
延遲(100);
顯示序列數據();
標志 = 0;
}
else
{
digitalWrite(9, LOW);
如果(標志 == 0)
{
標志 = 1;
gprsSerial.println(“AT+CIPSTART=\”TCP\“,\”api.thingspeak.com\“,\”80\“”);//啟動連接
延遲(6000);
顯示序列數據();
gprsSerial.println(“AT+CIPSEND”);//開始向遠程服務器發送數據
delay(4000);
顯示序列數據();
String str = “GET https://api.thingspeak.com/update?api_key=ER43PWT91CGHQF0I&field1= ” + String(0);
序列號.println(str);
gprsSerial.println(str);//開始向遠程服務器發送數據
delay(4000);
顯示序列數據();
數字寫入(9,低);
gprsSerial.println((char)26);//發送
延遲(5000);//等待回復,重要!時間以互聯網
gprsSerial.println() 條件為準;
顯示序列數據();
gprsSerial.println(“AT+CIPSHUT”);//關閉連接
延遲(100);
顯示序列數據();
}
}
}
void ShowSerialData()
{
while (gprsSerial.available() != 0)
Serial.write(gprsSerial.read());
延遲(5000);
無效Module_Init
()
{
gprsSerial.println(“AT”);
延遲(1000);
gprsSerial.println(“AT+CPIN?”);
延遲(1000);
gprsSerial.println(“AT+CREG?”);
延遲(1000);
gprsSerial.println(“AT+CGATT?”);
延遲(1000);
gprsSerial.println(“AT+CIPSHUT”);
延遲(1000);
gprsSerial.println(“AT+CIPSTATUS”);
延遲(2000);
gprsSerial.println(“AT+CIPMUX=0”);
延遲(2000);
顯示序列數據();
gprsSerial.println(“AT+CSTT=\”www\“”);
延遲(1000);
顯示序列數據();
gprsSerial.println(“AT+CIICR”);
延遲(3000);
顯示序列數據();
gprsSerial.println(“AT+CIFSR”);
延遲(2000);
顯示序列數據();
gprsSerial.println(“AT+CIPSPRT=0”);
延遲(3000);
顯示序列數據();
}
評論
查看更多