关于DC01/D01红外PM2.5传感器串口接收数据的STM32代码编写

先吐槽这家淘宝吧,问了客服只有文档,没有代码,看了网上的资料,没有这代码,一怒之下,拿起键盘CNM。最后还是老老实实写吧,也就一个串口中断接收程序,外加数据帧的完整接收。

直接贴主要代码!

u16 USART1_RxCounter = 0;
char USART1_RxBuff[1024];

volatile uint8_t ucTemp;            // 用于存储接收到的字节
volatile uint8_t u1_number = 0;     // 用于记录接收到的字节数量
volatile uint8_t DATAH = 0;         // 存储数据字节1
volatile uint8_t DATAL = 0;         // 存储数据字节2
volatile uint8_t CHECKSUM = 0;      // 存储校验字节


// 串口中断服务函数
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {

        ucTemp = USART_ReceiveData(USART1); // 读取接收到的数据

        if(u1_number == 0 && ucTemp == 0xA5) // 如果是第一个字节且为特征字节
        {
            u1_number++;
        }
        else if(u1_number > 0 && u1_number < 4) // 如果已经接收到特征字节,继续接收数据
        {
            if(u1_number == 1)
            {
                DATAH = ucTemp;     // 存储数据字节1
                u1_number++;
            }
            else if(u1_number == 2)
            {
                DATAL = ucTemp;     // 存储数据字节2
                u1_number++;
            }
            else if(u1_number == 3)
            {
                CHECKSUM = ucTemp;  // 存储校验字节

                uint8_t sum = 0xA5 + DATAH + DATAL; // 计算校验和
                sum = sum ^ 0x80  ; // ^ 异或,得到低7位数据

                if(sum != CHECKSUM) // 如果最高位为1,则校验失败  ^ 异或,得到低7位数据
                {
                    // 可以在这里添加错误处理代码
                    u1_number = 0; //从新计数
                }
                else
                {
                    // 校验成功,计算浓度值
                    uint16_t concentration = (DATAH << 7) | (DATAL & 0x7F);
                    // 这里可以添加代码将浓度值发送给其他模块或显示
                    PM2_5_val = concentration;
                }
                u1_number = 0; // 重置计数器,准备接收下一帧数据
            }
        }
        else
        {
            u1_number = 0;  // 如果接收到的数据不是特征字节,重置计数器
        }

        USART_SendData(USART1, ucTemp); // 回显接收到的数据
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成
    }
}

然后就是配置串口的中断等等,这个不重要,但凡学过的都会,按照你自己的来就好,我就不贴了。

通信协议:

测试

阿里云云端数据查看

可以看到数据正常显示

一段时间后

串口上位机数据查看,

一段时间后

数据正常读取。

代码完美运行!!!

注意:这个传感器是要通过穿孔的折射光等等判断PM值,请正确摆放传感器!

另外贴上该新款传感器的数据手册:(新)D01粉尘传感器说明书

使用Arduino控制DC01红外PM2.5传感器通常需要以下几个步骤: **硬件连接:** 1.DC01 PM2.5传感器连接到Arduino UNO或其他兼容板上。传感器一般有VCC(电源)、GND(接地)、数据线(数据读取)以及中断(有些型号会有,用于检测变化)。将数据线连接到Arduino的数字输入引脚,如A0、A1等。 2. Arduino的5V引脚接到传感器的VCC,GND引脚接到传感器的GND。 **软件代码:** ```cpp #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> // 如果你的传感器是BMP280或者BMP388,替换为对应的库 #include <Adafruit_DHT.h> #define DHT_PIN 4 // 这里假设PM2.5传感器的数据线连接到了D4引脚 Adafruit_BME280 bme; // 或者 Adafruit_DHT dht; void setup() { Serial.begin(9600); // 打开串口通信 if (dht.begin(DHT_PIN)) { // 初始化DHT传感器 Serial.println("DHT sensor connected."); } else { Serial.println("Failed to connect to DHT sensor"); while (1); } } void loop() { float pm25; // 保存PM2.5值 if (dht.read()) { // 读取PM2.5数据 pm25 = dht.pM25(); // 取得PM2.5浓度 Serial.print("PM2.5: "); Serial.print(pm25); Serial.println(" ug/m³"); } else { Serial.println("Failed to read PM2.5 data"); } delay(1000); // 每秒读取一次数据 } ``` 在这个示例中,我们假定DC01 PM2.5传感器是一个模拟输出设备,并使用了Adafruit库中的DHT类来获取PM2.5值。如果传感器支持数字I2C通信,你应该使用Adafruit_BME280类。记得根据实际硬件调整代码。 **注意事项:** - 确保已安装对应传感器的库,并根据传感器文档检查正确的连接方式。 - 有些传感器可能需要配合环境温湿度传感器一起使用,这里仅展示了PM2.5部分的代码
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桂北研猛男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值