前言

话说楼主终于升级当爸了,宝宝现在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\t%d\t%d\t%d\t%d\t%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客户端即将推出。

智能家居DIY-空气质量检测篇-获取空气污染指数的更多相关文章

  1. 智能家居DIY-空气质量检测篇-获取温度和湿度篇

    目录 智能家居DIY-空气质量检测篇-获取空气污染指数 前言 话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一 ...

  2. DIY 空气质量检测表

    DIY 空气质量检测表 前几天逛淘宝看到有空气颗粒物浓度测量的传感器,直接是 3.3V TTL 电压串口输出的,也不贵,也就 100 多一点.觉得挺好就买了个,这两天自己捣鼓了个小程序,搞了个软件界面 ...

  3. 智能家居实践(番外篇)—— 接入 HomeKit 实现用 Siri 控制家电

    转载:智能家居实践(番外篇)—— 接入 HomeKit 实现用 Siri 控制家电 前面我写了一个系列共三篇的智能家居实践,用的是 Amazon Echo 实现语音控制,但是 Amazon Echo ...

  4. 智能家居DIY

    近期智能家居比較火,将房子简单改造下,也算体验智能家居. 本文解说的是用无线的方式,长处是:不用改造现有线路,直接安装模块就可以实现想要的功能,花的钱也较少,共六百左右 =============== ...

  5. Arduino 各种模块篇 粉尘传感器 dust sensor 空气质量检测

    Testing a sensor from here. http://www.seeedstudio.com/wiki/Grove_-_Dust_Sensor It's a dust sensor. ...

  6. scrapy下载中间件结合selenium抓取全国空气质量检测数据

    1.所需知识补充 1.下载中间件常用函数 process_request(self, request, spider): 当每个request通过下载中间件是,该方法被调用 process_reque ...

  7. 从零开始 DIY 智能家居 - 智能开窗器

    前言 做完智慧浇水器之后对这种可以节省时间和精力的场景总有一种谜之向往(懒鬼是这样的),这次我准备做一个可以自动开窗的装置,结合之前的甲醛检测传感器就可以实现甲醛含量过高自动开窗通风,之后还可以把燃气 ...

  8. 基于Laravel+Swoole开发智能家居后端

    基于Laravel+Swoole开发智能家居后端 在上一篇<Laravel如何优雅的使用Swoole>中我已经大概谈到了Laravel结合Swoole的用法. 今天,我参与的智能家居项目基 ...

  9. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...

随机推荐

  1. 2017.7.25 jqGrid在编辑态无法获取数据,得到的是html代码

    页面如下: 勾选555之后,点击下方的删除按钮,调用如下代码: 最终调用的是jqGrid的getRowData()方法: 但是运行时发现,无法获取key的值,也就无法正确删除了.获取到的是html代码 ...

  2. [Tips + Javascript] Make a unique array

    To make an array uniqued, we can use Set() from Javascript. const ary = ["a", "b" ...

  3. Android经常使用UI组件 - Button

    button(Button)是Android其中一个经常使用的UI组件.非常小可是在开发中最经常使用到.一般通过与监听器结合使用.从而触发一些特定事件. Button继承了TextView.它的功能就 ...

  4. Sending SMS And Dialing Numbers without User Consent(Context is not needed)

    Sending SMS And Dialing Numbers without User Consent Sending SMS does not require context or user in ...

  5. STL源代码剖析 容器 stl_list.h

    本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie list ----------------------------------------- ...

  6. java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z解决方法

    执行JavaEE项目时出现例如以下错误: java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z a ...

  7. 1通过URL对象的openStream()方法能够得到指定资源的输入流。

    通过URL读取网页内容     1通过URL对象的openStream()方法能够得到指定资源的输入流.     2通过输入流能够读取.訪问网络上的数据.     案例: import java.io ...

  8. 【Excle数据透视表】如何利用图标集将销售数据划分为五个等级

    我们如何用图标集来直观看出订单情况呢? 现在有数据如下: 步骤 选中"订单列"→开始→条件格式→图标集→等级→ 此时,在每个数字前面都出现了一个等级符号了 查看预置五等级图标集的规 ...

  9. java 字符深入知识,待整理

    '编',"编",  为什么获取到的字节数组长度不一样 http://www.cnblogs.com/yongdaimi/p/5899328.html Unicode 官网 http ...

  10. c语言字符串赋值

    char *p="asdf";能运行 定义一个字符指针,并用它指向常量字符串"asdf"的首地址 char *p;p="asdf"; 能运行 ...