06
2019
05

WIFI作品DIY教程11-《烟雾火警》MQ-2烟雾/丙烷/天然气检测。

上篇WIFI作品DIY教程07-《wifi家居网关》家居控制中心zigbee/nrf24l01等完成了家居网关。


曾经我们在教程4有介绍过烟雾报警,但只是插到网关上的arduino,这篇我们单独出来,这样就可以安装到墙上了咯。





第一部分:MQ-2温度传感器介绍


MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

MQ-2气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。



上图是传感器的基本测试电路。该传感器需要施加2个电压:加热器电压(VH)和测试电压(VC)。其中 VH用于为传感 器提供特定的工作温度。VC 则是用于测定与传感器串联的负 载电阻(RL)上的电压(VRL)。这种传感器具有轻微的极性, VC需用直流电源。在满足传感器电性能要求的前提下,VC和VH 可以共用同一个电源电路。为更好利用传感器的 性能,需要 选择恰当的RL值



第二部分:下载编译源代码

1、CH340驱动

在drivers目录里找到CH340驱动,然后按说明安装(之前安装了就不用再安装了)。

2、源代码


001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 *NRF24l01针脚连接线
 * MISO -> 12
 * MOSI -> 11
 * SCK -> 13
 * Configurable:
 * CE -> 8
 * CSN -> 7
*/
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
 
int sid=1;//模块类型
int nid=5;//模块编号
 
//声名变量
int mq_2alarm=500;
 
const unsigned long interval = 1000;
unsigned long last_sent;
 
int mq_2val=0;
int mq_2_PIN=A5;
 
//NRF24l01
unsigned long nrf24l01nowlast;
char nrf24l01buff[33]={0};
char nrf24l01Data;
int nrf24l01i=0;
 
 
void setup()
{
    Serial.begin(115200);
 
    char client[10]={0};//client
    sprintf(client,"clie%d",sid);
    //初始化Mirf,用于NRF24l01收发
    Mirf_Init(0,client,sid);
    
     
    Serial.println("zwifi_mq_2_sensor");
}
  
void loop()
{
   
  unsigned long now = millis();
  if ( now - last_sent >= interval  )
  {
    last_sent = now;
     
    mq_2val=0;
     
    run_mq_2();
     
    if(mq_2val>mq_2alarm){    
      char data[10]={0}; 
      sprintf(data,"%d",mq_2val);  
      send_data(data);
    }
     
  }
   
   
}
 
//初始化Mirf 0初始化1为接收2为发送
void Mirf_Init(int txrx,char *server,int channel){
    //初始化Mirf,用于NRF24l01收发       
    if(txrx==0)  {    
      Mirf.spi = &MirfHardwareSpi;
      Mirf.init();
      Mirf.setRADDR((byte *)server);//设置接收地址
    }
     
    if(txrx==1)  {    
      Mirf.setRADDR((byte *)server);//设置接收地址
    }
    if(txrx==2)  {
      Mirf.setTADDR((byte *)server);//设置发送地址
    }
     
    Mirf.payload = sizeof(char);//收发字节
    Mirf.channel = channel;
    Mirf.config();
}
 
//NRF24l01发送函数
void Mirf_Send(int channel,char *server,char *str){
  Mirf_Init(2,server,channel);
  int bufi=0;
  for(bufi=0;bufi<strlen(str);bufi++){//循环发送
    char words=str[bufi];//发送的字符
    Mirf.send((byte *)&words);//发送命令
    while(Mirf.isSending()){//等待发送完闭
    }
    delay(50);//延时,否则可能出现发送丢失现象
    //Serial.print(words);
  }
  //Serial.println("");
}
 
 
 
 
 
void run_mq_2()
{   
    mq_2val=analogRead(mq_2_PIN);
    Serial.println(mq_2val,DEC);
    delay(100);
}
 
 
//
void send_data(char *data){
      
    char server[10]={0};//server
    sprintf(server,"serv%d",1);
    //Serial.println(server);
     
    char updateData[33]={0};
    char front[10]={0};
    //memcpy(front,body,9);
    sprintf(front," {ck%03d%03d",sid,nid);
    sprintf(updateData,"%s%s}",front,data);  
    Serial.println(updateData);
    Serial.println();
     
    Mirf_Send(1,server,updateData);
     
    char client[10]={0};//client
    sprintf(client,"clie%d",sid);
    Mirf_Init(1,client,sid); 
                 
}





3、串口通信运行后,打开arduino ide的串口监视。


再拿个打火机给他喷喷气体


或给他闻闻香烟。



在串口上看到上面的数据,说明成功了。



第三部分:测试通信和查看数据

打开:http://192.168.1.1/znck007/mysqltest.php?mode=select


点击查看数据库记录,001,005的记录,说明网关成功保存了记录。气体异常值等于data值,越大表示异常气体越浓



同时也可以用数据库软件Navicat for MySQL查看数据记录!


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。