利用支持MicroPython的TPYBoard开发板自制PM2.5检测仪(萝卜教育学科式编程)
2019独角兽企业重金招聘Python工程师标准>>>
秋冬季节,雾霾天气的持续,让人们对空气质量的关注程度提升。而近期人们对于空气质量的关注总也绕不开一个词——“PM2.5”。《环境空气质量标准》将PM2.5、臭氧(8小时浓度)纳入常规空气质量评价,是我国首次制定关于PM2.5的监测标准。细颗粒物又称细粒、细颗粒、PM2.5.细颗粒物指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物。PM2.5粒径小、面积大、活性强、易附带有毒、有害物质(例如,重金属、微生物等)。PM2.5对人体健康有着致命的危害。萝卜教育学科式编程tpyboard。com
那么PM2.5(细颗粒物)是什么?
因为各国标准不一样,天气预报也报空气质量,预报的空气质量与实际的空气质量一样吗?但这个问题,想动手制作一个PM2.5检测仪,有了自己动手制作的PM2.5检测仪的话,当空气质量较差或者严重污染的时候,提醒家人,同学和身边的人尽量减少户外活动,真正减少吸入细颗粒物。
制作一个PM2.5检测仪的想法是好,在1个小时内能否制作出一个PM2.5检测仪呢?利用C/C++是贴近硬件的语言来做的话,要花好长一段时间甚至半年先学习C语言以后,再考虑动手制作,更不用说1个小时内制作出一个PM2.5检测仪。
接下来我介绍一个在1个小时内制作一个PM2.5的方法,也就是利用拥有自家的解析器、编译器、虚拟机和类库等,也就是具备二次开发和环境的TPYBoard开发板制作一个PM2.5检测仪吧。萝卜教育学科式编程tpyboard。com
1. PM2.5检测仪的目的
采用TPYBoard开发板为控制处理器,通过串口由PM2.5灰尘传感器GP2Y1010AU0F检测低程度的空气污染PM2.5能够甄别香烟和室内/室外灰尘,并通过SPI接口由LCD5110显示屏显示当前空气粉尘浓度(ug/m?)。当空气中粉尘浓度达到所设定限度点亮不同的LED灯来知道当前空气质量等级。
本系统电路简单、工作稳定、集成度高,调试方便,测试精度高,具有一定的实用价值。该检测仪通过Python脚本语言实现硬件底层的访问和控制细颗粒物检测传感器,每间隔一定时间,传感器自动进行检测,检测到的空气粉尘浓度数据通过串口上传至主控板,主控板收集到数据后,同样使用Python脚本语言将PM2.5的检测结果显示到LCD5110上。萝卜教育学科式编程tpyboard。com
参照1:TPYBoardLED亮灯状态与 PM2.5日均浓度对应的指数等级对应表:
参照2: TPYBoard的硬件特点:
————————————————————————————
üSTM32F405RG MCU.
ü168 MHz Cortex-M4 CPU with 32-bit hardware floating point.
ü1 MiB flash storage, 192 KiB RAM.
üUSB口, 支持 串口,通用存储,HID协议。
üSD卡插槽。
üMMA76603轴加速度计.
ü4 LEDs, 1复位按钮, 1通用按钮.
ü3.3V0.3A板载 LDO , 可从USB口或者外置电池供电。
ü实时时钟。
ü30个通用IO口,其中28个支持5V输入输出。
ü2个 SPI接口, 2个 CAN接口, 2个I2C接口, 5个USART接口.
ü14个 12-bit ADC引脚。
ü2个DAC 引脚。
————————————————————————————
2. 材料准备
制作PM2.5检测仪所需材料如下:
1.PM2.5粉尘传感器1个,检测PM2.5(细颗粒物)传感器,TXD串口输出。
2.TPYBoard开发板1块,主要用来当主控开发板,读入传感器数据。
3.Lcd5110显示屏1个,主要用来显示检测的信息。
4.杜邦线若干。
5.数据线一条。
3.硬件接线方法
3.1 传感器的针脚
传感器上一共六根线,从1到6依次是GND,VCC,NC,NC,RX,TX。其中我们只用三根线,电源(GND,VCC)和串口(TX),传感器与TPYBorad接线参照图1,具体用哪个串口请参照官方网站上文档TPYBoard 关于串口的使用,小编用的串口为 UART(2) is on: (TX, RX) = (X3, X4) = (PA2, PA3),因为只需要将数据传到PTYBoard,所以只用到RED即PTYBoard的X4引脚。萝卜教育学科式编程tpyboard。com
3.2 LCD5110的针脚
先看一下LCD5110针脚含义吧(注意:LCD5110的针脚有些不一样的
TPYBoard的针脚与5110的针脚对应关系如图2:
TPYBoard?????? LCD5110??? memo
————————————————————————————
# any ? Pin???? => RST?????? Reset pin (0=reset, 1=normal)
# any ? Pin???? => CE??????? Chip Enable (0=listen for input, ? 1=ignore input)
# any ? Pin???? => DC??????? Data/Command (0=commands, 1=data)
# MOSI? ??????=> DIN?????? data flow (Master out, Slave in)
# SCK????????=> CLK?????? SPI clock
# 3V3 or any Pin ? => VCC?????? 3.3V logic voltage (0=off, 1=on)
# any Pin????? => LIGHT???? Light (0=on, 1=off)
# GND????????=> GND
还是看不明白的话,直接上针脚编号吧
TPYBoard?????? LCD5110??? memo
————————————————————————————
Y10??????? => RST?????? Reset pin (0=reset, 1=normal)
Y11??????? => CE??????? Chip Enable (0=listen for input, 1=ignore input)
Y9 ???????? => DC??????? Data/Command (0=commands, 1=data)
X8??????? ? => DIN?????? data flow (Master out, Slave in)
X6 ???????? => CLK?????? SPI clock
VCC
Y12??????? => LIGHT???? Light (0=on, 1=off)
GND
3.3 PM2.5检测仪整体接线方法
按照图1、图2所示将PM2.5粉尘传感器以及5110显示屏与PTYBoard连接起来,硬件连接完毕,如图3:
4.PM2.5粉尘传感器工作原理及数据处理
4.1 PM2.5粉尘传感器工作原理
PM2.5粉尘传感器的工作原理是根据光的散射原理来开发的,微粒和分子在光的照射下会产生光的散射现象,与此同时,还吸收部分照射光的能量。萝卜教育学科式编程tpyboard。com
当一束平行单色光入射到被测颗粒场时,会受到颗粒周围散射和吸收的影响,光强将被衰减。如此一来便可求得入射光通过待测浓度场的相对衰减率。而相对衰减率的大小基本上能线性反应待测场灰尘的相对浓度。光强的大小和经光电转换的电信号强弱成正比,通过测得电信号就可以求得相对衰减率,进而就可以测定待测场里灰尘的浓度。在传感器的中间有一个洞,这个洞可以让空气在里面流通。在洞的两个边缘 ,一面安装有一个激光发射qi,另一面安装有激光接收器。这样一来,空气流过这个小洞,空气里的颗粒物呢就会挡住激光,从而产生散射,另一面的接收器,是依据接收到的激光强度来发出不同的信号的(其实就是输出不同的电压值)。这样一来,空气里的颗粒物越多,输出的电压越高,颗粒物越少,输出的电压越低。萝卜教育学科式编程tpyboard。com
内部结构如图内部结构仿真图所示:
4.2 PM2.5粉尘传感器传感器数据处理
上面说了传感器的原理,接下来就说说它传出来的信号和对于接收到的信号的计算吧。
这个传感器的输出数据是靠串口进行传输的,传感器会通过串口每10ms不到(一般3~4ms)发送一个数据,数据的类型大致是个“0X00”这样的16进制的数据。每次的数据会以“0XAA”作为起始端,以“0XFF”作为结束端。共7个数据位,7个数据位中包含了起始位,结束位,数据高位,数据低位,数据高校验位,数据低校验位和校验位(校验位是怎样计算出来的,下面会讲到)。数据格式大致如下:
其中校验位长度=Vout(H)+Vout(L)+Vref(H)+Vref(L)的长度。
数据的组成一共是有7个数据位,但是只有Vout(H)和Vout(L)这两个数据才是我们真正所需要的。我们需要依照这两个数据算出来串口输出的数字数据,从而通过数模转换公式来计算出输出的电压。进一步的通过比例系数计算出空气中颗粒物的数量。下面来说一下怎么计算。
传感器输出的数据分为高位和低位,其中呢Vout(H)为高位,Vout(L)为低位。因为串口传进来的Vout(H)和Vout(L)是16进制的,第一步先转化成10进制的(这个大家都会,不多说了)。然后根据这两个输出值的10进制数计算出串口输出数值的电压。
公式如下(其中Vout(H)和Vout(L)是已转化为10进制的):
Vout=(Vout(H)*256+Vout(L))/1024*5
这样就算出来了他输出出来的电压了,再根据比例系数A,就可以计算出空气中的颗粒物的值了。(A的值一般是在800到1000,具体的数值还要根据你买到的传感器的精度,准确度和误差值进行确定。我现在用的是800。)
5.PM2.5粉尘传感器的采样频率及程序编码
5.1PM2.5粉尘传感器的采样频率
PM2.5粉尘传感器的采样频率是非常高的,一般3~4ms发送一个16进制的采样数据,也就是说传感器通电(接通VCC和GND)后,每隔3~4ms发送一个16进制的采样数据,这么高的采样频率作为一个检测仪来说显然是没有必要的。
TPYBoard通过串口接收粉尘传感器数据,使用串口当然先定义串口,通过打开就可以接收串口数据,关闭串口就停止接收数据的特点,来自由控制PM2.5粉尘传感器的采样频率。萝卜教育学科式编程tpyboard。com
5.2程序编码
我们main.py中,采用首先定义串口,其次是打开串口接收采样数据,最后关闭串口,并且处理采样数据及显示,依次循环。
6.运行测试
接线ok后,导入font.py文件和upcd8544.py文件(主要用于5110显示数据),再运行main.py即可看到当前的空气质量等级以及PM2.5的浓度值了。
7.源代码
把我写的程序的源码分享给大家,有需要的可以参考一下。
#main.py
import pyb
import upcd8544
from machine import SPI,Pin
from pyb import UART
from ubinascii import hexlify
from ubinascii import *#M0 = Pin('X1', Pin.OUT_PP)
i=0
K=1
T=0
E=0
F=0
W=0
P=0
L=0
SHUCHU=0
A=800#A比例系数,在北方一般使用800-1000.南方空气好一些,一般使用600-800.这个还和你使用的传感器灵敏度有关的,需要自己测试再定下来。
G=1024/5#G为固定系数,是为了把串口收到的数据转换成PM标准值。
SHI=0#后面会赋值转换成十进制的数值。
#*******************************主程序**********************************
#pyb.delay(5000)
SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
#DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
#CLK =>SPI(1).SCK 'X6' SPI clock
RST = pyb.Pin('Y10')
CE = pyb.Pin('Y11')
DC = pyb.Pin('Y9')
LIGHT = pyb.Pin('Y12')
while True:u2 = UART(2, 2400)pyb.delay(1000)#print('kaishi ')u2.deinit()pyb.delay(10)if(u2.any()>0):W=1_dataRead=u2.readall()#print('_dataRead=',_dataRead)R=0while (W>0):#print('截取开始')T=_dataRead[R]if(T==170):E=R+1F=R+2#R=_dataRead[65]#print('十位=',_dataRead[E])#print('个位=',_dataRead[F])W=0R=R+1P=_dataRead[E]L=_dataRead[F]SHI=P*256+L#把串口收到的十六进制数据转换成十进制。SHUCHU=SHI/G*Aif(SHUCHU<35):Quality = 'Excellente'print('环境质量:优','PM2.5=',SHUCHU)pyb.LED(1).off()pyb.LED(2).on()pyb.LED(3).off()pyb.LED(4).off()elif(35<SHUCHU<75):Quality = 'Good'print('环境质量:良好','PM2.5=',SHUCHU)pyb.LED(1).off()pyb.LED(2).on()pyb.LED(3).off()pyb.LED(4).off()elif(75<SHUCHU<115):Quality = 'Slightly-polluted'print('环境质量:轻度污染 ','PM2.5=',SHUCHU)pyb.LED(1).off()pyb.LED(2).off()pyb.LED(3).on()pyb.LED(4).off()elif(115<SHUCHU<150):Quality = 'Medium pollution'print('环境质量:中度污染 ','PM2.5=',SHUCHU)pyb.LED(1).off()pyb.LED(2).off()pyb.LED(3).on()pyb.LED(4).off()elif(150<SHUCHU<250):Quality = 'Heavy pollution'print('环境质量:重度污染 ','PM2.5=',SHUCHU)pyb.LED(1).on()pyb.LED(2).off()pyb.LED(3).off()pyb.LED(4).off()elif(250<SHUCHU):Quality = 'Serious pollution'print('环境质量:严重污染 ','PM2.5=',SHUCHU)pyb.LED(1).on()pyb.LED(2).off()pyb.LED(3).on()pyb.LED(4).off()lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)lcd_5110.lcd_write_string('AQI Level',0,0)lcd_5110.lcd_write_string(str(Quality),0,1)lcd_5110.lcd_write_string('PM2.5:',0,2)lcd_5110.lcd_write_string(str(SHUCHU),0,3)
转载于:https://my.oschina.net/micropython/blog/2996729
利用支持MicroPython的TPYBoard开发板自制PM2.5检测仪(萝卜教育学科式编程)相关推荐
- micropython教程nucleo-f767zi开发板_Micropython教程之TPYBoard开发板制作电子时钟(萝卜学科编程教育)...
1.实验目的 1. 学习在PC机系统中扩展简单I/O?接口的方法. 2. 什么是SPI接口. 3. 学习TPYBoard I2C接口的用法. 4. 学习LCD5110接线方法. 5. 设定时钟并将当前 ...
- Micropython教程之TPYBoard开发板驱动舵机教程(萝卜学科编程教育)
2019独角兽企业重金招聘Python工程师标准>>> 大家应该都看到过机器人的手臂啊腿脚啊什么的一抽一抽的在动弹吧...是不是和机械舞一样的有节奏,现在很多机器人模型里面的动力器件 ...
- 从MicroPython到TPYBoard 萝卜教育引领青少年学科式编程新标杆
2019独角兽企业重金招聘Python工程师标准>>> 2019年3月,教育部发布<2019年教育信息化和网络安全工作要点>,推动在中小学阶段设置人工智能相关课程,逐步推 ...
- python开发板卡驱动开发_一款能让你发挥无限创意的MicroPython开发板—TPYBoard开发板测...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 今天 静电袋包装,打开袋子简单明了:TPYBoard开发板一块.跳线帽一个.数据线一条.说明书一份.通过数据线将开发板与电脑连接就可以DIY各种你想要的P ...
- TPYBoard开发板搭建与阿里云服务发送数据
2019独角兽企业重金招聘Python工程师标准>>> 今天给大家带来的是TPYBoard V202开发板的一次测试项目使用心得.而测试项目就是给服务端发送硬件底层数据,而数据有产品 ...
- arduino温湿度计库文件_用ARDUINO开发板自制温湿度计(含WEMOS D1开发板环境安装)...
ARDUINO从入门到创客带师第四弹 自制温湿度计(翻车) 咱想起以前实验室的墙上挂着的介绍说过法拉第之所谓伟大的原因是他不止把成功的经历写在科学日记里,也把翻车失败的经历写进去,因此咱对于咱翻车的经 ...
- TPYBoard开发板带你轻松玩转MicroPython
2019独角兽企业重金招聘Python工程师标准>>> 说到MicroPython,也许有人会感到陌生.而说到和它密切相关的Python,是否会恍然大悟呢?Python属于解释型语言 ...
- android平板开发板,利用开源开发板自制的平板电脑 | 雷锋网
这款自制"平板电脑"主要部分是一块国产的开源开发板Mixtile(米太),外接一块TFT转接板装上7寸的触摸屏,配上两块亚克力(ACRYLIC)板做为设备的外壳(大家不要太在意整机 ...
- 开发板diy linux电脑,利用开源开发板自制的平板电脑
这款自制"平板电脑"主要部分是一块国产的开源开发板Mixtile(米太),外接一块TFT转接板装上7寸的触摸屏,配上两块亚克力(ACRYLIC)板做为设备的外壳(大家不要太在意整机 ...
最新文章
- 杨老师课堂_Java核心技术下之控制台模拟文件管理器案例
- matlab图像处理——分水岭法
- Qt Linguist 翻译
- POJ 2777 - Count Color(线段树区间更新+状态压缩)
- adafruit1306_Adafruit的2015年最佳开源可穿戴设备
- Java 设计模式之Facade门面模式
- HTML笔记——bootstrap-select、table、tableExport、layer
- 可持久化线段树(主席树)总结及板子
- Flume自定义文件命名格式(RollFileSink)
- 开机动画,铃声添加制作
- adb官方最新下载链接和常用操作
- 5分钟商学院-个人篇-谈判能力
- 配置WindowsMobile仿真器上网
- win10桌面计算机打不开,win10“此电脑”双击打不开,任何文件夹都打不开
- oracle自增序列创建
- html边框双箭头,CSS常用样式之绘制双箭头代码示例
- Unity3D中unitypackage文件的图标显示及打开方式异常问题的解决方法(值得收藏)
- 极限-快速判断变限积分的等价无穷小阶数
- 小孩上了半年小学,针对老师的评语总结,如何对症优化教育培养策略?chatGPT搜了一下,AI震惊了我
- 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛错题笔记
热门文章
- android listpreference 自定义,Android中Fragmen首选项使用自定义的ListPreference的方法
- Rsync学习之旅上
- 图像处理笔记(十八):模板匹配
- Redis Sentinel安装与部署,实现redis的高可用
- Wait Event Disk file operations I/O
- ntp-redhat 同步时间配置
- Selenium2+python自动化75-非input文件上传(SendKeys)
- VS2015新建项目无法选择framework 4.6.2
- MySQL DATE_ADD() 函数
- 修改默认共享内存tmpfs大小