在嵌入式开发领域,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库,开发效率大幅提高,代码的可移植性和可维护性也更好。
|