2.【proteus仿真】基于STM32控制的温度报警器(免费代码+视频讲解)(DS18B20 数字温度传感器,OLED,蜂鸣器,按键调整高温和和 LED 进行声光报警)

张开发
2026/4/11 4:51:10 15 分钟阅读

分享文章

2.【proteus仿真】基于STM32控制的温度报警器(免费代码+视频讲解)(DS18B20 数字温度传感器,OLED,蜂鸣器,按键调整高温和和 LED 进行声光报警)
功能概述温度检测使用 DS18B20 数字温度传感器。阈值设置通过按键调整高温和低温报警阈值。报警提示通过蜂鸣器和 LED 进行声光报警。OLED 显示实时显示当前温度及阈值。代码功能详解视频展示https://t.bilibili.com/1171874774393028625?share_sourcepc_native该代码实现了一个基于STM32的温控系统通过DS18B20传感器监测环境温度并根据预设的高低阈值控制外设如LED 、蜂鸣器等。以下是核心功能分解DS18B20温度监测与显示系统实现硬件组件需求DS18B20数字温度传感器OLED显示屏支持I2C/SPI通信4个独立按键Key1-Key4STM32微控制器以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); // 控制循环频率 } }注意事项实际温度值需根据DS18B20数据手册进行校准高低阈值初始值建议通过宏定义配置蜂鸣器报警持续时间可通过定时器控制按键防抖可采用硬件电容或软件延时双重处理OLED显示需根据具体屏幕型号调整通信协议

更多文章