前面想用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数据和甲醛数据比较小的数据是在家里新风口测得的。 |