本帖最后由 ifhl 于 2016-1-18 14:05 编辑
前段时间成都空气污染指数爆表,差点全国夺冠,就寻思弄一个PM2.5检测器测试。因听说激光的检测准些,就购买了一个激光的
通过万能的某宝搜索,发现这个东西(因本帖在单位发表的,没法照相,借用一张网上的图)
某宝上卖这个型号的挺多的,大家要做可以随便搜就出来了,我购买的这家是配置了usb转ttl模块,芯片是ch340g,可我路由器刷的明月永在的固件,无法安装编译好的ch340g驱动芯片。通过查看路由器驱动配置,发现该固件已经内置了pl2303的驱动,只好又购买了一个pl2303芯片的模块,6块多包邮,还不错。首先在电脑上测试检测模块,能正常使用后,连接至路由器。路由器上数据读取采用lua编程,因为lua都是内置了的,这样路由器需要安装的软件就少一些。代码中使用了luars232库,好像不是用也可以。
这个传感器的通讯协议为:
串口通讯协议:9600 8N1。(速率9600, 数据位8,校验位无,停止位1)
串口上报通讯周期:1+0.5秒
数据帧(10字节):报文头+指令号+数据(6字节)+校验和+报文尾
具体格式是这样的:数据: AA C0 01 02 03 04 05 06 07 AB
具体含义:
AA----报文头
C0----指令号,客户开发产品时,看到接收到有CO,即表示是由PM2.5传感器输出的信号
01----PM2.5低字节
02----PM2.5高字节
03----PM10低字
04----PM10高字节
05----保留位,暂未用,可以用做传感器的ID(在多台传感器同时使用时,以便于区分)
06----保留位,暂未用,可以用做传感器的ID(在多台传感器同时使用时,以便于区分)
07----校验和,(编的数据)
AB----报文尾
PM2.5数据内容:PM2.5(ug/m3) = ((PM2.5高字节*256) + PM2.5低字节)/10 PM10数据内容:PM10(ug/m3) = ((PM10高字节*256) + PM10低字节)/10
1.安装stty 配置串口(网上资料挺多的)
2.路由器,lua源码如下:
#! /usr/bin/lua
error=os.execute('mkdir /tmp/aqi')
rs232 = require("luars232")
port_name = "/dev/ttyUSB0"
e, p = rs232.open(port_name)
assert(p:set_baud_rate(rs232.RS232_BAUD_9600) == rs232.RS232_ERR_NOERROR)
timeout = 1000 -- in miliseconds
local total25=0
local total10=0
local i=0
local pm25,pm10,avg10,avg25,ss,s
p:flush()
while true do
error, data, read_len = p:read(3000 ,100)
--os.execute("usleep 1000000")
if (data ~= nil) then
--s=string.gsub(data,"(.)",function (x) return string.format("%02X ",string.byte(x)) end)
if (string.byte(data) == 170) then
--print("757")
ss=data
else
ss=ss..data
if ((string.byte(ss,-1) == 171) and (string.len(ss)==10)) then
--print(string.len(ss))
pm25= (string.byte(ss,3)+ string.byte(ss,4)*256)/10
pm10= (string.byte(ss,5)+ string.byte(ss,6)*256)/10
total25=total25+pm25
total10=total10+pm10
i=i+1
--print( os.date("%S", os.time()))
--print(i)
if (os.date("%S", os.time())=="00") then
timestr=os.date("%Y-%m-%d %H:%M:%S", os.time())
filename="/tmp/aqi/"..os.date("%Y%m%d%H", os.time())..".csv"
avg10=math.floor(total10/i+0.5)
avg25=math.floor(total25/i+0.5)
total25=0
total10=0
i=0
s=timestr..","..avg10.. ","..avg25.."\n"
--print(s)
--print(filename)
file = io.open(filename,"a")
assert(file)
file:write(s)
file:close()
file = io.open("/tmp/aqi/nowaqi.csv","w")
assert(file)
file:write(s)
file:close()
end
end
end
end
end
代码文件在这儿
打开putty 直接运行lua api.lua就可以了。
本段代码主要作用,循环读取usb串口,将读取导的数据转为10进制,然后每分钟取平均数后追加到tmp/aqi目录下以当前年月日小时为文件名的csv文件中,同时更新/tmp/aqi/nowaqi.csv文件为最新值。后期数据显示我采用的方式是,开启路由器的ftp服务器,然后在nas上用php读取路由器/tmp/aqi中的数据存入数据库,然后删除路由器上已经入库的数据,同时用hightcharts进行展示。这其中不使用路由器将数据实时上传至nas中的原因主要是为了减少nas硬盘的开启时间和次数。php和hightcharts代码都很简单,就不上传了。如确实有朋友需要,说一声,我再上传。
数据是实时的,每分钟自动更新,这也是nowaqi.csv文件的作用
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|