安服优B-1红外测温传感器模块 驱动程序

if_temp.h

#ifndef __IF_TEMP_H
#define __IF_TEMP_H

#include "./SYSTEM/delay/delay.h"
#include <string.h>
#include "./SYSTEM/sys/sys.h"

void IR_Temp_Init(uint32_t baudrate);
float IR_Temp_Get_Temperature(void);
float get_temp(void);
void USART2_SendData(uint8_t data);
void USART2_SendString(uint8_t *data, uint16_t len);

#endif

if_temp.c

#include "./SYSTEM/sys/sys.h"
#include "./BSP/if_temp/if_temp.h"
#include "./SYSTEM/delay/delay.h"
#include <string.h>
#define USART2_RX_BUFFER_SIZE 256
#define TEMP_DATA_LENGTH 11
UART_HandleTypeDef huart2;
uint8_t rx_Buffer[USART2_RX_BUFFER_SIZE];
uint16_t rxIndex = 0;
float temperature = 0.0f;
uint8_t recv_data[TEMP_DATA_LENGTH];
volatile uint8_t reception_complete = 0;
void IR_Temp_Init(uint32_t baudrate) {
    // 使能USART2和GPIOA时钟
    __HAL_RCC_USART2_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    // 配置GPIO
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    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);
    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;
    if (HAL_UART_Init(&huart2) != HAL_OK) {
//        Error_Handler();
    }
    // 配置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);
        uint8_t init_cmd[] = {0xAA, 0xA5, 0x04, 0x05, 0x01, 0x0A, 0x55};
    USART2_SendString(init_cmd, sizeof(init_cmd));
        delay_ms(500);
        uint8_t temp_cmd[] = {0xAA, 0xA5, 0x04, 0x02, 0x02, 0x08, 0x55};
    USART2_SendString(temp_cmd, sizeof(temp_cmd));
}
void USART2_SendData(uint8_t data)
{
    while(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TXE) == RESET);
    huart2.Instance->DR = data;
}
void USART2_SendString(uint8_t *data, uint16_t len)
{
    for(uint16_t i = 0; i < len; i++)
    {
        USART2_SendData(data[i]);
    }
}
float get_temp(void)
{
    static float last_valid_temperature = 0.0f;  // 静态变量,保存最后一次有效的温度读数
    uint8_t send_data[] = {0xAA, 0xA5, 0x03, 0x01, 0x04, 0x55};
//    char debug_info[50];
    // 清空接收缓冲区和重置接收索引
    rxIndex = 0;
    memset(rx_Buffer, 0, USART2_RX_BUFFER_SIZE);
    reception_complete = 0;
    // 发送数据
    USART2_SendString(send_data, sizeof(send_data));

    // 等待接收完成或超时
    uint32_t timeout = HAL_GetTick() + 1000; // 1秒超时
    while (!reception_complete && HAL_GetTick() < timeout) {
        // 等待接收完成
    }
    if (reception_complete)

        // 解析温度数据
        if (rx_Buffer[0] == 0xAA && rx_Buffer[1] == 0xA5)
        {
            uint16_t temp_raw = (rx_Buffer[5] << 8) | rx_Buffer[6];
            float new_temperature = temp_raw / 10.0f;
            // 只有当新温度有效(大于0)时才更新 last_valid_temperature
            if (new_temperature > 0) {
                last_valid_temperature = new_temperature;

        }
        else
        {

        }
    }
    else
    {

    }
    return last_valid_temperature;  // 始终返回最后一次有效的温度读数
}
// USART2中断服务函数
void USART2_IRQHandler(void)
{
    uint8_t res;
    if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET)
    {
        res = (uint8_t)(huart2.Instance->DR & 0xFF);
        if(rxIndex < USART2_RX_BUFFER_SIZE - 1)
        {
            rx_Buffer[rxIndex++] = res;
            if (rxIndex >= 11) // 假设我们期望接收11个字节
            {
                reception_complete = 1;
            }
        }
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
    }
    // 处理空闲中断
    if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET)
    {
        __HAL_UART_CLEAR_IDLEFLAG(&huart2);
        reception_complete = 1;  // 标记接收完成
    }
    // 处理溢出错误
    if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) != RESET)
    {
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_ORE);
        res = huart2.Instance->DR;  // 读取DR寄存器清除错误标志
    }
}

关注我

GitHub:https://github.com/PastKing

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

公众号:

图片[1]-安服优B-1红外测温传感器模块 驱动程序 - 昔尘源分享-昔尘源分享

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

昵称

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

    暂无评论内容