基于STM32的室内温湿度采集控制系统
嵌入式工程师成长日记 2025-01-03

系统主要功能

该系统为温湿度采集控制系统,设计通过STM32+Keil编写嵌入式芯片代码,并通过Proteus搭建硬件电路,其主要的功能有:以STM32为最小系统电路进行连接,用液晶显示屏显示温度、湿度数据。同时用温湿度传感器进行温湿度的采集与测量。温湿度采集器可以通过按钮进行温湿度测量的转化。通过按键可以设置阈值。当温度达到报警的阈值时散热继电器开始工作,带动发动机进行转动,由此来达到散热的目的。当湿度达到一定的阈值时,洒水继电器开始工作,这里以LED灯亮代表工作。该系统就是采集室内温湿度,当不满足要求时自动进行室内温度、湿度的调整。

电路原理图

温湿度测量模块

本模块主要进行温湿度的测量,原本使用DBS18B20进行温度测量,但是DBS18B20未仿真成功,上网查询资料,仿照类似的电路,设计并使用了DHT11进行温度测量,同时发现,DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。参考网上的代码,进行修改和加工,虽然过程中出现了很多错误,但最终还是成功的仿真出来。实现了温湿度的测量。接口连接,如图所示:

散热模块

该模块功能是:当传感器接收温度超过所设置的阈值温度时,进行室内温度的散热。使用电动机进行散热,在实际电路中,电动机可以连接风扇等设备进行温度散热。

该电路连接使用了继电器的连接方法,继电器是一种电控制器件,具有控制系统(输入回路)和被控制系统(输出回路)之间的互动关系,实际上就是用小电流控制大电流运作的一种“自动开关”,在电路中起着自动调节、安全保护、电路转换等作用。当流入继电器的电流乘以继电器的标称电阻达到其标称电压时,继电器就在磁场作用下将原先悬置的开关拉到另一个开关处,即由“常开触点”到“常闭触点”。

洒水模块

该模块功能是:当检测到室内湿度不满足条件时,洒水器进行工作。其电路连接仿照散热继电器进行连接。因为没有实物,所以用LED亮代表洒水器工作,由此进行模拟。接口连接,如图所示:

按键控制模块

该模块的作用是:通过按键进行温湿度阈值的设置,PB0选择设置的对象,是温度还是湿度,同时PB1、PB2进行设置阈值的增大或者减小。接口连接,如图所示:

DHTT11温湿度采集函数的配置

#include "DHT11.h"#define DHT_SetBit()	GPIO_SetBits(DHT_GPIO, DHT_GPIO_PIN)#define DHT_ResetBit()	GPIO_ResetBits(DHT_GPIO, DHT_GPIO_PIN)#define DHT_ReadBit()	GPIO_ReadInputDataBit(DHT_GPIO, DHT_GPIO_PIN) static void DHT_Set_Output(void);			//设置为输出模式static void DHT_Set_Input(void);			//设置为输入模式 DHT11_TypeDef DHT11;					      	//全局变量/*********************************************************************************************** Function Name : DHT11_Init* Description : 湿度传感器IO初始化*******************************************************************************/void DHT_Set_Output(void){ GPIO_InitTypeDef  GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DHT_GPIO_PIN;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(DHT_GPIO, &GPIO_InitStructure);  }void DHT_Set_Input(void){ GPIO_InitTypeDef  GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = DHT_GPIO_PIN;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(DHT_GPIO, &GPIO_InitStructure);  }void DHT11_Init(void){ //GPIO_InitTypeDef  GPIO_InitStructure;  RCC_APB2PeriphClockCmd(DHT_RCC, ENABLE);	 //使能端口时钟  DHT_Set_Output(); DHT11.Tem_H = 0; DHT11.Tem_L = 0; DHT11.Hum_H = 0; DHT11.Hum_L = 0;  //DHT_W_DATA=1; }/******************************************************************************** Function Name :  DHT11_Byte* Description : 读取温湿度一个字节*******************************************************************************/int DH21_ReadByte(void){ int data=0; char i; char cout;  for(i=0; i<8; i++) { //读取50us的低电平 cout=1; while(!DHT_ReadBit() && cout++);  //延时30us之后读取IO口的状态 delay_us(24);  //先把上次的数据移位,再保存本次的数据位 data = data << 1;  if(DHT_ReadBit() == Bit_SET) {  data |= 1; }   //等待输入的是低电平,进入下一位数据接收 cout=1; while(DHT_ReadBit() && cout++); }  return data;}/******************************************************************************** Function Name :  DHT11_Read* Description : 读取温湿度*******************************************************************************/int DHT11_ReadData(void){ unsigned int cout = 1; unsigned int T_H, T_L, H_H, H_L, Check;  //设置为IO口输出模式 DHT_Set_Output(); DHT_W_DATA=1; //1、MCU开始起始信号 DHT_ResetBit(); delay_ms(18);		//拉低至少18ms DHT_SetBit();  //delay_us(20);		//拉高20~40us  //设置为IO口输入模式 DHT_Set_Input();  //2、读取DH21响应 if(DHT_ReadBit() == Bit_RESET) { //等待80us的高电平 cout = 1; while(DHT_ReadBit() && cout++);  //等待80us的低电平 cout = 1; while(!DHT_ReadBit() && cout++); delay_us(54);  //读取8bit的湿度整数数据 H_H = DH21_ReadByte();  //读取8bit的湿度小数数据 H_L = DH21_ReadByte();  //读取8bit的温度整数数据 T_H = DH21_ReadByte();  //读取8bit的温度小数数据 T_L = DH21_ReadByte();  //读取8bit的校验和 Check = DH21_ReadByte();  if(Check == (H_H + H_L + T_H + T_L)) { DHT11.Hum_H = H_H; DHT11.Hum_L = H_L; DHT11.Tem_H = T_H; DHT11.Tem_L = T_L;  return 1; } else { return 0; } } return 0;}/** * @brief  获取温度*/int DHT11_GetTem(void){ return (DHT11.Tem_H << 8 | DHT11.Tem_L);} /** * @brief  获取湿度  */int DHT11_GetHum(void){ return (DHT11.Hum_H << 8 | DHT11.Hum_L);}

主函数函数的配置(其包含液晶显示屏的使用、中断函数的使用、按键的控制等)

#include "main.h"/****全局变量******************************************/uint8_t lcd_dat1[20];//液晶第一行uint8_t lcd_dat2[20];//液晶第二行uint16_t temp_dat;//温度变量uint16_t hum_dat;//湿度变量uint16_t set_temp_dat=27;//设置温度变量uint16_t set_hum_dat=50;//设置湿度变量uint8_t setnum;//设置变量 /**********函数申明****************************************/void ADC1_Init(void);uint16_t Read_Adc1(uint8_t ch);//通道采样1次uint16_t light_intensity(uint32_t dat);//光强函数;void KEY_IO_Init(void);//按键初始化void EXTIx_Init(void);//外部中断void Relay_IO_Init(void); //控制继电器引脚io初始化void EXTI0_IRQHandler(void);void EXTI1_IRQHandler(void);void EXTI2_IRQHandler(void);/***************************************** main函数*****************************************/int main(void){ uint8_t count_i; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断向量分组 2 //按键和继电器引脚初始化 KEY_IO_Init(); Relay_IO_Init(); EXTIx_Init();//外部中断初始化 LCD_init();    //LCD1602初始化 LCD_clr();//LCD清屏幕 DHT11_Init();//温湿度传感器初始化 ADC1_Init();//adc采样初始化 用于ad类型传感器 while(1){  count_i++; //if(count_i>50) { //传感器数据采集 if(DHT11_ReadData())//温湿度采集 { temp_dat=DHT11_GetTem(); temp_dat=temp_dat/256; delay_ms(10); hum_dat=DHT11_GetHum(); hum_dat=hum_dat/256; }  //液晶显示:T温度  H湿度  sprintf(lcd_dat1,"T:%d    H:%d \n",temp_dat,hum_dat);//转换温度,湿度 LCD_prints(0,0,lcd_dat1);//液晶显示第一行 if(setnum==0) { sprintf(lcd_dat2,"  %d   %d   \n",set_temp_dat,set_hum_dat);  LCD_prints(0,1,lcd_dat2);//液晶显示第二行 } if(setnum	== 1) { sprintf(lcd_dat2,"  %d^  %d  \n",set_temp_dat,set_hum_dat);  LCD_prints(0,1,lcd_dat2);//液晶显示第二行 } if(setnum	== 2) { sprintf(lcd_dat2,"  %d   %d^  \n",set_temp_dat,set_hum_dat);  LCD_prints(0,1,lcd_dat2);//液晶显示第二行 } if(setnum	== 3) { sprintf(lcd_dat2,"  %d   %d   ^\n",set_temp_dat,set_hum_dat);  LCD_prints(0,1,lcd_dat2);//液晶显示第二行 } } if(temp_dat>set_temp_dat)//比较温度 Relay1=1; else Relay1=0; if(hum_dat Relay2=1; else Relay2=0;  } return 0;}}

运行仿真图:



声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【立即预约】Keysight直播:搞懂介电常数那些事儿


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 基于C51单片机实现汽车座椅自动控制系统的软硬件设计

    引言 随着人们生活水平的提高,对汽车座椅的舒适性要求也越来越高,要求对汽车座椅地调节能够更加简单、方便、快捷。目前,汽车座椅位置的调节多采用基于手动调节方式的机械和电动控制两种方式。汽车座椅位置的调节...

    7小时前
  • MCS51单片机程序设计时堆栈的计算方法解析

    用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己...

    7小时前
  • 51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。...

    7小时前
  • 51单片机学习单片机之路总结

    学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...

    7小时前
  • hot51增强型单片机开发板原理图

    功能要求: 一):绿灯25s倒计时,绿灯过度红灯有5s黄灯时间,红灯25s后直接跳绿灯。 二):按键按下模拟闯红灯输入,产生5s蜂鸣器鸣叫。 开发环境: 软件:Keil uVision4 硬件:HOT51增强型单片机开发板 程序代码:...

    昨天
  • 51单片机的延时子程序

    延时程序在单片机编程中使用非常广泛,但一些读者在学习中不知道延时程序怎么编程,不知道机器周期和指令周期的区别,不知道延时程序指令的用法, ,本文就此问题从延时程序的基本概念、机器周期和指令周期的区别和联系...

    昨天
  • 什么是Flash盘?Flash盘的结构是什么样的?

    Flash是大家常使用的存储之一,对于Flash,大家或多或少有所了解。上篇文章中,小编对Flash闪存的类型有所介绍。为继续增进大家对Flash的认识,本文将对Flash盘、Flash盘结构以及Flash读写操作予以介绍。如果你对本...

    昨天
  • 深谈嵌入式系统,嵌入式系统是如何组成的?

    嵌入式系统在生活中有诸多应用,大家对于嵌入式系统或多或少有所耳闻。在前两篇文章中,小编对嵌入式系统进行过详细介绍。为继续增进大家对嵌入式系统的认识,本文将对嵌入式系统的组成加以说明。如果你对嵌入式系...

    06-27
  • 嵌入式系统秘籍共享,最全嵌入式系统解析

    嵌入式系统的应用十分广泛,因此越来越多的人学习嵌入式系统。由此,在学习嵌入式系统之前,我们应当对嵌入式系统具备一些认识。所以在本文余下部分,小编将对嵌入式系统进行全面解析。如果你对嵌入式系统具有兴趣...

    06-27
  • 51单片机超声波测距程序详解

    51单片机超声波测距程序详解 超声波四通道测距:超声波测距实现分为三大块: 其一是12864带字库的液晶驱动程序: 代码如下: /////////////////12864驱动程序/////////////////////////// //1写数据 void WriteDat...

    06-25
  • 51系列单片机的引脚图

    51系列单片机的引脚图 端子介绍 l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8...

    06-25
  • 51单片机串口通信需要加超时中断吗?

    接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define u...

    06-25
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告