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