使用这个传感器模块,你也可以监测你身边的空气质量了

大家好,我是程序员小哈。

又到了知识分享时间,今天我给大家分享一个激光粉尘传感器模块,希望对你有所帮助。

ZH07粉尘传感器简介

ZH07 利用米氏散射原理,能够对空气中存在的粉尘颗粒物进行检测。通过专业算法和标定检测工艺处理,该传感器具有良好的一致性、稳定性。

传感器同时具备串口输出和 PWM 输出能力,方便使用,体积小,便于集成应用。

应用场景

  • 空气净化器
  • 新风系统
  • 空气质量监测
  • 便携仪表

管脚定义

硬件连接

ZH07的串口输出是TTL电平的串口输出,我们可以使用USB转TTL串口与之连接,借用串口助手进行调试,也可以使用单片机(比如STM32)的串口,与之交叉连接进行通信、数据解析,进而得到粉尘的浓度值。

使用串口进行通信,我们只需要连接传感器模块的 VDDGNDRXDTXD 四个引脚即可。

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

生成海报
点赞 0

程序员小哈

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

X-bot

X-bot 前言 这个项目是我在稚辉君的视频里面看见的,是一个完全开源的项目,而且对他来说是一个比较简单的项目,但对于我这种没有什么DIY经验的同学来说,还是有点难的,不过