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.结束

最后,由于我也不是很专业,代码可能存在各种不合理性,仅供参考。我只是在使用该模块时遇到了坑,还找不到资料,现在搞定了想着拿出来分享一下。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐