一、设计简介

基于stm32单片机智能恒温恒湿控制系统 系统由stm32f103c8t6单片机+DHT11温度传感器+0.96oled显示屏+5V继电器+按键构成。

  1. 硬件组成
    • STM32单片机(作为核心控制器)
    • DHT11温湿度传感器(用于实时读取温度和湿度)
    • OLED屏幕(用于显示当前的温湿度数据以及预设的阈值)
    • 按键(用于设置和调整温湿度阈值)
    • 继电器

视频演示

【毕业设计基础模块】stm32单片机智能恒温恒湿控制系统孵化器源代码程序+proteus仿真+dht11温湿度传感器驱动程序+OLED 屏幕+按键设置温湿度阈值

二、功能设计

具体功能: 1、0.96oled显示屏实时显示测得的温度湿度;

2、可以设置温度湿度报警上下限值;按键功能:加键,减键,设置键;

3、超过设定的上下显示启动相应操作

4、测得的温度超过上限值,继电器吸合,电风扇开始工作;测得的温度低于下限值,继电器吸合,加热膜开始工作。

5,测得的湿度超过上限值,继电器吸合,除湿开始工作;测得的湿度低于下限值,继电器吸合,加湿器开始工作。

三、软件环境

Keil5 MDK:stm32单片机源代码程序编写及下载代码

ST-Link 驱动程序:用于下载程序到 STM32。

Proteus仿真软件

四、所需硬件以及传感器模块

 1.1 stm32f103c8t6(1个)

 STM32F103C8T6单片机是一款非常用的单片机型号,可以方便灵活的进行嵌入式系统开发。首先,它的处理器基于Cortex-M3内核,最高工作频率达72MHz。STM32F103C8T6拥有64KB闪存和20KB SRAM,非常适合中小型单片机开发项目。

具有非常丰富的外设接口,如串口USART、SPI通信、I2C通讯、CAN通讯和USB,在与单片机外设通信方面非常方便。有多个GPIO通用IO口,定时器,中断系统,灵活配置为输入,输出、模拟输入或PWM输出,可以连接各类传感器和模块。

内部集成的12位逐次逼近型ADC和DAC,支持高精度模拟信号处理。STM32F103C8T6还支持低功耗模式,适合电池供电的应用场景。结合强大的STM32开发生态,包括库函数和工具链,可以让开发者很方便的完成单片机项目的开发。

  • 1.2 温湿度传感器DHT11(1个)

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数

字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。

传感器包括一 个电容式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。

引脚说明

1、VDD 供电 3.3~5.5V DC

2、DATA 串行数据,单总线

3、NC 空脚

4、GND 接地,电源负

五、Proteus仿真

在Proteus软件中,您需要按照硬件连接创建相应的仿真电路,包括STM32单片机、DHT11传感器、OLED屏幕、按键和电机等组件。然后,将生成的hex文件(由Keil等IDE编译得到)加载到STM32单片机模型中,进行仿真测试。

六、程序代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "dht11.h"
#include "Key.h"
#include "Iwdg.h"
#include "Timer.h"
#include "IO_Config.h"


uint8_t KeyNum;               						//按键变量
uint8_t SetSelect,SetFlashFlag;   				//设置选择标志,选中闪烁标志
uint8_t Temperature,Humi;         				//温度湿度变量
uint8_t TG=25,HG=50;          						//温湿度阈值
				
int main(void)				
{ 							
  Timer_Init();
	OLED_Init();
	GPIO_Configuration();
	DHT11_Init();
	Key_Init();
	Iwdg_Init();
		
	OLED_ShowString(0,0,"T:",OLED_8X16);	        //显示静态字符串
	OLED_ShowString(66,0,"H:",OLED_8X16);	
	while (1)
	{ 
		IWDG_ReloadCounter();												//看门狗重装计数器
		KeyNum=Key_GetNum();		       						  //获取按键值
		DHT11_Read_Data(&Temperature,&Humi);        //获取dht11温湿度值  
		
		if(Temperature<=(TG-2))											//温度小于阈值减2,开启加热
		{Heat_On;}											
		else   																			//否则关闭加热
		{Heat_Off;}												
													
		if(Temperature>=(TG+2))											//温度大于阈值加2,开启制冷
		{Cold_On;}											
		else 									 											//否则关闭制冷
		{Cold_Off;}											
													
		if(Humi<=(HG-5))			 											//湿度小于阈值减5,开启加湿
		{Humi_On;}											
		else   								 											//否则关闭加湿
		{Humi_Off;}											
													
		if(Humi>=(HG+5))		  											//湿度大于阈值加5,开启除湿
		{Dehumi_On;}											
		else 								   											//否则关闭除湿
		{Dehumi_Off;}											
		
		if(KeyNum==1)								  							//按键1按下
		{
			switch(SetSelect)
			{
				case 0:
					;break;
				case 1:																	//温度阈值加1
				{
					TG++;
					if(TG>=80)TG=80;                      //最大值80
				}break;
				case 2:																	//湿度阈值加1
				{
					HG++;
					if(HG>=100)HG=100;										//最大值100
				}break;
			}
		}		
		if(KeyNum==2)								  							//按键2按下
		{
			switch(SetSelect)
			{
				case 0:
					;break;
				case 1:																	//温度阈值减1
				{                                       
					TG--;                                 
					if(TG<=0)TG=0;                      	//最小值0
				}break;                                 
				case 2:                                 //湿度阈值减1
				{                                       
					HG--;                                 
					if(HG<=0)HG=0;                    	  //最小值0
				}break;                                 
			}                                         
		}		                                        
		if(KeyNum==3)																 //按键3按下,变化不同设置位置
		{			
			SetSelect++;                               //按键3按下,变化不同设置位置
			SetSelect%=3;
		}		
	
		OLED_ShowNum(16,0,Temperature,2,OLED_8X16);   //显示实时温度
		OLED_ShowString(34,00,"C",OLED_8X16);
		OLED_ShowNum(90,0,Humi,2,OLED_8X16);					//显示实时湿度
		OLED_ShowString(110,00,"%",OLED_8X16);
		OLED_ShowString(0,20,"TG:",OLED_8X16);
		OLED_ShowNum(24,20,TG,2,OLED_8X16);						//显示设定温度阈值
		OLED_ShowString(42,20,"C",OLED_8X16);
		OLED_ShowString(66,20,"HG:",OLED_8X16);
		OLED_ShowNum(90,20,HG,2,OLED_8X16);				  	//显示设定湿度阈值
		OLED_ShowString(110,20,"%",OLED_8X16);
		if(SetSelect==1&&SetFlashFlag==1)OLED_ShowString(24,20,"  ",OLED_8X16);      //选中不同设置位置闪烁
		if(SetSelect==2&&SetFlashFlag==1)OLED_ShowString(90,20,"  ",OLED_8X16);
		OLED_Update();			
	}
}

void TIM2_IRQHandler(void)
{
	
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)			//判断是否触发中断
	{
		SetFlashFlag=!SetFlashFlag;            							//设置闪烁标志位			
					
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);		    	//清清除TIM2中断标志位
												
	}
}

七、实物图片

 八、资料内容清单

百度网盘源码资料下载链接icon-default.png?t=O83Ahttps://pan.baidu.com/s/1oZCy_cDSe2wohDaKuHNqRw?pwd=iv1n%20%20%E6%8F%90%E5%8F%96%E7%A0%81%EF%BC%9Aiv1n

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐