Arduino – 折腾(存档) https://blog.sorz.org 已停止更新和维护。该页面为2018年3月创建的存档,其内容可能已过于陈旧、与现状不符,仅作为历史存档用作参考。 Sun, 14 Jan 2018 11:08:20 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.9.4 室内空气监测 /p/air-mointor/ /p/air-mointor/#respond Sat, 28 Feb 2015 14:25:28 +0000 /?p=348022 GP2Y1010AU0F
左图[1] 是夏普的紧凑型光学灰尘密度传感器 GP2Y1010AU0F (PDF),淘宝三十元不到。

传感器内部有一个 LED,通过检测灰尘对光的反射的强度来估计空气中单位体积内灰尘的质量。
虽然因为无法区分灰尘颗粒的体积,无法直接推算出 PM2.5 数值,但我想它和 PM2.5 之间应该还是比较强的相关性的 来源请求

(嘛 30 块一个东西还是不要想太多比较好。

另一个传感器是 DHT22,淘宝大概 20 元一个。用于测量空气温度和湿度。

去年暑假我把这两个东西用了起来,监测室内空气状况并绘制图表然后显示在网页上。干嘛用?就是玩具,好玩嘛… 如果你也觉得有点意思,想搞个玩玩… 这篇文章也许可以用作参考。

事隔较久,一些细节记不太清了,可能会有些疏漏。相关代码在使用前记得改改文件名路径什么的。

读取传感器

这两传感器都不是面向一般用户的,没有 USB 这样方便的东西呢…
DHT22 是用一根线串行输入输出
GP2Y1010AU0F 输出的是模拟信号,要测量输出口的电压,根据电压来计算灰尘密度(如下图[2])。
电压——灰尘密度图示

DHT22 也许[3]能用 Cubieboard (山寨树莓派) 的 GPIO 来读取。
但 GP2Y1010AU0F 则需要测量电压(A/D),Cubieboard 不带此功能。

于是就用了 Arduino,先用它定时从传感器读取数据,然后通过串口(UART)发送给 Cubieboard
读取传感器的模块:DHT22.cpp DHT22.h, GP2Y1010AU0F.cpp GP2Y1010AU0F.h
每隔三秒读取一次两传感器,从串口输出 的 Arduino 代码:Sensors.ino

储存数据

数据通过 UART 传给了 Cubiebaord,接下来就是想怎么存怎么存啦。
这里按照传统来源请求用 RRDtool 来储存数据。简单方便[4]自带数据库顺带还能把画图给做了。

先用rrdtool create创建数据库:rrd-create.sh
别问我这些参数是啥意思,半年多过去了我早忘了(
RRDtool 也是挺坑的,参数多不说,写出来一点都不直观,不对手册根本不知道这都是些什么鬼(

arduino-uart.py 这个 Python 脚本将持续地从串口读取 Arduino 发来的数据,然后执行rrdtool update往数据库里喂数据。

呈现数据

使用rrdtool graph绘制折线图:graph.sh
./graph.sh 1d 绘制近一天的图像,./graph.sh 1w 绘制近一周的图像。
(输出和数据文件路径请修改开头的DIRDATA变量)

可以使用crontab -e或者 systemd-timer[5] 定时执行脚本更新图像。

再加个网页做索引:index.html
网页上方可选择查看近一天、一周、一个月的数据[6]。这样就基本完成啦。

完成

其实装好后我一直挺担心灰尘传感器的读数是否正确的,没法方法确认,读出来的 µg/cm³ 我也没啥概念。不过这幅大年三十的图看起来倒是挺像回事的:
灰尘折线图(图中数据单位有误,应为 µg/m³)

即使家里门窗紧闭,依然能看到中午一点和午夜的两条高峰。想必是受周边鞭炮燃放的影响吧。

附注

[1] 来源 iMall
[2] 来源 Datasheet PDF
[3] 我不太确定,因为 Cubieboard 的每一个 GPIO 口似乎只能在开机时设置为读或者写二选一,而 DHT22 的读写都在一根线上。也许能用两个 GPIO 口并加少许电路来实现?
[4] 好吧其实一点都不简单方便。
[5] systemd 用户请参考 Gist 中的.timer .service等文件。
[6] 需分别生成日、周、月的图片,参见 [4] 中的三个 .timer 文件。

]]>
/p/air-mointor/feed/ 0