文章目录[隐藏]
大家好,我是程序员小哈。
又到了知识分享时间,今天我给大家分享一个激光粉尘传感器模块,希望对你有所帮助。
ZH07粉尘传感器简介
ZH07 利用米氏散射原理,能够对空气中存在的粉尘颗粒物进行检测。通过专业算法和标定检测工艺处理,该传感器具有良好的一致性、稳定性。
传感器同时具备串口输出和 PWM 输出能力,方便使用,体积小,便于集成应用。
应用场景
- 空气净化器
- 新风系统
- 空气质量监测
- 便携仪表
管脚定义
硬件连接
ZH07的串口输出是TTL电平的串口输出,我们可以使用USB转TTL串口与之连接,借用串口助手进行调试,也可以使用单片机(比如STM32)的串口,与之交叉连接进行通信、数据解析,进而得到粉尘的浓度值。
使用串口进行通信,我们只需要连接传感器模块的 VDD、GND、RXD和TXD 四个引脚即可。
ZH07与USB转TTL模块连接
USB转TTL端 | ZH07传感器端 |
---|---|
5V | VDD |
GND | GND |
TXD | RXD |
RXD | TXD |
ZH07与STM32连接
STM32端 | ZH07传感器端 |
---|---|
5V | VDD |
GND | GND |
U4T | RXD |
U4R | TXD |
串口通信
上面两种调试方法,都是使用ZH07的串口输出进行调试的,串口通信的相关参数如下:
名称 | 描述 |
---|---|
波特率 | 9600 |
数据位 | 8位 |
停止位 | 1位 |
校验位 | 无 |
ZH07传感器默认通信方式为主动上传,当硬件连线正确,按正确参数配置串口并打开之后,我们在串口助手中会收到传感器模块上传的数据,每隔一秒会主动上传32字节数据:
例如,收到的一帧传感器数据如下:
42 4D 00 1C 00 0B 00 0E 00 0F 00 0B 00 0E 00 0F 08 80 02 7B 00 72 00 0E 00 03 00 00 00 32 02 B5
主动上传协议各个字节的数据含义如下:
其中最后两个字节为校验值,校验值的计算方法是将前30个字节的数据加和,所得结果的16位数据即为校验值,存放顺序为高8位在前,低8位在后。
通过收到的传感器数据,我们可以得到PM1.0、PM2.5及PM10的值,以上面收到的数据为例,我们得到的传感器测量结果为:
PM1.0 测量结果 = 0x00 * 256 + 0x0B = 11 μg/m³;
PM2.5 测量结果 = 0x00 * 256 + 0x0E = 14 μg/m³;
PM10 测量结果 = 0x00 * 256 + 0x0F = 15 μg/m³;
注意:PM1.0、PM2.5、PM10 测量结果范围都为 0 ~ 1000 μg/m³。
问答式和主动上传模式切换
ZH07粉尘传感器模块,还可以切换上传数据的模式:
发送: FF 01 78 41 00 00 00 00 46
,设置成问答模式;
发送: FF 01 78 40 00 00 00 00 47
,设置成主动上传模式。
问答模式通讯指令
在问答模式下,发送: FF 01 86 00 00 00 00 00 79
,每发送一帧即可得到一帧传感器数据。
注意: 问答式数据帧的校验值计算方法跟主动上传数据帧的校验方法不同,问答式的校验和为发送(或接收)数据的第1(从0开始计数)字节到第7字节 加和,然后对结果的低8位进行 取反,加1 操作,结果即为校验值。
STM32解析ZH07粉尘传感器数据
要想实现STM32解析ZH07传感器的数据,首先我们要能正确、完整的获取一帧数据,由于主动上传模式每次上传的数据的字节数都是一样的,所以这里我们采用定长接收或者超时的方式,都可以正确地获取完整的一帧数据。
一帧数据获取到之后,我们就要对这一帧数据进行解析,解析的内容包括收到的数据长度是否是32字节、计算出来的校验值是否跟收到的校验值一致,还可以判断这一帧数据中,某些固定位是否跟协议预设一致,比如收到的前两个字节是否为:42 4D
,校验通过之后,我们就可以按照协议中规定的位置,将PM1.0、PM2.5、PM10的浓度值换算出来。
具体的校验过程如下所示:
if(USART4_RX_STA&0x8000)
{
uart4Len=USART4_RX_STA&0x3f; //得到此次接收到的数据长度
if(uart4Len==32)
{
nSum=0;
for(i=0;i<uart4Len-2;i++)
{
nSum+=USART4_RX_BUF[i];
}
if((nSum>>8)==USART4_RX_BUF[30] && (nSum&0x00FF)==USART4_RX_BUF[31])
{
nPM10=USART4_RX_BUF[10]*256+USART4_RX_BUF[11];
nPM25=USART4_RX_BUF[12]*256+USART4_RX_BUF[13];
nPM100=USART4_RX_BUF[14]*256+USART4_RX_BUF[15];
printf("PM1.0浓度为=%d μg/m3;PM2.5浓度为=%d μg/m3;PM10浓度为=%d μg/m3 。\r\n",nPM10,nPM25,nPM100);
}
else
{
printf("返回数据校验值错误 \r\n");
}
}
USART4_RX_STA=0;
memset(USART4_RX_BUF, 0, sizeof(USART4_RX_BUF)); //清空数组
}
源码获取
小哈哥 微信群 中提供本文实例的测试Demo,公众号后台回复:加群,获取小哈哥联系方式。
结果展示
注意: ZH07粉尘传感器还有PWM输出方式,PWM输出默认为3.3V TTL电平,通过计算一个输出周期中,高低电平的时间进而求得PM2.5的浓度,PWM输出仅能输出PM2.5数据。
总结
怎么样?有没有收获?可以文末留言交流一下哈,或者加小哈哥微信,我们群里聊。
好了,今天的文章内容到这里就结束了,希望对你有帮助,我们下一期见!~
欢迎加入
2022年抱团成长:小哈哥的小密圈,里面有更多技术解读和资料分享,让我们一起抱团学习、成长、交流、分享,更可以与小哈哥一对一交流,现在加入还有部分优惠名额。
版权声明:本文为CSDN博主「程序员小哈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/rsd102/article/details/122595400
暂无评论