智能家居DIY-空气质量检测篇-获取空气污染指数
前言
话说楼主终于升级当爸了,宝宝现在5个月了,宝宝出生的时候是冬天,正是魔都空气污染严重的时候,当时就想搞个自动开启空气净化器,由于种种原因一直没有时间搞,最近终于闲下来了这个事情终于提上议程了,现在是夏天,空气都还行,各种空气质量相关电子产品都打折,正是动手的好时机。
计划的主要功能有:
- 自动检测空气质量(pm2.5,Pm10)
- 自动检测温度,湿度,气压
- 定时上传空气质量数据到服务器,并通过手机App显示
- 当空气质量差的时候自动开启空气净化器并报警提示关窗
- 当空气质量净化完毕后自动关闭空气净化器
架构
计划使用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中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #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客户端即将推出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库