智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

标题: WIFI作品DIY教程14-《空气质量》空气PM2.5检测家里雾霾。 [打印本页]

作者: znck007    时间: 2015-2-13 10:14
标题: WIFI作品DIY教程14-《空气质量》空气PM2.5检测家里雾霾。
上篇WIFI作品DIY教程07-《wifi家居网关》家居控制中心zigbee/nrf24l01等完成了家居网关。



日益严重的空气污染深入了中国各大地,我们在家里也可以检测pm2.5那么也是赶上时代的变化了。


我们需要的配件:粉尘传感器板GP2Y1010AU0Fnrf24l01(或zigbee等)


第一部分:GP2Y101AUOF传感器介绍









空气质量指数  空气质量指数级别
0-50      = 一级  优
51-100  = 二级  良
101-150 = 三极  轻度污染
151-200 = 四级  中度污染
201-300 = 五级  重度污染
>300       = 六级  严重污染

使用GP2Y1010AU0F灰尘传感器检测空气质量
GP2Y1010AU0F灰尘传感器价格较便宜,能检测出室内空气中的灰尘和烟尘含量.

检测原理
其原理如下图,传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。








第二部分:下载编译源代码
1、安装CH340驱动

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


2、源代码
[C] 纯文本查看 复制代码

/*
*NRF24l01针脚连接线
* MISO -> 12
* MOSI -> 11
* SCK -> 13
* Configurable:
* CE -> 8
* CSN -> 7

*ZIGBEE针脚连接线
TX -> RXD
RX -> TXD

*GP2Y1050AU灰尘传感器针脚连接线
GND -> GND
VCC -> VCC
NC
NC
RXD  -> A1
TXD  -> A0
*/
#include <SPI.h> //引用SPI库文件
#include <Mirf.h> //引用Mirf库文件
#include <nRF24L01.h> //引用NRF24L01库文件
#include <MirfHardwareSpiDriver.h> //引用Mirf驱动库文件
#include <SoftwareSerial.h> //引用软串口库文件

int sid=1;//模块类型
int nid=3;//模块编号

//声名变量
const unsigned long interval = 60000;//时间间隔
unsigned long last_sent;//最后发送时间


SoftwareSerial mySerial(A0, A1); //定义软串口,对应RX,TX

float pm25=0.00;//声明pm2.5变量
int incomeByte[6];//声明pm2.5字节
int data;//当前数据
int z=0;//当前字符数
int sum;//数据总和
unsigned long error;//错误


//NRF24L01
unsigned long nrf24l01nowlast; //NRF24L01检测间隔时间
char nrf24l01buff[33]={0}; //NRF24L01缓存字符
char nrf24l01Data; //NRF24L01单个字符
int nrf24l01i=0; //NRF24L01字符数


void setup()
{
    Serial.begin(115200); //设置串口波特率115200

    //初始化Mirf,用于NRF24L01收发
    char client[10]={0}; //客户端名称
    sprintf(client,"clie%d",sid); //设置客户端名称
    Mirf_Init(0,client,sid); //初始化NRF24L01收发      
        
    mySerial.begin(2400);//设置软串口的波特率
   
    Serial.println("zwifi_pm25");//打印
}

void loop()
{
  
  unsigned long now = millis();//获取现在的时间
  if ( now - last_sent >= interval  ) //如果超过时间间隔
  {
    last_sent = now;//保存到最后时间
   
    pm25=0.00;//初始化0
    run_pm25();//调用函数pm2.5获取数据
    if(pm25>0){//如果pm2.5大于0
      char pmstr[10]={0};//声明字符
      dtostrf(pm25,4,2,pmstr);//格式化字符
      
      char data[10]={0};//声明数据字符
      sprintf(data,"%s",pmstr);//格式化字符
      send_data(data);//调用函数发送数据到网关
      
    }
   
  }
  
  
}

//初始化Mirf 0初始化1为接收2为发送
void Mirf_Init(int txrx,char *server,int channel){
    //初始化Mirf        
    if(txrx==0)  {
      Mirf.spi = &MirfHardwareSpi;//设置spi
      Mirf.init();//初始Mirf
      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("");
}



//获取pm2.5传感器的数据函数
void run_pm25()
{
    while (mySerial.available()){//如果软串口存在数据
  
       data=mySerial.read();//读取软串口数据
       if(data == 170){//如果数据是170则是开始
         z=0;//当前字符数
         incomeByte[z]=data;//保存到当前字节
       }else{//如果不是开始
         z++;//当前字符数+1
         incomeByte[z]=data;//保存到当前字节
       }
       if(z==6)//如果满6个字符
       {
            sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4];//字节数相加,为了效验数据
        
            if(incomeByte[5]==sum && incomeByte[6]==255 )//效验数据格式
            {
               Serial.print("Data OK! ");
               Serial.print(" | Vo=");
               float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00;//计算pm2.5算法
               Serial.print(vo,2);
               Serial.print("V  ");
               float v1=analogRead(A0)/1024.0*5.00;
               Serial.print("/ Ao=");
               Serial.print(v1,2);
               Serial.print("V  | ");
               float c=vo*200;
               pm25=c;//保存pm2.5变量
               Serial.print(c,2);
               Serial.print("ug/m3 | ");
               for(int k=0;k<7;k++)
                {
                  Serial.print(incomeByte[k]);//打印原始数据
                  Serial.print("|");
                 }
                 Serial.println();               
                 break;
             }else{
                 z=0;
                 Serial.flush();
                 data='/0';
                 for(int m=0;m<7;m++){incomeByte[m]=0;}
                 //error++;
                 //Serial.print(" ### This is ");
                 //Serial.print(error);
                 //Serial.println(" Error ###");
             }
             z=0;
       }
    }
}

//发送数据到网关的函数
void send_data(char *data){
     
    char server[10]={0};//声明网关接收名称
    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);//发送到串口(zigbee会发给网关)
    Serial.println();//换行
   
    Mirf_Send(1,server,updateData);//发送给NRF24L01(NRF24L01会发给网关)
   
    char client[10]={0};//声明客户端
    sprintf(client,"clie%d",sid);//赋值客户端名称
    Mirf_Init(1,client,sid);//设置为接收模式
               
}




刷写arduino程序选哪个板?
请选择板是Arduino Uno,并记得选对对应的串口。

刷写ardruino源代码时,提示库不存在?
请联系qq610854837下载zwifi资料,软件下载目录里的arduino-1.0.5,里面包含了教程使用的所有库。



将代码进行编译下载到arduino板上。


3、串口运行查看数据是否正常

在arduino软件里,查看串口数据,记得是115200哦,有如上图,说明下载运行成功了!

程序的原理就是获取传感器数据,然后组合成字符{ck00x00xnnnn}发送到网关保存数据,供我们以后分析。



第四部分:检测通信和数据库数据




未写完。









作者: 坏的刚刚好    时间: 2015-3-10 12:38
我在等这个模块
作者: 善旦景oebys    时间: 2015-5-21 10:22
本帖最后由 创客帝国 于 2015-7-23 20:11 编辑

非常高兴遇到这么好的帖子 谢谢











作者: yixian520    时间: 2015-9-19 13:46

强强强~~,太好了,谢谢
作者: 印刷df0921    时间: 2015-9-24 11:02
不错啊! 一个字牛啊!
作者: 洋芋炒土豆    时间: 2015-10-6 11:19
努力学习中
作者: {排水钢管}    时间: 2015-10-11 06:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: XXY    时间: 2015-12-15 13:31
第二个问题就不用回答了!你懂得!
作者: pollux_zy    时间: 2016-1-14 15:22
LZ怎么没写完呢
作者: jsyemaozi    时间: 2016-2-29 15:17
这个挺好实际意义的
作者: 楚风狂    时间: 2016-7-5 15:13
这个我有
作者: 恩儒鑫    时间: 2016-8-8 12:06
- -.......












某宝购买 视频教程 素材 软件 xiao视频 等资源  百度网盘免费下载   hao.wpan123.com
作者: 幼儿一班    时间: 2016-10-3 10:10
串口能接收到pm2.5的数据,网关工作正常,但是收不到pm2.5的数据
作者: 幼儿一班    时间: 2016-10-4 22:28
幼儿一班 发表于 2016-10-3 10:10
串口能接收到pm2.5的数据,网关工作正常,但是收不到pm2.5的数据

成功了,原来是用1.6.7编译的,现在换了一台新电脑用1.05重新编译就可以了
作者: 最终不相认g    时间: 2016-11-6 16:07
谢谢楼主啦~~~~













作者: 网络安全zu    时间: 2016-11-6 22:38
一楼的位置好啊..

















欢迎光临 智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想! (http://luntan.znck007.com/) Powered by Discuz! X3.2