前面想用opi zero
做航模的图传和遥控接收,但是太重了(26g),另外电流也很大idle时都有150ma,试了下wifi
的响应时间太慢,控制不好怕出事,年末将至也没有那么多时间去折腾了。但是一直以来了想能实时监测室内空气质量。感谢elecfans
提供给我这么一个机会,
zero
有
wifi
,这样可以在室内移动串口和
gpio
数量也比较合适。
用的PM2.5
传感器是很早以前买的夏普的
灰尘传感器GP2Y1010AU0F
自己用stm8f103
处理数据然后用串口发送,甲醛和
voc
传感器用的是淘宝上的
10
多元的传感器,也是串口发送数据。因为没有查到
opi zero的ADC
怎么用,好像
GPIO
也没有标出有
ADC
,但是
zero
除了调试
uart
外还有两个
uart
,所以决定直接用
uart
来读取数据,然后发送到家用的
nas
上去。还有一块
USART
的显示屏,因为甲醛和
PM2.5
的传感器只是用串口的发送数据,不接收数据,串口的显示屏只需接收显示数据,所以尽管
3
个串口设备,串口还是够用的。连好线。甲醛传感器接在串口
2
上,
Pm2.5
传感器和
串口的显示屏接在串口1
上(分别用刀串口1
的
RX,TX)。还是用python
,因为代码量少,实时性要求不高。
考虑到传感器的寿命,不一直测量,而是30
分钟测量一次,但是为了有时可以手动实时测量,需要有个按键,一旦按下,立刻测量,所以在主程序里面,一直读取PA10的电位,一旦PA10是高电位,就立刻读取数据(用gpio
控制
mos
管立刻给传感器通电因为放假没发作板子),测量时zero的status led
发光,测量完了后
status led
熄灭。
主程序
def control():
button=port.PA10
status_led=port.STATUS_LED
start_status=False
gpio.init()
gpio.setcfg(status_led, gpio.OUTPUT)
gpio.setcfg(button, gpio.INPUT) #配置button gpio为输入
gpio.pullup(button, gpio.PULLDOWN) #
配置下拉电阻,如果想一直测量配置上拉电阻PULLUP。
gpio.output(status_led,0) #初始化status led熄灭
max_sleep_
time=1800 #max halt time 30min
测量
30min
一次
sleep_time=0
while True:
state = gpio.input(button)
print "start_status:",start_status
print "button status:",state
if state: #
如果手动按下按钮那么应该要立刻的量
if not start_status: #
如果没有测量,那么立刻测量,如果在测量,那不操作
start_status=True
gpio.output(status_led,1)
Run() #运行测量函数,每个传感器测量时读取10
组数据。取平均值
start_status=False
gpio.output(status_led,0)
sleep(2)
sleep_time+=2
if sleep_time>max_sleep_time:#
每
30
分钟测量一次。数据发送到
NAS
state=1
sleep_time=0
Run()函数里面开了两个线程读取传感器数据,读取的数据通过全局变量传递回来。测量的时候读取10
组有效数据,取平均值,然后用通过网络发送家用
NAS
上面去,并且同时在串口屏幕上显示。在NAS
上的
UDP
服务端程序接收到数据后判断数据类型,把接收数据时间和数据存入相应文件。查看
NAS
上接受的数据采用
BS
模式,网页每两秒自动刷新一次。
所有程序都在下面附件,因为在armbian
下中文注释会出错,所以没有注释了。程序逻辑很简单。
两个传感器特写
下面是连接图片,连线比较乱。图片里面zero比较拗小,在屏幕和传感器之间。
、
测量的结果,今天本地天气比较好气象局的是在50,自己测的室外是在71。
nas记录的数据。甲醛的数据有误差,因为传感器对有机物也敏感,这个数据还算是正常的。PM2.5数据和甲醛数据比较小的数据是在家里新风口测得的。
|