• 智能家居DIY-空气质量检测篇-获取空气污染指数


    前言

    话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一直没有时间搞,最近终于闲下来了这个事情终于提上议程了,现在是夏天,空气都还行,各种空气质量相关电子产品都打折,正是动手的好时机。

    计划的主要功能有:

    1. 自动检测空气质量(pm2.5,Pm10)
    2. 自动检测温度,湿度,气压
    3. 定时上传空气质量数据到服务器,并通过手机App显示
    4. 当空气质量差的时候自动开启空气净化器并报警提示关窗
    5. 当空气质量净化完毕后自动关闭空气净化器

    架构

    计划使用ardunio连接空气质量传感器,温度,湿度,气压传感器,通过wifi模块通过http上传到服务器后台,服务器采用.net mvc架构。app使用网站提供的接口获取数据并显示

    计划使用的硬件有:

    Ardunio mini pro

    攀藤G5 空气质量传感器

    继电器

    温湿度传感器

    气压传感器

    WIFI模块

    电源模块

    有些朋友可能会问为啥用ardunio pro mini,主要有两个原因,一个便宜,一个性能够用。

    空气质量传感器使用攀藤的原因主要是该传感器市场反馈性能不错,经过试验确实性能不错,另外一个就是现在买便宜:-)

     电源模块为啥要用两个的原因是部分传感器使用3.3v电压,部分传感器使用5v电压,计划使用交流转5v模块获得5V点,然后5v电再接一个降压模块获得3.3v电

    我会用一系列的文章来记载我这次的DIY,有兴趣的朋友可以加我扣扣-1942916494,大家一起探讨。

    获取空气污染指数

    硬件连接

    首先连接攀藤G5传感器和ardunio,只要连3根线,vcc,gnd,把攀藤G5的tx线连到ardunio的D8口

    注意攀藤的vcc和gnd是紫色和黄色的不是红色和黑色

    攀藤的vcc和gnd是紫色和黄色的不是红色和黑色

    攀藤的vcc和gnd是紫色和黄色的不是红色和黑色

    重要的话说三遍,攀藤的tx是绿色的线,绿色的线接D8,理论上可以接任意一个数字口,不过不要接4,5,原因是arduino的i2c是通过这个两个数字接口,我们很多传感器都是用i2c来和ardunio来通讯,所以不要占用这两个口

    连接电脑

    ardunio mini pro需用FTDI-232连接电脑,连线 ardunio vcc - ftdi vcc, ardunio gnd - ftdi gnd, ardunio tx - ftdi rx, ardunio rx - ftdi tx, ardunio rst - ftdi rst

    如果已经用降压模块连接了ardunio的电源,不要接vcc和gnd,如果已经用降压模块连接了ardunio的电源,不要接vcc和gnd,如果已经用降压模块连接了ardunio的电源,不要接vcc和gnd

    接好后,把ftdi连接到电脑的usb上,如果是第一次连接会安装驱动,装好后,会虚拟出一个com口

    我的是com5

    编写代码

    使用官方IDE编写代码,下载地址:https://www.arduino.cc/en/Main/Software

    可以下载绿色版,解压缩就能用

    打开后界面是这样的

    点工具,开发板选择ardunio mini or ardunio mini pro,端口选择虚拟出来的那个com口。

    新建一个文件,拷贝下面的代码到ardunio IDE中

    #include <SoftwareSerial.h>
    
    SoftwareSerial pm25Serial(8, 9); // RX, TX
    
    struct _panteng {
      unsigned char len[2];
      unsigned char pm1_cf1[2];
      unsigned char pm2_5_cf1[2];
      unsigned char pm10_0_cf1[2];
      unsigned char pm1_0[2];
      unsigned char pm2_5[2];
      unsigned char pm10_0[2];
      unsigned char d[20];
    } panteng;
    
    float caiqarr[8]  = {0,50,100,150,200,300,400,500};
    float cpm10arr[8] = {0,50,150,250,350,420,500,600};
    float cpm25arr[8] = {0,35,75,115,150,250,350,500};
    
    int caculateAiq(float * aiqarr, float * contaminatarr,int val , int size)
    {
      int findidx = 1;
      for(int i=findidx;i<size;i++,findidx++)
      {
        if(contaminatarr[i] >= val)
          break;
      }
    
      if(findidx >= size)
        return (int)aiqarr[size - 1];
    
        float aiq  = (aiqarr[findidx]-aiqarr[findidx - 1]) / (contaminatarr[findidx] - contaminatarr[findidx - 1]) * (val - contaminatarr[findidx - 1]) + aiqarr[findidx - 1];
        return (int)aiq;
    }
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);        //USB串口向PC发送数据
      pm25Serial.begin(9600);        //软串口连接传感器
    
      pinMode(13, OUTPUT);//内置led
    
       digitalWrite(13, HIGH); 
       delay(1000);
        digitalWrite(13, LOW); 
        delay(1000);
          digitalWrite(13, HIGH); 
          delay(1000);
        digitalWrite(13, LOW); 
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
      unsigned char c;
      char str[100];
      static int state = 0;
      static int count = 0;
      static int time = 0;
      int pm1_0, pm2_5, pm10_0;        //PM1.0、PM2.5、PM10
      int i;
    
      while  (pm25Serial.available()) {
        c = pm25Serial.read();
    
        // say what you got:
        //Serial.print("I received: ");
        //Serial.println(c, DEC);
        //Serial.println("read");
        switch (state) {
          case 0:
            if (0x42 == c)
            {
              digitalWrite(13, HIGH); //开始读取亮灯
              state = 1;
            }
            break;
          case 1:
            if (0x4d == c) {
              state = 2;
              count = 0;
              //Serial.println(' ');
            }
            break;
          case 2:
            ((unsigned char *) &panteng)[count++] = c;
            sprintf(str, "%02X ", c);
    
            if (count > 28) {
              state = 0;
              pm1_0 = panteng.pm1_0[0] * 256 + panteng.pm1_0[1];
              pm2_5 = panteng.pm2_5[0] * 256 + panteng.pm2_5[1];
              pm10_0 = panteng.pm10_0[0] * 256 + panteng.pm10_0[1];
    
              int pm25aiq = caculateAiq(caiqarr,cpm25arr,pm2_5,8);
              int pm10aiq =  caculateAiq(caiqarr,cpm10arr,pm10_0,8);
              sprintf(str, "%d	%d	%d	%d	%d	%d", time++, pm1_0, pm2_5, pm10_0, pm25aiq, pm10aiq);
              Serial.println(str);
    
              snprintf(str, 16, "PM2.5=%d    ", pm2_5);
              digitalWrite(13, LOW); //结束读取熄灯
            }
            break;
          default:
            break;
        }
      }
    
    
    }
    

      

     点击上传,IDE会自动编译,并上传代码到ardunio中。

     

    上传完毕后,点击工具,串口监视器,在弹出的窗口中就可以看到当前的空气质量了


    强行插入硬广告

    http://www.51bilin.com/,比利牛汇聚全网优惠,为您网购省钱,自动采集当前各大电商最优惠的活动,购物前搜一搜,帮您省钱,提供Chrome插件,android客户端,iOS客户端即将推出。

  • 相关阅读:
    cf D. Vessels
    cf C. Hamburgers
    zoj 3758 Singles' Day
    zoj 3777 Problem Arrangement
    zoj 3778 Talented Chef
    hdu 5087 Revenge of LIS II
    zoj 3785 What day is that day?
    zoj 3787 Access System
    判断给定图是否存在合法拓扑排序
    树-堆结构练习——合并果子之哈夫曼树
  • 原文地址:https://www.cnblogs.com/rockhawk/p/5613682.html
Copyright © 2020-2023  润新知