news 2026/6/6 9:50:56

STM32F103C8T6 + DS18B20 + 0.96寸OLED:手把手教你做一个带报警功能的桌面温度计(附源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F103C8T6 + DS18B20 + 0.96寸OLED:手把手教你做一个带报警功能的桌面温度计(附源码)

STM32F103C8T6与DS18B20打造智能温度监测系统:从硬件搭建到报警逻辑实现

在创客圈子里,温度监测项目一直是最受欢迎的入门实践之一。它既能帮助初学者理解嵌入式系统的基本工作原理,又能通过实际可见的温度变化增强学习成就感。本文将带你使用STM32F103C8T6这款性价比极高的MCU,配合DS18B20温度传感器和0.96寸OLED屏幕,构建一个功能完整的智能温度监测系统。不同于简单的温度显示,我们还将实现可配置的温度报警功能,让这个小项目具备真正的实用价值。

1. 硬件选型与连接方案

1.1 核心组件介绍

STM32F103C8T6作为本项目的控制核心,是一款基于ARM Cortex-M3内核的32位微控制器。它具备以下关键特性:

  • 72MHz主频,64KB Flash,20KB RAM
  • 37个通用I/O口
  • 2个I2C接口(用于OLED通信)
  • 丰富的定时器资源

温度传感器选用DS18B20,其优势在于:

  • 单总线接口(仅需1个GPIO)
  • -55°C至+125°C测量范围
  • ±0.5°C精度(-10°C至+85°C范围内)
  • 可配置9-12位分辨率

显示部分采用常见的0.96寸OLED(SSD1306驱动),I2C接口版本仅需4根连线:

  • VCC(3.3V)
  • GND
  • SCL(时钟线)
  • SDA(数据线)

1.2 硬件连接示意图

完整电路连接如下表示:

STM32引脚连接组件备注
PA0DS18B20 DATA单总线数据线需接4.7K上拉电阻
PB6OLED SCLI2C1时钟线
PB7OLED SDAI2C1数据线
PC13用户按键用于设置报警阈值
PA1LED指示灯高温报警指示

提示:DS18B20的数据线必须连接4.7KΩ上拉电阻至3.3V,否则无法正常通信。这是新手最容易忽略的关键细节。

2. STM32CubeMX工程配置

2.1 时钟与引脚配置

使用STM32CubeMX进行基础配置:

  1. 选择STM32F103C8T6型号
  2. 在Clock Configuration中启用外部晶振(HSE),并将系统时钟配置为72MHz
  3. 引脚分配:
    • 配置PA0为GPIO_Output(DS18B20控制)
    • 配置PB6/PB7为I2C1_SCL/I2C1_SDA
    • 配置PC13为GPIO_EXTI13(按键中断)
    • 配置PA1为GPIO_Output(LED报警)

2.2 外设参数设置

关键外设配置参数:

/* I2C1 参数配置 */ hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; // 400kHz标准模式 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; /* EXTI 中断配置 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发 GPIO_InitStruct.Pull = GPIO_PULLUP;

3. DS18B20驱动实现

3.1 单总线时序控制

DS18B20的通信完全依赖精确的时序控制。以下是关键时序的实现:

// 复位脉冲(480us低电平) void DS18B20_Reset(void) { set_Pin_Output(DS18B20_PORT, DS18B20_PIN); HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, 0); delay_us(480); set_Pin_Input(DS18B20_PORT, DS18B20_PIN); delay_us(60); if (!(HAL_GPIO_ReadPin(DS18B20_PORT, DS18B20_PIN))) presence = 1; delay_us(420); } // 写入1位数据 void DS18B20_WriteBit(uint8_t bit) { set_Pin_Output(DS18B20_PORT, DS18B20_PIN); HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, 0); delay_us(bit ? 5 : 60); HAL_GPIO_WritePin(DS18B20_PORT, DS18B20_PIN, 1); delay_us(bit ? 55 : 5); }

3.2 温度读取流程

完整的温度获取流程包括:

  1. 发送复位脉冲并检测器件存在
  2. 发送跳过ROM命令(0xCC)
  3. 发送温度转换命令(0x44)
  4. 等待转换完成(750ms@12位分辨率)
  5. 再次复位并发送读取命令(0xBE)
  6. 读取两个字节的温度数据

典型的数据处理代码:

float DS18B20_GetTemp(void) { uint8_t tempL, tempH; int16_t temp; float temperature; DS18B20_Reset(); DS18B20_WriteByte(0xCC); // Skip ROM DS18B20_WriteByte(0xBE); // Read Scratchpad tempL = DS18B20_ReadByte(); tempH = DS18B20_ReadByte(); temp = (tempH << 8) | tempL; temperature = (float)temp / 16.0; // 12位分辨率 return temperature; }

4. OLED显示与用户界面

4.1 SSD1306驱动移植

使用现成的OLED驱动库可大幅简化开发。推荐使用经过优化的u8g2库,其优势包括:

  • 支持多种字体和图形绘制
  • 内置SSD1306驱动
  • 内存占用小(约2KB RAM)

初始化代码示例:

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); void OLED_Init(void) { u8g2.begin(); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0,10,"Temp Monitor v1.0"); u8g2.sendBuffer(); }

4.2 温度显示界面设计

合理的界面布局应考虑:

  • 当前温度值(大字号突出显示)
  • 温度单位切换(°C/°F)
  • 报警阈值指示
  • 系统状态标志

界面刷新优化技巧:

  • 使用局部刷新而非全屏刷新
  • 温度值变化超过0.5°C时才更新显示
  • 关键状态变化使用动画效果
void update_display(float temp, float threshold) { char buf[20]; u8g2.clearBuffer(); // 大字号显示温度 u8g2.setFont(u8g2_font_logisoso32_tr); sprintf(buf, "%.1f", temp); u8g2.drawStr(10, 40, buf); // 小字号显示单位 u8g2.setFont(u8g2_font_5x7_tr); u8g2.drawStr(90, 40, "°C"); // 报警阈值指示 u8g2.drawHLine(0, 45, 128); u8g2.setFont(u8g2_font_6x10_tr); sprintf(buf, "Alarm: %.1f°C", threshold); u8g2.drawStr(5, 60, buf); u8g2.sendBuffer(); }

5. 温度报警系统实现

5.1 报警逻辑设计

完整的报警系统应包含:

  • 可配置的高温阈值
  • 报警滞后(防止临界值频繁切换)
  • 多级报警指示
  • 历史温度记录

报警状态机实现:

typedef enum { ALARM_OFF, ALARM_PRE, ALARM_ON } AlarmState; AlarmState check_alarm(float temp, float threshold) { static AlarmState state = ALARM_OFF; switch(state) { case ALARM_OFF: if(temp > threshold + 0.5f) { // 滞后0.5°C state = ALARM_PRE; start_alarm(); } break; case ALARM_PRE: if(temp > threshold + 1.0f) { state = ALARM_ON; trigger_alarm(); } else if(temp < threshold - 0.5f) { state = ALARM_OFF; stop_alarm(); } break; case ALARM_ON: if(temp < threshold) { state = ALARM_OFF; stop_alarm(); } break; } return state; }

5.2 按键中断配置

使用外部中断实现阈值调整:

// 在stm32f1xx_it.c中实现中断服务 void EXTI15_10_IRQHandler(void) { if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_13) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13); // 长按检测 if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) { uint32_t start = HAL_GetTick(); while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_RESET) { if(HAL_GetTick() - start > 1000) { // 长按超过1秒,进入阈值设置模式 enter_setting_mode(); return; } } // 短按增加阈值 adjust_threshold(0.5f); } } }

6. 系统优化与扩展思路

6.1 低功耗设计技巧

对于电池供电的应用,可实施以下优化:

  • 使用STM32的睡眠模式
  • 降低DS18B20采样频率
  • 动态调整OLED刷新率
  • 关闭未使用的外设时钟

进入睡眠模式示例:

void enter_sleep_mode(void) { // 配置唤醒源(如EXTI) HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // 进入停止模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化时钟 SystemClock_Config(); }

6.2 项目扩展方向

基于现有框架可轻松扩展的功能:

  • 增加蓝牙/WiFi模块实现远程监控
  • 添加RTC模块记录温度变化历史
  • 支持多路DS18B20同时监测
  • 开发上位机软件进行数据分析

多传感器支持的关键修改:

// 多DS18B20寻址示例 void search_sensors(void) { uint8_t addr[8]; while(DS18B20_Search(addr)) { printf("Found device: "); for(int i=0; i<8; i++) { printf("%02X ", addr[i]); } printf("\n"); // 存储设备地址 save_sensor_address(addr); } }

在实际部署中发现,DS18B20的导线长度超过10米时通信稳定性会显著下降。这种情况下可以考虑使用屏蔽线缆,或者在长距离传输时降低单总线通信速率。另一个常见问题是OLED在低温环境下可能出现显示残影,通过定期刷新整个屏幕可以有效缓解这一问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 9:42:07

语义搜索实战:查询重写与结果排序

&#x1f99e; 一只用 AI Agent 搭副业产线的程序员 你搜「Redis 内存满了怎么办」&#xff0c;文档里写的是「Redis OOM 处理」。关键词一个都对不上。向量搜索能匹配上——但你有没有想过&#xff0c;如果用户问得更模糊&#xff0c;向量也可能跑偏&#xff1f; 用户说的话跟…

作者头像 李华
网站建设 2026/6/6 9:41:07

从零搭建XTDrone仿真环境:结合PX4、ROS Melodic与Gazebo的完整工作流解析

从零构建XTDrone仿真生态&#xff1a;PX4-ROS-Gazebo深度协同技术解析当无人机开发者从单纯调用API转向深度定制飞控算法时&#xff0c;仿真环境就成为了验证思想的数字沙盘。XTDrone作为基于PX4和ROS的仿真平台&#xff0c;其价值不仅在于提供虚拟飞行环境&#xff0c;更在于构…

作者头像 李华
网站建设 2026/6/6 9:41:05

xtdic-high-temperature-system-selection-guide

XTDIC高温应变测量系统选型指南#XTDIC #高温DIC选型 #数字图像相关 #应变测量系统 #材料测试设备 #高温炉 #光学测量 #进口替代 针对200℃-1600℃全温度区间材料力学测试需求&#xff0c;对比XTDIC-HT系列三型号&#xff08;HT-Lite/HT-Pro/HT-Ultra&#xff09;的核心参数、适…

作者头像 李华
网站建设 2026/6/6 9:40:29

k8s node内核参数优化

问题一&#xff1a;文件句柄超限&#xff1a;Too many open files整个操作系统级 > 单用户级 > 容器级解决方案# 查看容器测限制 cat /etc/systemd/system/docker.service # 查看单用户限制 cat /etc/security/limits.conf 或者 ulimit -n &#xff08;软限制&#xff09…

作者头像 李华