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