前言

话说楼主终于升级当爸了,宝宝现在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. Java 堆内存模型

    堆内存 Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中.堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( Old ).新生代 ...

  2. IntelliJ IDEA 取消控制台行数限制

    在idea7之后的版本中取消了 控制台行数设置 选项,只能通过更改配置文件进行更改 在%安装目录%/bin中找到idea.properties文件,更改idea.cycle.buffer.size项值 ...

  3. 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  4. MySql中文乱码问题(3)

    MySql的client是在dos界面上,然而dos界面默认的字符集编码方式是:GBK (1).MySql字符转换原理图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi ...

  5. java中数组的复制

    数组复制使我们在编程过程中经常要使用到的,在java中数组复制我们大概能够分为两种,一种是引用复制,还有一种就是深度复制(复制后两个数组互不相干). 以下我们就通过測试的方法来具体看看什么是引用复制和 ...

  6. jQuery的AJax异步载入片段

    主要用到load()方法以及getScript()方法,详细以一个样例说明: 在现有html文件里载入一个拟好的片段,以及在片段载入完毕之前阻止用户进一步操作的弹出框. 首先是现有html代码.无不论 ...

  7. SQL语句练习手册--第二篇

    一.书到用时方恨少:"图书-读者-借阅"类题目 1.1 本题目的表结构 本题用到下面三个关系表: CARDS 借书卡. CNO 卡号,NAME 姓名,CLASS 班级 BOOKS ...

  8. eclipse显示包的层次关系

    如何在eclipse中显示包的层次关系呢?如下图所示

  9. 自定义HttpReqeust,解决request请求参数只能拿一次就失效的问题

    定义一个过滤器并实现如下方法 @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResp ...

  10. MySql RESTRICT CASCADE SET NULL

    主表,从表[MySql] //http://my.oschina.net/cart/blog/277624 空.RESTRICT.NO ACTION 删除:从表记录不存在时,主表才可以删除.删除从表, ...