JW01-CO2 UART通信——模拟二氧化碳(co2)监测模组CO2 气体传感器voc空气质量检测模块程序

co2.h

#ifndef __CO2_H
#define __CO2_H

#include "./SYSTEM/sys/sys.h"

void CO2_Init(uint32_t baudrate);
uint16_t CO2_Parse_Data(uint8_t* data);
void USART2_IRQHandler(void);
uint16_t CO2_Get_Concentration(void);

#endif

co.c

#include "./SYSTEM/sys/sys.h"
#include "./BSP/co2/co2.h"
#include "./SYSTEM/usart/usart.h"

#define USART2_RX_BUFFER_SIZE 256  // 接收缓冲区大小
#define CO2_DATA_LENGTH 6  // CO2数据包长度

UART_HandleTypeDef huart2;
uint8_t rx_Buffer[USART2_RX_BUFFER_SIZE];
uint16_t rxIndex = 0;
uint16_t co2_value;

UART_HandleTypeDef huart2;

void CO2_Init(uint32_t baudrate) {
    // 使能USART2和GPIOA时钟
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 配置GPIO
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // PA2作为TX
    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // PA3作为RX
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 配置UART
    huart2.Instance = USART2;
    huart2.Init.BaudRate = baudrate;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;

    // 初始化UART
    if (HAL_UART_Init(&huart2) != HAL_OK) {
        // 错误处理
        while(1);
    }

    // 配置NVIC
    HAL_NVIC_SetPriority(USART2_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);

    // 使能接收中断和空闲中断
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
}

uint16_t CO2_Parse_Data(uint8_t* data) {
//    if (data[0] != 0x2C) {
//        // 数据包头不匹配,返回错误值
//        return 0xFFFF;
//    }

    // 计算CO2浓度
    uint16_t co2_concentration = (data[1] << 8) | data[2];
    return co2_concentration;
}

void USART2_IRQHandler(void) {
    uint8_t received_byte;

    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET) {
        received_byte = (uint8_t)(huart2.Instance->DR & 0xFF);

        if (rxIndex < USART2_RX_BUFFER_SIZE) {
            rx_Buffer[rxIndex++] = received_byte;
        }

        // 检查是否接收到完整的数据包
        if (rxIndex >= CO2_DATA_LENGTH) {
            co2_value = CO2_Parse_Data(&rx_Buffer[rxIndex - CO2_DATA_LENGTH]);

            // 重置接收索引
            rxIndex = 0;
        }
    }

    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        // 处理空闲中断,如果需要的话
    }
}

// 获取最新的CO2浓度值
uint16_t CO2_Get_Concentration(void) {
    return co2_value; 
}

关注我

GitHub:https://github.com/PastKing

Gitee:https://gitee.com/past-dust

公众号:

图片[1]-JW01-CO2 UART通信——模拟二氧化碳(co2)监测模组CO2 气体传感器voc空气质量检测模块程序 - 昔尘源分享-昔尘源分享

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容