zoukankan      html  css  js  c++  java
  • 智能家居DIY-空气质量检测篇-获取温度和湿度篇

    目录

    智能家居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,大家一起探讨。

    获取温度和湿度

    温度和湿度传感器使用的是 “AOSONG AM2320”, 这个传感器的特点是进度高,价格实惠

    硬件连接

    AM2320一共有4个接口,1接5v电源,2接ardunio的A4,3接地线,4接ardunio的A5

    连接电脑

    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口。

    下载AM2320 ardunio支持库

    https://github.com/Ten04031977/AM2320-master

    导入库到Ardunio IDE中

    ardunio IDE中点击项目-加载库-添加一个zip库,选择下载下来的zip文件即可

    编写代码

    打开上一次的文件或者新建一个文件,拷贝下面的代码到ardunio IDE中

    #include <Wire.h>
    #include <AM2320.h>
    
    #include <SoftwareSerial.h>
    
    SoftwareSerial pm25Serial(8, 9); // RX, TX
    
    AM2320 th; //新增
    
    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);
    
    //新增
    if(th.Read()==0) { Serial.print("humidity: "); Serial.print(th.h); Serial.print("%, temperature: "); Serial.print(th.t); Serial.println("*C"); } digitalWrite(13, LOW); //结束读取熄灯 } break; default: break; } } }

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

     

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


    强行插入硬广告

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

  • 相关阅读:
    Grid++Report 报表开发工具
    docker(1):virtualbox 安装CoreOS系统,配置registry-mirror
    [Network]Introduction and Basic concepts
    Java进程堆外内存(off heap)大小
    可设置指定时间自己主动消失的 MessageBox实现
    《iOS Human Interface Guidelines》——Wallet
    什么是OpenStack
    Filters.h各种信号恢复滤波器头文件
    Android时间轴效果,直接使用在你的项目中
    浅析C++多重继承
  • 原文地址:https://www.cnblogs.com/rockhawk/p/5638917.html
Copyright © 2011-2022 走看看