一:功能介绍
1、采用stm32单片机+LCD1602+DHT11温湿度传感器+继电器+按键+电机+蜂鸣器,制作一个基于stm32单片机智能自动浇花灌溉系统;
2、通过DHT11传感器采集当前的温湿度,显示到LCD1602上面;
3、通过按键设置湿度阈值,每按一下蜂鸣器会滴提醒一下,显示到LCD1602上面;
4、当检测到的湿度低于当前设置湿度阈值,继电器自动打开,浇水电机开启工作自动浇水;
二:仿真演示视频+程序简要讲解:(程序有中文注释,新手容易看懂)
三:设计软件介绍
本设计使用C语言编程设计,程序代码采用keil5编写,程序有中文注释,新手容易看懂,仿真采用Proteus软件进行仿真,演示视频使用的是Proteus8.9版本;资料包里有相关软件包,可自行下载安装。
四:程序打开方法
特别注意:下载资料包以后一定要先解压!!!(建议解压到桌面上,文件路径太深会导致程序打开异常),解压后再用keil5打开。
程序部分展示,有中文注释,新手容易看懂
uint8_t lcd_dat1[20];
uint8_t lcd_dat2[20];
uint16_t temp_dat;
uint16_t hum_dat;
uint16_t set_hum_dat=50;
uint8_t setnum;
void KEY_IO_Init(void);
void EXTIx_Init(void);
void Relay_IO_Init(void);
void EXTI0_IRQHandler(void);
void EXTI1_IRQHandler(void);
void EXTI2_IRQHandler(void);
int main(void){
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
KEY_IO_Init();
Relay_IO_Init();
EXTIx_Init();
LCD_init();
LCD_clr();
DHT11_Init();
while(1)
{
if(DHT11_ReadData())
{
temp_dat=DHT11_GetTem();
temp_dat=temp_dat/256;
delay_ms(10);
hum_dat=DHT11_GetHum();
hum_dat=hum_dat/256;
}
sprintf(lcd_dat1,"T:%d C H:%d n",temp_dat,hum_dat);
LCD_prints(0,0,lcd_dat1);
if(setnum==0)
{
sprintf(lcd_dat2," SET:%d n",set_hum_dat);
LCD_prints(0,1,lcd_dat2);
}
if(setnum == 1)
{
sprintf(lcd_dat2," SET:%d *n",set_hum_dat);
LCD_prints(0,1,lcd_dat2);
}
if(hum_dat<set_hum_dat)
Relay1=1;
else
Relay1=0;
}
}
void KEY_IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void EXTIx_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line1|EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
setnum++;
buzzer=1;delay_ms(50);buzzer=0;delay_ms(50);
if(setnum > 1)
{
setnum=0;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
void EXTI1_IRQHandler(void)
{
buzzer=1;delay_ms(50);buzzer=0;delay_ms(50);
if(setnum == 1)
{
if(set_hum_dat<100)
set_hum_dat++;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
五:仿真文件(采用Proteus打开)
六:资料清单展示(文件中包含的相关资料)
资料下载链接(可点击)