系统运行后,LCD1604显示传感器检测的环境温湿度、土壤湿度、光照强度、CO2浓度和阈值;可通过上位机远程观察传感器采集的数据显示;可通过K3键进入阈值设置模式,K1和K2调节,K4确定。如果温度高于上限,散热;如果温度低于下限,加热;如果温度正常,关闭;如果湿度高于上限,除湿;如果湿度低于下限,加湿;如果湿度正常,关闭;如果土壤湿度低于下限,加水;如果光照低于下限,补光;如果CO2高于上限,排气;
/*
作者:嗨小易(QQ:3443792007)
*/
//系统数据显示
void sys_data_show(void)
{
static u8 cnt=0;
while(1)
{
if(sys_ctrl.mode==0)
{
//DHT11温湿度显示
lcd1604_show_nums(3,0,sys_ctrl.temp,2,0);
lcd1604_show_nums(3,1,sys_ctrl.humi,2,0);
//土壤湿度显示
lcd1604_show_nums(3,2,sys_ctrl.trhumi,2,0);
//光照强度显示
lcd1604_show_nums(13,2,sys_ctrl.light,2,0);
//CO2浓度显示
lcd1604_show_nums(4,3,sys_ctrl.co2,2,0);
//温度阈值显示
lcd1604_show_nums(7,0,sys_ctrl.templ,2,0);
lcd1604_show_nums(10,0,sys_ctrl.temph,2,0);
//湿度阈值显示
lcd1604_show_nums(7,1,sys_ctrl.humil,2,0);
lcd1604_show_nums(10,1,sys_ctrl.humih,2,0);
//土壤湿度阈值显示
lcd1604_show_nums(7,2,sys_ctrl.trhumil,2,0);
//光照阈值显示
lcd1604_show_nums(13,3,sys_ctrl.lightl,2,0);
//CO2阈值显示
lcd1604_show_nums(8,3,sys_ctrl.co2h,2,0);
//发送数据到远程APP
cnt++;
if(cnt%10==0)
{
printf("\r\n温度:%d°C,湿度:%d%%\r\n",sys_ctrl.temp,sys_ctrl.humi);
printf("土壤湿度:%d%%\r\n",sys_ctrl.trhumi);
printf("光照强度:%d%%\r\n",sys_ctrl.light);
printf("CO2浓度:%d%%\r\n",sys_ctrl.co2);
}
}
//阈值闪烁
switch(sys_ctrl.mode)
{
case 1://温度下
lcd1604_show_string(7,0," ");
delay_ms(1);
lcd1604_show_nums(7,0,sys_ctrl.templ,2,0);
break;
case 2://温度上
lcd1604_show_string(10,0," ");
delay_ms(1);
lcd1604_show_nums(10,0,sys_ctrl.temph,2,0);
break;
case 3://湿度下
lcd1604_show_string(7,1," ");
delay_ms(10);
lcd1604_show_nums(7,1,sys_ctrl.humil,2,0);
break;
case 4://湿度上
lcd1604_show_string(10,1," ");
delay_ms(1);
lcd1604_show_nums(10,1,sys_ctrl.humih,2,0);
break;
case 5://土壤湿度
lcd1604_show_string(7,2," ");
delay_ms(1);
lcd1604_show_nums(7,2,sys_ctrl.trhumil,2,0);
break;
case 6://光照
lcd1604_show_string(13,3," ");
delay_ms(1);
lcd1604_show_nums(13,3,sys_ctrl.lightl,2,0);
break;
case 7://CO2
lcd1604_show_string(8,3," ");
delay_ms(1);
lcd1604_show_nums(8,3,sys_ctrl.co2h,2,0);
break;
}
break;
}
}
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
key=KEY_Scan(0);
//模式设置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>7)sys_ctrl.mode=1;
}
//在设置模式下,加
else if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://温度下
sys_ctrl.templ++;
if(sys_ctrl.templ>99)sys_ctrl.templ=0;
break;
case 2://温度上
sys_ctrl.temph++;
if(sys_ctrl.temph>99)sys_ctrl.temph=0;
break;
case 3://湿度下
sys_ctrl.humil++;
if(sys_ctrl.humil>99)sys_ctrl.humil=0;
break;
case 4://湿度上
sys_ctrl.humih++;
if(sys_ctrl.humih>99)sys_ctrl.humih=0;
break;
case 5://土壤湿度下
sys_ctrl.trhumil++;
if(sys_ctrl.trhumil>99)sys_ctrl.trhumil=0;
break;
case 6://光照下
sys_ctrl.lightl++;
if(sys_ctrl.lightl>99)sys_ctrl.lightl=0;
break;
case 7://CO2上
sys_ctrl.co2h++;
if(sys_ctrl.co2h>99)sys_ctrl.co2h=0;
break;
}
}
//在设置模式下,减
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://温度下
sys_ctrl.templ--;
if(sys_ctrl.templ<0)sys_ctrl.templ=99;
break;
case 2://温度上
sys_ctrl.temph--;
if(sys_ctrl.temph<0)sys_ctrl.temph=99;
break;
case 3://湿度下
sys_ctrl.humil--;
if(sys_ctrl.humil<0)sys_ctrl.humil=99;
break;
case 4://湿度上
sys_ctrl.humih--;
if(sys_ctrl.humih<0)sys_ctrl.humih=99;
break;
case 5://土壤湿度下
sys_ctrl.trhumil--;
if(sys_ctrl.trhumil<0)sys_ctrl.trhumil=99;
break;
case 6://光照下
sys_ctrl.lightl--;
if(sys_ctrl.lightl<0)sys_ctrl.lightl=99;
break;
case 7://CO2上
sys_ctrl.co2h--;
if(sys_ctrl.co2h<0)sys_ctrl.co2h=99;
break;
}
}
//确定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
}
}
//应用控制系统
void appdemo_show(void)
{
u8 i=5;
sys_parm_init();//系统参数初始化
DHT11_Init();
KEY_Init();
ctrl_pin_init();
pcf8591_init();
USART1_Init(9600);
while(i--)
{
//读取DHT11温湿度值
DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
//获取土壤湿度
sys_ctrl.trhumi=pcf8591_read_adcvalue(0);
sys_ctrl.trhumi=pcf8591_read_adcvalue(0);
sys_ctrl.trhumi=cal_map(sys_ctrl.trhumi,0,255,0,99);
//获取光照强度
sys_ctrl.light=pcf8591_read_adcvalue(1);
sys_ctrl.light=pcf8591_read_adcvalue(1);
sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,99);
//获取CO2浓度
sys_ctrl.co2=pcf8591_read_adcvalue(2);
sys_ctrl.co2=pcf8591_read_adcvalue(2);
sys_ctrl.co2=cal_map(sys_ctrl.co2,0,255,0,99);
delay_ms(100);
}
lcd1604_init();//LCD1604初始化
sys_open_show();//系统初始界面显示
while(1)
{
sys_data_get();//系统数据获取
sys_data_show();//系统数据显示
sys_data_set();//系统数据设置
sys_fun_ctrl();//系统功能控制
}
}
B站演示视频:https://space.bilibili.com/444388619
专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。