[STM32F1] 使用STM32F103实现简易温度监控系统

[复制链接]
2916|9
 楼主| 公羊子丹 发表于 2025-1-14 07:36 | 显示全部楼层 |阅读模式
在嵌入式开发领域,STMicroelectronics(意法半导体)的STM32系列微控制器以其高性能、低功耗和丰富的外设备受欢迎。本篇文章将以STM32F103C8T6为例,讲解如何实现一个简易的温度监控系统。本文内容包括系统设计、代码实现以及调试要点。
系统设计概述该系统通过一个温度传感器(如DS18B20)实时采集环境温度数据,STM32通过I2C接口读取数据并进行处理,将结果通过UART发送到PC端显示,温度过高时点亮指示灯报警。
系统主要模块:
  • 温度采集模块:使用DS18B20传感器。
  • 通信模块:通过UART将温度数据发送到PC。
  • 报警模块:当温度超过设定阈值时点亮LED。
硬件连接
  • DS18B20连接到STM32的PA1(GPIO引脚)。
  • 指示灯连接到PB0(GPIO引脚)。
  • UART使用PA9和PA10分别作为TX和RX引脚。
软件实现以下是实现该功能的代码,使用STM32CubeMX生成的HAL库为基础。
  1. #include "main.h"
  2. #include "stdio.h"

  3. // 温度阈值
  4. #define TEMP_THRESHOLD 30.0

  5. UART_HandleTypeDef huart1;

  6. // 用于存储温度值
  7. float temperature = 0.0;

  8. // 初始化DS18B20传感器
  9. void DS18B20_Init(void) {
  10.     // GPIO初始化代码略(根据具体的引脚配置设置为开漏模式)
  11. }

  12. // 读取DS18B20温度
  13. float DS18B20_ReadTemperature(void) {
  14.     // 模拟读取温度
  15.     return 25.5; // 示例温度
  16. }

  17. // UART发送函数
  18. void UART_SendString(char *str) {
  19.     HAL_UART_Transmit(&huart1, (uint8_t *)str, strlen(str), HAL_MAX_DELAY);
  20. }

  21. // 主程序
  22. int main(void) {
  23.     HAL_Init();
  24.     SystemClock_Config();
  25.     MX_GPIO_Init();
  26.     MX_USART1_UART_Init();

  27.     DS18B20_Init();
  28.     char buffer[50];

  29.     while (1) {
  30.         // 读取温度
  31.         temperature = DS18B20_ReadTemperature();

  32.         // 温度超过阈值时点亮LED
  33.         if (temperature > TEMP_THRESHOLD) {
  34.             HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
  35.         } else {
  36.             HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
  37.         }

  38.         // 发送温度数据到PC
  39.         sprintf(buffer, "Temperature: %.2f C\r\n", temperature);
  40.         UART_SendString(buffer);

  41.         HAL_Delay(1000);
  42.     }
  43. }

  44. // 时钟配置函数
  45. void SystemClock_Config(void) {
  46.     // 时钟初始化代码略
  47. }

  48. // GPIO初始化函数
  49. void MX_GPIO_Init(void) {
  50.     // GPIO引脚配置代码略
  51. }

  52. // UART初始化函数
  53. void MX_USART1_UART_Init(void) {
  54.     huart1.Instance = USART1;
  55.     huart1.Init.BaudRate = 9600;
  56.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
  57.     huart1.Init.StopBits = UART_STOPBITS_1;
  58.     huart1.Init.Parity = UART_PARITY_NONE;
  59.     huart1.Init.Mode = UART_MODE_TX_RX;
  60.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  61.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  62.     if (HAL_UART_Init(&huart1) != HAL_OK) {
  63.         Error_Handler();
  64.     }
  65. }

  66. // 错误处理函数
  67. void Error_Handler(void) {
  68.     while (1) {
  69.     }
  70. }
调试要点
  • 时钟配置:确保DS18B20和UART的时钟频率正确。
  • 引脚配置:确认PA1为开漏输出,PB0为推挽输出。
  • 串口通信:调试时用串口工具检查数据是否正确输出。
总结通过STM32F103和DS18B20,可以轻松实现环境温度的实时监控。借助STM32CubeMX生成的HAL库,开发效率大幅提高,代码的可移植性和可维护性也更好。

周半梅 发表于 2025-1-14 07:36 | 显示全部楼层
哇,这个用STM32F103搞定的温度监控真不错,感觉很实用!
帛灿灿 发表于 2025-1-14 07:36 | 显示全部楼层
最近也在学STM32,正好可以用这个例子试试手。
童雨竹 发表于 2025-1-14 07:37 | 显示全部楼层
UART和I2C的结合用起来挺好,写得很详细,受益匪浅!
万图 发表于 2025-1-14 07:37 | 显示全部楼层
DS18B20是个老牌传感器了,用起来很稳定。
Wordsworth 发表于 2025-1-14 07:37 | 显示全部楼层
看了代码后发现,STM32CubeMX确实省了不少功夫。
Bblythe 发表于 2025-1-14 07:37 | 显示全部楼层
这个温度报警功能可以用在家里检测温度,感觉挺方便的。
Pulitzer 发表于 2025-1-14 07:38 | 显示全部楼层
如果再加个OLED屏显示温度就更棒了!
Uriah 发表于 2025-1-14 07:38 | 显示全部楼层
我觉得PA1的开漏模式这个细节写得很到位,赞!
Clyde011 发表于 2025-1-14 07:38 | 显示全部楼层
代码部分清晰易懂,适合新手上手。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

216

主题

6740

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部