基于STM32单片机的定时加湿器设计
- 1、项目简介
- 1.1 系统功能
- 1.2 演示视频
- 2、部分电路设计
- 2.1 STM32单片机核心板电路设计
- 2.2 DHT11数字温湿度检测电路设计
- 2.3 LCD1602字符型液晶显示屏电路设计
- 2.4 DS1302实时时钟电路设计
- 3、单片机代码展示
- 3.1 系统初始化
- 3.2 时间显示程序
- 3.3 DHT11读取温湿度
- 3.4 DS1302初始化
1、项目简介
1.1 系统功能
- 功能介绍:
- LCD1602液晶显示当前温湿度,当前模式,湿度下限
- 按键设置湿度下限,当湿度低于下限时开启加湿器
- 第一个按键为设置,第二个湿度加,第三个湿度减
- 水位传感器检查加湿器是否有水,如果没有水到话加湿器不进行工作,蜂鸣器报警
- 自动模式下:当前湿度低于设置下限, 继电器闭合加湿器进行加湿
- 手动模式下:可以直接开启关闭加湿器。
- 定时模式下:通过DS1302时钟模块进行定时加湿,如果到了时间判断湿度是否在范围内,如果低于设置值则开启加湿,时间到自动关闭
1.2 演示视频
2、部分电路设计
2.1 STM32单片机核心板电路设计
- 基于 ARM Cortex-M3内核的STM32F1系列单片机属于主流STM32单片机,其中增强型STM32F103子系列单片机的CPU 主频高达72MHz,片内Flash容量高达1MB,芯片引脚数量多达144个,有 QFN、LQFP、CSP、BGA 等多种芯片封装形式,并具有多种片内外设、USB接口和CAN 接口。根据STM32F103单片机片内Flash容量的不同,ST 公司将其分为小容量(16-32KB)、中等容量(64-128KB)、大容量(256KB-1MB)3种。
- 电源电路:为单片机提供稳定的工作电压,通常采用3.3V电源供电。电源电路的设计要保证单片机在不同工作条件下都能获得稳定的电压输出,以确保单片机的正常工作。
- 晶振电路:提供单片机工作所需的时钟信号。晶振电路通过晶振和电容组成,为单片机提供稳定的工作脉冲,确保单片机的定时和同步需求。
- 复位电路:实现单片机的复位功能,类似于电脑的重启。复位电路通过电容和电阻的配合,实现单片机在上电启动时的自动复位,以及通过手动按键实现复位功能,保证单片机在程序跑飞或异常情况下能够重新开始执行程序。
STM32单片机是一种功能强大、易于使用、灵活且可靠的32位微控制器,基于ARM Cortex™-M内核。其主要功能特点包括:
- 高性能和低功耗:STM32系列单片机提供多种内核选择,如Cortex-M0、Cortex-M3、Cortex-M4等,满足不同应用场景对性能的需求,同时保持低功耗特性。
- 多种通信和外设接口:STM32单片机具备广泛的通信和外设接口,如I2C、SPI、USART、USB等,便于开发者实现各种复杂功能。
- 易于开发和调试:STM32单片机提供了丰富的软件和硬件工具,如HAL库、CubeMX等,帮助开发者快速创建和调试嵌入式系统。
- 高集成度和设计灵活性:STM32系列单片机全系列产品共用大部分引脚、软件和外设,优异的兼容性为开发人员带来最大的设计灵活性
单片机最小系统原理图如下图所示:
实物图:
2.2 DHT11数字温湿度检测电路设计
- 本系统采用DHT11作为湿度检测器件,DHT11数字温湿度传感器包括一个NTC测温元件和一个电阻式测湿元件,可以和高性能的8位单片机相连,是一块可以同时检测温湿度的数字传感器。通过和单片机等微处理器构成简单的电路,就能够实时的检测采集室内相对温湿度。因此具有性能稳定、响应迅速、抗干扰能力强且性价比高等优点。
- DHT11和单片机之间利用简单的单总线可以实现通信,仅仅需要一个I/O口。传感器内部的温湿度数据可以一次性的传给单片机。
其具体电路原理图如下图所示:
实物图如下:
*
2.3 LCD1602字符型液晶显示屏电路设计
- LCD1602是一款工业字符型液晶,可以显示两行数据,每行可以显示十六个符号、字母或者数字,刚好可以满足设计的需要。它体积小巧,功耗较低,显示效果良好,是一款非常实用的液晶显示设备。 LCD 1602有16个引脚。
- LCD1602工作在3.5V~5V的工作电压下,它内部设计有复位电路,可以进行光标移动、清屏的操作。显示的亮度可以通过外部连接的电位计进行调节。内部带有存储器可以储存数据。它可以直接与单片机相连接,通过单片机程序来控制液晶的显示。
其具体电路原理图如下图所示:
实物图如下:
2.4 DS1302实时时钟电路设计
- DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
- DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
其具体电路原理图如下图所示:
实物图:
3、单片机代码展示
3.1 系统初始化
void HardWare_Init(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
KEY_Init();
DHT11_Init();
DHT11_Read_Data(&U8T_data_H,&U8RH_data_H);
delay_ms(300);
DS1302_Init(&SysDate); //DS1302初始化
LCD_Init();
LCD_Write_String(0, 0, "00/00/00 <ZD>");
LCD_Write_String(0, 1, "00:00:00 00C 00%");
DS1302_DateRead(&SysDate);//读时间
}
3.2 时间显示程序
void displayTime(void)
{
//显示时间
LCD_Write_Com(0x80);
LCD_Write_Data(SysDate.year/10+0x30);
LCD_Write_Data(SysDate.year%10+0x30);
LCD_Write_Data('/');
LCD_Write_Data(SysDate.mon/10+0x30);
LCD_Write_Data(SysDate.mon%10+0x30);
LCD_Write_Data('/');
LCD_Write_Data(SysDate.day/10+0x30);
LCD_Write_Data(SysDate.day%10+0x30);
LCD_Write_Com(0x80+0x40);
LCD_Write_Data(SysDate.hour/10+0x30);
LCD_Write_Data(SysDate.hour%10+0x30);
LCD_Write_Data(':');
LCD_Write_Data(SysDate.min/10+0x30);
LCD_Write_Data(SysDate.min%10+0x30);
LCD_Write_Data(':');
LCD_Write_Data(SysDate.sec/10+0x30);
LCD_Write_Data(SysDate.sec%10+0x30);
}
3.3 DHT11读取温湿度
/*******************************************************************************
函数名:DHT11_Read_Data
功能:从DHT11读取温湿度
输入:
输出:
返回值:0读取成功。1读取失败
备注:
*******************************************************************************/
u8 DHT11_Read_Data(u8 *Tdata,u8 *RHdata)
{
unsigned char i;
unsigned char BUF[5];
if(DHT11_Init()==0)
{
for (i=0; i<5; i++)//循环5次,读5个字节
{
BUF[i] = DHT11_ReadByte();
}
if((BUF[0]+BUF[1]+BUF[2]+BUF[3])==BUF[4])//校验
{
*RHdata=BUF[0];//湿度值
*Tdata =BUF[2];//温度值
}
}
else
{
return 1; //读取失败
}
return 0; //读取成功
}
3.4 DS1302初始化
/**
* @brief DS1302初始化
* @param 日期/时间结构体指针
* @note 如果是充电电池,可以开启在正常情况下电源对电池的涓流充电功能,只有在异常情况下才使用电池供电
* @note 直接利用DS1302片上RAM实现 1>如果是第一次上电,则设置日期/时间 2>否则,就不需要设置日期/时间
*/
int DS1302_Init(const DATE * const date)
{
DS1302_GPIO_Init();//引脚初始化
if (BcdToData(DS1302_ReadByte(READ_RAM_REG)) == 0x01) /* 如果不是第一次上电,则直接退出 */
{
return 0;
}
DS1302_WriteByte(WRITE_CONTROL_REG, 0x00); /* 去除写保护 */
// DS1302_WriteByte(WRITE_CHARGE_REG, 0xa9); /* 使能电池涓流充电功能(一定要是充电电池才可以使用此功能!!!) */
DS1302_WriteByte(WRITE_RAM_REG, DataToBcd(0x01));//标志写1
DS1302_WriteByte(WRITE_CONTROL_REG, 0x80); /* 加上写保护 */
DS1302_DateSet(date);
return 0;
}