DC001红外PM2.5驱动代码(HAL库)
dc01模块HAL库驱动代码
·
1.声明
基本代码是根据下面链接的标准库代码,改成HAL库的形式。
关于DC01/D01红外PM2.5传感器串口接收数据的STM32代码编写_dc01传感器-CSDN博客
2.模块介绍
模块是在TB上面购买的,比原版的GP2Y1014AU便宜几块钱,但是驱动方式改了,是通过串口和MCU通讯接受数据。找卖家给资料,也只有一份规格书,要啥例程都没有。

这是模块的引脚定义

3.配置CUBEMX
我这边是使用了STM32F103C8T6作为主控,配置了UART3作为接受数据的串口,具体配置如下。
波特率改为9600,其他基本不用改

串口中断一定要勾上

4.具体代码
我这里是重写了串口的回调函数,当MCU串口接受到数据时,触发中断,进入串口回调函数,开始接收和存储数据。具体代码实现原理不多赘述,想了解的可以看这个链接的说明。

关于DC01/D01红外PM2.5传感器串口接收数据的STM32代码编写_dc01传感器-CSDN博客
uint8_t u1_number = 0;
uint8_t DATAH = 0;
uint8_t DATAL = 0;
uint8_t CHECKSUM = 0;
uint16_t PM2_5_val = 0;
uint8_t uart_rx_byte; // 接收缓冲区
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART3)
{
uint8_t ucTemp = uart_rx_byte;
/* 协议解析逻辑 */
if(u1_number == 0 && ucTemp == 0xA5)
{
u1_number++;
}
else if(u1_number > 0 && u1_number < 4)
{
if(u1_number == 1)
{
DATAH = ucTemp& 0x7F;
u1_number++;
}
else if(u1_number == 2)
{
DATAL = ucTemp& 0x7F;
u1_number++;
}
else if(u1_number == 3)
{
CHECKSUM = ucTemp;
uint8_t sum = (0xA5 + DATAH + DATAL) & 0x7F; // 取低7位
if(sum != CHECKSUM)
{
// 校验失败处理
u1_number = 0;
}
else
{
// 计算原始浓度值(修正拼接逻辑)
uint16_t raw_value = (DATAH << 7) | DATAL;
// 应用K值系数(关键步骤!)
PM2_5_val = (uint16_t)(raw_value * 0.4f);
}
u1_number = 0;
}
}
else
{
u1_number = 0;
}
/* 回显功能(非阻塞方式) */
// HAL_UART_Transmit_IT(&huart1, &ucTemp, 1);
/* 重新使能接收中断 */
HAL_UART_Receive_IT(&huart3, &uart_rx_byte, 1);
}
}
5.结束
最后,由于我也不是很专业,代码可能存在各种不合理性,仅供参考。我只是在使用该模块时遇到了坑,还找不到资料,现在搞定了想着拿出来分享一下。
更多推荐



所有评论(0)