帮我写个程序(基于STM32F103):读取DHT11 温湿度传感器数值,并在LCD 屏幕实时 显示。每间隔5 秒通过串口向电脑发送一次温湿度数据。温度超过设定阈值,小灯1 呼吸;湿度超过阈值,小灯2 呼吸。没超 过是,小灯熄灭,每隔20 秒将温湿度保存到EEPROM 中
时间: 2023-06-11 09:08:02 浏览: 66
好的,以下是基于STM32F103的温湿度传感器读取程序:
```c
#include "stm32f10x.h"
#include "LCD.h"
#include "DHT11.h"
#include "EEPROM.h"
#include "USART.h"
#define TEMP_THRESHOLD 25.0 // 温度阈值
#define HUMIDITY_THRESHOLD 70.0 // 湿度阈值
void GPIO_Configuration(void);
void TIM_Configuration(void);
int main(void)
{
float temperature, humidity;
uint8_t temp_str[16], humidity_str[16];
uint32_t tick_count = 0;
GPIO_Configuration();
TIM_Configuration();
LCD_Init();
DHT11_Init();
EEPROM_Init();
USART_Init();
while (1)
{
if (tick_count >= 1000) // 每隔1s读取一次温湿度
{
tick_count = 0;
DHT11_Read_Data(&temperature, &humidity);
LCD_Clear();
sprintf((char*)temp_str, "Temp: %.1fC", temperature);
sprintf((char*)humidity_str, "Humi: %.1f%%", humidity);
LCD_DisplayStringLine(Line1, temp_str);
LCD_DisplayStringLine(Line2, humidity_str);
if (temperature > TEMP_THRESHOLD) // 温度超过阈值,小灯1呼吸
{
TIM_Cmd(TIM2, ENABLE);
}
else
{
TIM_Cmd(TIM2, DISABLE);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
if (humidity > HUMIDITY_THRESHOLD) // 湿度超过阈值,小灯2呼吸
{
TIM_Cmd(TIM3, ENABLE);
}
else
{
TIM_Cmd(TIM3, DISABLE);
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
}
if (tick_count % 5000 == 0) // 每隔5s通过串口发送温湿度数据
{
USART_SendFloat(temperature);
USART_SendChar(' ');
USART_SendFloat(humidity);
USART_SendChar('\n');
}
if (tick_count % 20000 == 0) // 每隔20s将温湿度保存到EEPROM中
{
EEPROM_WriteFloat(0x00, temperature);
EEPROM_WriteFloat(0x04, humidity);
}
tick_count++;
Delay_Ms(1);
}
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 100 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 50;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM2, DISABLE);
TIM_Cmd(TIM3, DISABLE);
}
```
这个程序中,我们使用了STM32F103的定时器和GPIO模块,以及LCD显示屏、DHT11温湿度传感器和EEPROM存储器。程序的主要流程如下:
1. 初始化各个模块。
2. 每隔1秒读取一次温湿度,并在LCD屏幕上显示。
3. 如果温度或湿度超过阈值,就让相应的小灯呼吸。
4. 每隔5秒通过串口向电脑发送一次温湿度数据。
5. 每隔20秒将温湿度保存到EEPROM中。
需要注意的是,本程序中的延时函数Delay_Ms()需要自行编写,可以使用定时器或者循环延时的方式实现。此外,USART_Init()和EEPROM_Init()函数也需要自行编写,这里就不再赘述了。