森林火灾是森林中常见的危害,对野生动物和环境造成很大危害。如果可以在森林地区部署一个强大的系统来检测火灾并提醒消防当局立即采取行动,则可以避免这种情况。在这个项目中,目的是建立一个使用物联网的森林火灾检测系统,该系统将检测火灾并通过物联网向当局发送紧急警报。在这里,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);
显示序列数据();
}
评论
查看更多