功能概述
温度检测(使用 DS18B20 数字温度传感器)。
阈值设置(通过按键调整高温和低温报警阈值)。
报警提示(通过蜂鸣器和 LED 进行声光报警)。
OLED 显示(实时显示当前温度及阈值)。
代码功能详解
视频展示

https://t.bilibili.com/1171874774393028625?share_source=pc_native

该代码实现了一个基于STM32的温控系统,通过DS18B20传感器监测环境温度,并根据预设的高低阈值控制外设(如LED 、蜂鸣器等)。以下是核心功能分解:

DS18B20温度监测与显示系统实现

硬件组件需求

  • DS18B20数字温度传感器
  • OLED显示屏(支持I2C/SPI通信)
  • 4个独立按键(Key1-Key4)
  • STM32微控制器(以GPIOA为例)
  • 蜂鸣器模块
  • LED指示灯(3个)
  • 加热/散热设备驱动电路

外设初始化配置

GPIO初始化

// 按键输入配置(假设接在GPIOB)
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

// 控制输出引脚(GPIOA)
GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

DS18B20初始化

void DS18B20_Init(void) {
    onewire_init(GPIOA, GPIO_PIN_0); // 假设数据线接PA0
    ds18b20_set_resolution(DS18B20_12BIT_RES);
}

温度采集与显示

温度数据处理

float read_temperature() {
    uint16_t temp = ds18b20_get_temp();
    return temp / 16.0; // 12位分辨率转换
}

void OLED_Display(float temp, int high, int low) {
    char buffer[20];
    sprintf(buffer, "Tem:%.1fC", temp);
    OLED_ShowString(0, 0, buffer);
    sprintf(buffer, "hig:%d.0C", high);
    OLED_ShowString(0, 2, buffer);
    sprintf(buffer, "low:%d.0C", low);
    OLED_ShowString(0, 4, buffer);
}

按键处理逻辑

防抖与阈值调整

uint8_t key_scan() {
    static uint8_t key_flag = 0;
    if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET && !key_flag) {
        key_flag = 1;
        return 1; // Key1
    }
    // 其他按键类似处理
    else if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_SET) {
        key_flag = 0;
    }
    return 0;
}

void adjust_threshold(int *high, int *low, uint8_t key) {
    switch(key) {
        case 1: *high += 5; break; // Key1
        case 2: *high -= 5; break; // Key2
        case 3: *low += 5;  break; // Key3
        case 4: *low -= 5;  break; // Key4
    }
}

温度控制逻辑

状态输出控制

void temperature_control(float temp, int high, int low) {
    if(temp < low) {
        // 加热模式
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7|GPIO_PIN_8, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // 蜂鸣器
    }
    else if(temp > high) {
        // 散热模式
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET);
    }
    else {
        // 正常模式
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7|GPIO_PIN_9, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
    }
}

主程序结构

int main() {
    // 初始化所有外设
    System_Init();
    int high_th = 50, low_th = 20;
    
    while(1) {
        float temp = read_temperature();
        OLED_Display(temp, high_th, low_th);
        
        uint8_t key = key_scan();
        if(key) adjust_threshold(&high_th, &low_th, key);
        
        temperature_control(temp, high_th, low_th);
        HAL_Delay(600); // 控制循环频率
    }
}

注意事项

  1. 实际温度值需根据DS18B20数据手册进行校准
  2. 高低阈值初始值建议通过宏定义配置
  3. 蜂鸣器报警持续时间可通过定时器控制
  4. 按键防抖可采用硬件电容或软件延时双重处理
  5. OLED显示需根据具体屏幕型号调整通信协议
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐