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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 12254|回复: 15
打印 上一主题 下一主题

WIFI作品DIY教程14-《空气质量》空气PM2.5检测家里雾霾。

  [复制链接]

110

主题

396

帖子

2329

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2329
QQ
跳转到指定楼层
楼主
发表于 2015-2-13 10:14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上篇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}发送到网关保存数据,供我们以后分析。



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




未写完。








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

0

主题

10

帖子

60

积分

注册会员

Rank: 2

积分
60
沙发
发表于 2015-3-10 12:38:22 | 只看该作者
我在等这个模块
回复 支持 反对

使用道具 举报

0

主题

29

帖子

92

积分

注册会员

Rank: 2

积分
92
板凳
发表于 2015-5-21 10:22:24 | 只看该作者
本帖最后由 创客帝国 于 2015-7-23 20:11 编辑

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










回复 支持 反对

使用道具 举报

1

主题

34

帖子

149

积分

注册会员

Rank: 2

积分
149
地板
发表于 2015-9-19 13:46:51 | 只看该作者

强强强~~,太好了,谢谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

15

积分

新手上路

Rank: 1

积分
15
5#
发表于 2015-9-24 11:02:43 | 只看该作者
不错啊! 一个字牛啊!
回复 支持 反对

使用道具 举报

0

主题

22

帖子

77

积分

注册会员

Rank: 2

积分
77
6#
发表于 2015-10-6 11:19:37 | 只看该作者
努力学习中
回复 支持 反对

使用道具 举报

0

主题

5

帖子

38

积分

禁止发言

积分
38
7#
发表于 2015-10-11 06:49:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

24

帖子

80

积分

注册会员

Rank: 2

积分
80
8#
发表于 2015-12-15 13:31:55 来自手机 | 只看该作者
第二个问题就不用回答了!你懂得!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

12

积分

新手上路

Rank: 1

积分
12
9#
发表于 2016-1-14 15:22:28 | 只看该作者
LZ怎么没写完呢
回复 支持 反对

使用道具 举报

0

主题

26

帖子

82

积分

注册会员

Rank: 2

积分
82
10#
发表于 2016-2-29 15:17:03 | 只看该作者
这个挺好实际意义的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|手机版|智能创客 ( 桂ICP备14000828号

GMT+8, 2024-4-20 09:06 , Processed in 0.126924 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表