基于STM32环境温湿度监测系统设计

1. 实验目的

(1) 掌握使用 KEIL MDK5 进行软件开发的具体流程;

(2) 掌握硬件电路的设计方法;

(3) 掌握 STM32 微控制器的程序设计及代码编写方法。

2. 任务和要求

(1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集;

(2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超过范围实现声光报警,声音报警为启动无源蜂鸣器播放音乐,光源报警采用 LED灯闪烁的方式(每个同学采用不同的声光报警方式。例如:播放不同的音乐,LED灯闪烁的次数不一样等);

(3)手动设置报警温度和湿度上下限。

(4)加分项:自行增加其他功能。

3. proteus仿真图

在这里插入图片描述

4. 实验代码

#include "stm32f4xx.h"
#include <stdio.h>
#include "systick.h"
#include "led.h"
#include "lcd.h"
#include "dht11.h"
#include "usart.h"
#include "sr04.h"
#include "key.h"

int main()
{
	 u16 i,key;//定义距离和按键值的变量
	 u16 t1=25;//温度下限初始化
	 u16 t2=35;//温度上限初始化
	 u16 h1=65;//湿度下限初始化
	 u16 h2=75;//湿度下限初始化
	 u8 data_buf[5] = {0};//为了存储温湿度数据
   Led_Init();//led初始化
 	 systick_init();//系统时钟的初始化函数
	 sr04_init();//sr04初始化
	 dht_init();//Dht初始化
	 lcd_init();//LCD初始化
	 key_init();//key初始化
	 
	while(1)
	{ 
		i=get_distance();//得到的距离给i
		key=KEY_Scan(1);	//得到的键值给key
		dht_read_data(data_buf); //得到的温湿度数据给data_buf
		
		//如果距离大于5,并且小于等于10cm 灯0,1,2,3亮
		if (i>5 && i<=10) 
		{
		GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 );//点亮4盏灯
		}
		
		//如果距离大于10,并且小于等于15cm 灯0,1,2亮
		if(i>10 && i<=15)
		{
		GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);//点亮3盏灯
		GPIO_SetBits(GPIOA,GPIO_Pin_3);
		}
		
		//如果距离大于15,并且小于等于20cm 灯0,1亮
		if(i>15 && i<=20)
		{
			GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1);//点亮2盏灯
		  GPIO_SetBits(GPIOA,GPIO_Pin_2 | GPIO_Pin_3 );
		}
		
		//如果距离小于等于5,或者大于20cm 灯全灭
		  if(i>20 || i<=5)
		{ 
			GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//全灭
		}
     
		//设置上下限
	   	if(key)
		{						   
			switch(key)
			{			 
				case KEY0_PRES:	
					t1--;//如果KEY0按下 温度下限减1
					break;
				case KEY1_PRES:	
					t2--;//如果KEY1按下 温度上限减1
					break;
				case KEY2_PRES:	 
					h1--;//如果KEY2按下 湿度下限减1
					break;
				case KEY3_PRES:	
					h2--;//如果KEY3按下 湿度上限减1
					break;
				case KEY4_PRES:	
					t1++;//如果KEY4按下 温度下限加1
					break;
				case KEY5_PRES:	
					t2++;//如果KEY5按下 温度上限加1
					break;
				case KEY6_PRES:	 
					h1++;//如果KEY6按下 湿度下限加1
					break;
				case KEY7_PRES:	
					h2++;//如果KEY7按下 湿度上限加1
					break;
			}
		} 
		
		if(data_buf[2]>t1 && data_buf[2]<t2) 
		GPIO_SetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5);//温度是否在范围内,是的话灯不亮
		else if (data_buf[2]<t1) GPIO_ResetBits(GPIOA,GPIO_Pin_4);//小于下限,灯4亮
		else if (data_buf[2]>t2) GPIO_ResetBits(GPIOA,GPIO_Pin_5);//大于于下限,灯5亮

		
		if(data_buf[0]>h1 && data_buf[0]<h2) GPIO_SetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_7);//湿度是否在范围内,是的话灯不亮
		else if (data_buf[0]<h1)GPIO_ResetBits(GPIOA,GPIO_Pin_6);//小于下限,灯6亮
		else if (data_buf[0]>h2)GPIO_ResetBits(GPIOA,GPIO_Pin_7);//大于于下限,灯7亮
		

		
		lcd_show_string(0,1,"distance=  cm");//显示字符串
    lcd_num(9,1,i);//显示超声波测得距离
		lcd_show_string(0,2,"Temp:  C");
		lcd_num(5,2,data_buf[2]);//显示温度数值
		lcd_show_string(0,3,"Hum:  %");
		lcd_num(4,3,data_buf[0]);//显示湿度数值

		lcd_num(9,2,t1);//显示温度下限数值
		lcd_show_string(11,2,"-");
		lcd_num(12,2,t2);//显示温度上限数值
		lcd_num(9,3,h1);//显示湿度下限数值
		lcd_show_string(11,3,"-");
		lcd_num(12,3,h2);//显示湿度上限数值
	}
}

下载地址:成品下载

版权声明:本文为CSDN博主「十言1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45771313/article/details/120889675

生成海报
点赞 0

十言1

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32F2————配置时钟延迟不准的问题

STM32F2配置时钟问题 笔者在本科毕业设计使用STM32F207芯片,但是在配置时钟时出现了问题。 问题 我按照F1写代码的延时函数放在F2竟然不准了 换个办法 使用Systick时钟也是不准,原因是笔者代

为什么重写printf函数没有用?

以前在网上找了无数方法去重写printf函数,但发现都没效果,今天偶然发现重写printf函数可以了,原因是以前没有勾选微库(Use MicroLlB)! 这里