基于STM32的温湿度监测系统设计与实现
基于STM32的温湿度监测系统设计与实现
(一) 功能简述
该系统通过读取DHT11温湿度传感器(该模块自备)数值,并在LCD屏幕实时显示。每间隔5秒通过串口向电脑发送一次温湿度数据。当温度或湿度超过设定值,小灯呼吸。每隔20秒将温湿度保存到EEPROM中。
(二) 设计任务及要求
- 读取温湿度传感器数据 (20分)
- LCD (20分)
- 按键 (10分)
- 点击按键1,读取上次保存在EEPROM中的数据并显示;
- 点击按键2,取消读取,屏幕不再显示上次读取的数据。
- EEPROM (20分)
- 每隔20秒保存一次当前温湿度
- LED (10分)
- 温度超过设定阈值,小灯1呼吸;湿度超过阈值,小灯2呼吸。没有超过时,小灯熄灭。
- 串口 (20分)
- 每隔5秒向电脑发送一次当前温湿度数据
stm32代码实现内容
由于该题目涉及到多个模块的实现,以下代码只提供部分功能的实现示例,具体实现方式请根据自己的需求进行编写。
1. 读取温湿度传感器数据
需要使用DHT11温湿度传感器的库文件,以下为示例代码:
#include "dht11.h"
#include "delay.h"
DHT11_Data_TypeDef DHT11_Data;
DHT11_Read_Data(&DHT11_Data); // 读取温湿度传感器数据
2. LCD
需要使用LCD的库文件,以下为示例代码:
#include "lcd.h"
LCD_Init(); // 初始化LCD
LCD_Write_String(0, 0, 'Temperature:'); // 在第一行第一列写入字符串
LCD_Write_Num(0, 12, DHT11_Data.Temperature, 2); // 在第一行第13列写入温度值,保留2位小数
LCD_Write_String(1, 0, 'Humidity:'); // 在第二行第一列写入字符串
LCD_Write_Num(1, 9, DHT11_Data.Humidity, 2); // 在第二行第10列写入湿度值,保留2位小数
3. 按键
需要使用GPIO输入模式和中断的功能,以下为示例代码:
#include "gpio.h"
#include "exti.h"
void Button1_Callback() // 按键1的回调函数
{
// 读取上次保存的数据并显示
}
void Button2_Callback() // 按键2的回调函数
{
// 取消读取,屏幕不再显示上次读取的数据
}
GPIO_Init_Input(GPIOA, GPIO_PIN_0, GPIO_PULLUP); // 初始化GPIOA0为输入模式,上拉电阻
EXTI_Init(GPIOA, EXTI_LINE_0, EXTI_TRIGGER_FALLING, Button1_Callback); // 初始化外部中断,当GPIOA0下降沿触发时调用Button1_Callback
EXTI_Init(GPIOB, EXTI_LINE_1, EXTI_TRIGGER_FALLING, Button2_Callback); // 初始化外部中断,当GPIOB1下降沿触发时调用Button2_Callback
4. EEPROM
需要使用EEPROM的库文件,以下为示例代码:
#include "eeprom.h"
#include "timer.h"
void EEPROM_Save_Data() // 保存数据到EEPROM的回调函数
{
EEPROM_Write(0, &DHT11_Data, sizeof(DHT11_Data)); // 将DHT11_Data保存到EEPROM的第一个地址
}
Timer_Init(TIMER_1, 20000, EEPROM_Save_Data); // 初始化定时器,每隔20秒调用一次EEPROM_Save_Data
5. LED
需要使用PWM输出模式和定时器的功能,以下为示例代码:
#include "pwm.h"
#include "timer.h"
void LED_Breath() // LED呼吸灯效果
{
static int duty_cycle = 0;
static int direction = 1;
duty_cycle += direction;
if (duty_cycle >= 100 || duty_cycle <= 0)
{
direction = -direction;
}
PWM_Set_Duty_Cycle(PWM_1, duty_cycle); // 设置PWM输出的占空比
}
if (DHT11_Data.Temperature > THRESHOLD_TEMPERATURE) // 当温度超过阈值时,LED1呼吸
{
PWM_Init(PWM_1, GPIOA, GPIO_PIN_1, 1000, 0); // 初始化PWM输出,频率为1kHz,占空比为0
Timer_Init(TIMER_2, 10, LED_Breath); // 初始化定时器,每隔10ms调用一次LED_Breath
}
else if (DHT11_Data.Humidity > THRESHOLD_HUMIDITY) // 当湿度超过阈值时,LED2呼吸
{
PWM_Init(PWM_2, GPIOA, GPIO_PIN_2, 1000, 0); // 初始化PWM输出,频率为1kHz,占空比为0
Timer_Init(TIMER_3, 10, LED_Breath); // 初始化定时器,每隔10ms调用一次LED_Breath
}
else // 没有超过阈值时,LED熄灭
{
PWM_Deinit(PWM_1); // 关闭PWM输出
PWM_Deinit(PWM_2); // 关闭PWM输出
}
6. 串口
需要使用串口的库文件,以下为示例代码:
#include "usart.h"
#include "string.h"
char buffer[100];
USART_Init(USART_1, 9600); // 初始化串口1,波特率为9600
sprintf(buffer, 'Temperature: %.2f, Humidity: %.2f\r\n', DHT11_Data.Temperature, DHT11_Data.Humidity); // 将温湿度数据格式化为字符串
USART_Send_String(USART_1, buffer); // 发送字符串到电脑
原文地址: https://www.cveoy.top/t/topic/nM1n 著作权归作者所有。请勿转载和采集!