关于学年设计整个系统架构的我在第一篇博客已经发了,这里就不再说一遍了。
这次直接进入正题。
硬件:Arduino、433MHz无线射频模块、火焰传感器。
我在网上买的火焰传感器模块是直接数字输出的。如果仅仅只要读取和报警,直接读取然后判断就行了。但是这些机制都在死循环里面,也就是说不管有火没火,节点将一直死循环式的向网关发送报警。这是肯定不行的,网关又不是为你一个节点而存在的。所以我的思路是:如果环境从无火到有火,将报警标志置为1,如果环境从有火到无火,将报警标志置为0。然后去判断报警标志是什么,如果标志为1并且还没有将报警信息发送到到网关,则发送;否则也就是当前虽然标志为1但已经发送过了,这时候就不必再次发送了。解除报警的机制和报警的机制一样的思路。
后面还会有博客介绍其他节点以及整个系统。
下面是火焰传感器节点的代码:
#include<SoftwareSerial.h>
#define FirePin 8//定义火焰传感器引脚
SoftwareSerial HC_12(2,3);//软串口定义
char FireFlag;//报警标志
char MesFlag='0';//无线发送成功标志
void setup() {
Serial.begin(115200);
HC_12.begin(115200);
pinMode(FirePin, INPUT);
}
void loop() {
if (digitalRead(FirePin) == 1) {
delay(500);
if (digitalRead(FirePin) == 0) {//判断从没有火焰到有火焰
FireFlag = '1';
}
else{
FireFlag = '0';
}
}
while (FireFlag == '1' && MesFlag == '0') {//有火焰,且没有无线发送出去报警信息
Serial.println("FireDanger");
HC_12.print("{\"FireFlag\":\"1\"}");
MesFlag = '1';
}
while(FireFlag == '0' && MesFlag == '1'){//报警解除,且已经发送出去过报警信息
Serial.println("NoFireDanger");
HC_12.print(String("{\"FireFlag\":\"0\"}"));
MesFlag = '0';
}
}