功能介绍:采用stm32单片机作为主控CPU,采用DHT11传感器采集温湿度,采用光敏传感器采集光照强度,通过按键设置温湿度、光照的阈值,当温度高于设置值,继电器开启散热,当湿度低于设置值,继电器开启加湿,当光敏值大于设置值,继电器打开进行补光,LCD1602显示相关数据,程序中文注释,新手容易看懂,文末有资料分享下载链接:
下面是实物演示视频和相关实物图片
72-基于stm32单片机农业大棚温湿度光照检测报警系统(程序+原理图+元件清单全套资料)
下面是程序部分展示(程序有中文注释,新手容易看懂)
程序部分展示:
void ADC_Set(void)
{
ADC_InitTypeDef ADC_InitStructure;//ADC结构体变量//注意在一个语句快内变量的声明要放在可执行语句的前面,否则出错,因此要放在ADC1_GPIO_Config();前面
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //使能扫描
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换,不使用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为1
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_28Cycles5);
ADC_Cmd(ADC1, ENABLE);//使能ADC1
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
int wendu,shidu,guangqiang; //保存温度 湿度 光强
int xiaoshi=70,fenzhong=20;// 湿度设定 光强设定
//这里对按键进行扫描
void anjiansaomiao(void)
{
static u8_t k1,k2,k3,k4,k5;
static u8_t K1Flag=0,K2Flag=0,K3Flag=0,K4Flag=0;
//按键扫描,获取按键状态
k1 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_6);
k2 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_7);
k3 = GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_8);
if(k1 == 0)//设置温度
{
wendu1++;
if(wendu1>99) wendu1=1;
}
if(k2 == 0)//设置湿度
{
shidu1++;
if(shidu1>99) shidu1=1;
}
if(k3 == 0)//设置光照
{
gm=gm+10;
if(gm>500) gm=1;
}
}
//中断优先级配置
void NVICConfig(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //中断源:[15:10],位于“stm32f10x.h”中
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级:1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级:1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure);
}
//定时器设置1
void TimerConfig(TIM_TypeDef* TIMx,unsigned int time)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIMx);
TIM_TimeBaseStructure.TIM_Period = time * 2; /* 自动重装载寄存器周期的值(计数值) */
/* 累计 TIM_Period个频率后产生一个更新或者中断 */
TIM_TimeBaseStructure.TIM_Prescaler= (4000- 1); /* 时钟预分频数 例如:时钟频率=72MHZ/(时钟预分频+1) */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; /* 采样分频 */
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIMx, TIM_FLAG_Update); /* 清除溢出中断标志 */
TIM_ITConfig(TIMx,TIM_IT_Update,ENABLE);
}
程序打开办法:特别注意:下载资料包以后一定要先解压!!!(建议解压到桌面上,文件路径太深会导致程序打开异常),解压后再用keil5打开。
原理图采用【AD】altium designer打开,文件中有安装包