打印
[STM32F1]

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

[复制链接]
67|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库为基础。
#include "main.h"
#include "stdio.h"

// 温度阈值
#define TEMP_THRESHOLD 30.0

UART_HandleTypeDef huart1;

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

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

// 读取DS18B20温度
float DS18B20_ReadTemperature(void) {
    // 模拟读取温度
    return 25.5; // 示例温度
}

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

// 主程序
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();

    DS18B20_Init();
    char buffer[50];

    while (1) {
        // 读取温度
        temperature = DS18B20_ReadTemperature();

        // 温度超过阈值时点亮LED
        if (temperature > TEMP_THRESHOLD) {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
        } else {
            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
        }

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

        HAL_Delay(1000);
    }
}

// 时钟配置函数
void SystemClock_Config(void) {
    // 时钟初始化代码略
}

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

// UART初始化函数
void MX_USART1_UART_Init(void) {
    huart1.Instance = USART1;
    huart1.Init.BaudRate = 9600;
    huart1.Init.WordLength = UART_WORDLENGTH_8B;
    huart1.Init.StopBits = UART_STOPBITS_1;
    huart1.Init.Parity = UART_PARITY_NONE;
    huart1.Init.Mode = UART_MODE_TX_RX;
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    if (HAL_UART_Init(&huart1) != HAL_OK) {
        Error_Handler();
    }
}

// 错误处理函数
void Error_Handler(void) {
    while (1) {
    }
}
调试要点
  • 时钟配置:确保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的结合用起来挺好,写得很详细,受益匪浅!

使用特权

评论回复
5
万图| | 2025-1-14 07:37 | 只看该作者
DS18B20是个老牌传感器了,用起来很稳定。

使用特权

评论回复
6
Wordsworth| | 2025-1-14 07:37 | 只看该作者
看了代码后发现,STM32CubeMX确实省了不少功夫。

使用特权

评论回复
7
Bblythe| | 2025-1-14 07:37 | 只看该作者
这个温度报警功能可以用在家里检测温度,感觉挺方便的。

使用特权

评论回复
8
Pulitzer| | 2025-1-14 07:38 | 只看该作者
如果再加个OLED屏显示温度就更棒了!

使用特权

评论回复
9
Uriah| | 2025-1-14 07:38 | 只看该作者
我觉得PA1的开漏模式这个细节写得很到位,赞!

使用特权

评论回复
10
Clyde011| | 2025-1-14 07:38 | 只看该作者
代码部分清晰易懂,适合新手上手。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

4164

帖子

2

粉丝