找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 4941|回复: 6

WNDR3800,openwrt系统usb连接PM2.5传感器分享

[复制链接]
发表于 2016-1-18 11:45 | 显示全部楼层 |阅读模式
本帖最后由 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文件的作用


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 2恩山币 +2 收起 理由
f0x + 1 城会玩
lazykid7 + 1 一看就是觉得高端、大气、上档次!

查看全部评分

发表于 2016-1-18 12:51 | 显示全部楼层
这个东西不错,很有意思。
不过PM2.5这个爆表的话,就有点当心了。

点评

高点出现在做饭的时间,最高那个点当时正在炒菜,油有点过热了,哈哈  详情 回复 发表于 2016-1-18 13:46
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-18 13:46 | 显示全部楼层
本帖最后由 ifhl 于 2016-1-18 13:56 编辑
wukaisky 发表于 2016-1-18 12:51
这个东西不错,很有意思。
不过PM2.5这个爆表的话,就有点当心了。

高点出现在做饭的时间,最高那个点当时正在炒菜,油有点过热了,哈哈,其他较高的点出现在老丈人抽烟的时候,最低点出现在凌晨4点左右
回复 支持 反对

使用道具 举报

发表于 2016-1-18 15:41 来自手机 | 显示全部楼层
楼主太强大了,狂顶!这两天用夏普二代加arduino也做了一个,还没有做数据记录和统计,发现数据跳动极大…

点评

那是红外线的,我这个是激光的,红外线的误差较大,同时需要经专门的校正后,才可使用,优点是便宜  发表于 2016-1-18 16:31
回复 支持 反对

使用道具 举报

发表于 2016-1-18 15:44 | 显示全部楼层
太强了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-6-8 20:10

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表