2.【proteus仿真】基于STM32控制的温度报警器(免费代码+视频讲解)(DS18B20 数字温度传感器,OLED,蜂鸣器,按键调整高温和和 LED 进行声光报警)
·
功能概述
温度检测(使用 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); // 控制循环频率
}
}
注意事项
- 实际温度值需根据DS18B20数据手册进行校准
- 高低阈值初始值建议通过宏定义配置
- 蜂鸣器报警持续时间可通过定时器控制
- 按键防抖可采用硬件电容或软件延时双重处理
- OLED显示需根据具体屏幕型号调整通信协议
更多推荐
所有评论(0)