资源链接:
在文章头部CSDN直接下载免费的,不要积分和VIP大家直接下载。(好像只有电脑端看得见)
实物图片:
设计功能:
- LCD1602显示被测量的温度和湿度。
- 按键调整温湿度上下限,超过设定值继电器会控制加热和除湿器进行工作。
- 可以通过按键切换自动模式与手动模式。
- 通过蓝牙与手机连接,通过手机实现以上操作。
原理图:
展示代码:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "dht11.h"
#include "adc.h"
#include "rs485.h"
#include "string.h"
#include "lcd1602.h"
int AT_len; //存放长度
char send_data[128];
u8 mode_run=0; //0=自动调控 1=手动调控
u16 number=0;
u8 timer=0;
u8 temperature;
u8 humidity;
u16 ds_time=0;
u16 ds_cnt=0;
u8 humi_L=40; //湿度阈值
u8 humi_H=70; //湿度阈值
u8 len;
u8 reg;
u8 str[] = "t: C h: ";
u8 section[]=" section: ";
u8 MODE=0; //0=主界面 1=设置
u8 key_number=0;
u8 app_set=0;
u8 app_add=0;
u8 app_del=0;
u8 app_mode=0;
u8 app_time=0;
void Key_scand()
{
if(KEY_SET==0||app_set==1)
{
delay_ms(10);
if(KEY_SET==0||app_set==1)
{
MODE=1;
key_number++;
if(key_number==1)
{
LCD1602_Set_Cursor(9,1);
LCD1602_Write_Cmd(0x0f);
printf("设置湿度下限\r\n");
}
if(key_number==2)
{
LCD1602_Set_Cursor(12,1);
LCD1602_Write_Cmd(0x0f);
printf("设置湿度上限\r\n");
}
if(key_number>=3)
{
key_number=0;
MODE=0;
LCD1602_Write_Cmd(0x0c);
printf("设置完成\r\n");
}
if(app_set==0)
while(!KEY_SET);
else
app_set=0;
}
}
if(MODE==1)
{
if(KEY_UP==0||app_add==1)
{
delay_ms(10);
if(KEY_UP==0||app_add==1) //按下加按键
{
if(key_number==1)
{
if(humi_L<100)
humi_L++;
LCD1602_Set_Cursor(9,1);
LCD1602_Write_Dat(humi_L/10 + 0x30); //湿度上限
LCD1602_Write_Dat(humi_L%10 + 0x30);
LCD1602_Set_Cursor(9,1);
LCD1602_Write_Cmd(0x0f);
printf("湿度下限值为:%d\r\n",humi_L);
}
if(key_number==2)
{
if(humi_H<100)
humi_H++;
LCD1602_Set_Cursor(12,1);
LCD1602_Write_Dat(humi_H/10 + 0x30); //湿度上限
LCD1602_Write_Dat(humi_H%10 + 0x30);
LCD1602_Set_Cursor(12,1);
LCD1602_Write_Cmd(0x0f);
printf("湿度上限值为:%d\r\n",humi_H);
}
delay_ms(200);
app_add=0;
}
}
if(KEY_DOWN==0||app_del==1)
{
delay_ms(10);
if(KEY_DOWN==0||app_del==1) //按下加按键
{
if(key_number==1)
{
if(humi_L>2)
humi_L--;
LCD1602_Set_Cursor(9,1);
LCD1602_Write_Dat(humi_L/10 + 0x30); //湿度上限
LCD1602_Write_Dat(humi_L%10 + 0x30);
LCD1602_Set_Cursor(9,1);
LCD1602_Write_Cmd(0x0f);
printf("湿度下限值为:%d\r\n",humi_L);
}
if(key_number==2)
{
if(humi_H>2)
humi_H--;
LCD1602_Set_Cursor(12,1);
LCD1602_Write_Dat(humi_H/10 + 0x30); //湿度上限
LCD1602_Write_Dat(humi_H%10 + 0x30);
LCD1602_Set_Cursor(12,1);
LCD1602_Write_Cmd(0x0f);
printf("湿度上限值为:%d\r\n",humi_H);
}
delay_ms(200);
app_del=0;
}
}
}
}
void APP_Control() //APP控制
{
if(reception == 1)
{
if(MODE==0)
{
if(strstr(USART_RX_BUF,"mode")) //切换模式
{
mode_run=!mode_run;
if(mode_run==0)
{
printf("切换为自动模式\r\n");
}
if(mode_run==1)
{
printf("切换为手动模式\r\n");
}
app_time=0;
}
}
if(strstr(USART_RX_BUF,"set")) //设置
{
app_set=1;
}
if(strstr(USART_RX_BUF,"add")) //加
{
app_add=1;
}
if(strstr(USART_RX_BUF,"del")) //减
{
app_del=1;
}
if(strstr(USART_RX_BUF,"time")) //定时
{
if(app_time<2)
{
if(app_time==0)
{
app_time=1;
printf("切换为定时模式\r\n");
printf("设置定时运行时间\r\n");
LED_A=1;
LED_H=1;
}
else
{
if(ds_time>0)
{
app_time=2;
printf("开始运行!运行时间为:%d分钟\r\n",ds_time);
LED_A=0;
LED_H=0;
}
else
{
app_time=1;
printf("请设定运行时间!\r\n");
}
}
}
else
{
printf("定时运行中!\r\n");
}
mode_run=2;
}
memset(USART_RX_BUF,'\0',sizeof USART_RX_BUF);//重置数组
reception=0;
}
}
int main(void)
{
u8 t=0;
u16 adcx,voltage;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
LCD1602_GPIO_Configuration(); //lcd1602液晶引脚初始化
delay_ms(200);
LCD1602_Init();
delay_ms(200);
LCD1602_Show_Str(0, 0, " Initializing ");
LCD1602_Show_Str(0, 1, " .... ");
uart1_init(9600); //串口1初始化波特率
delay_ms(200);
delay_ms(200);
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init();
while(DHT11_Init()) //DHT11初始化
{
delay_ms(200);
}
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
delay_ms(200);
delay_ms(200);
LCD1602_ClearScreen(); //清屏
LCD1602_Show_Str(0, 0, str);
LCD1602_Show_Str(0, 1, section);
LCD1602_Set_Cursor(4,0);
LCD1602_Write_Dat(0Xdf);
printf("开始运行!\r\n");
while(1)
{
if(MODE==0) //不在设置模式
{
if(t%100==0) //每100ms读取一次
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
//发送采集的数据到WiFi模块进行转发到APP中显示
// sprintf(send_data,"#%d#%d#%d#%d#%d#%d#%d#%d#%d#",temperature,humidity,light,mq135_data,temp_alarm,humi_alarm,light_alarm,mq135_alarm,mode);
// delay_ms(5);
// printf(send_data);
//显示温度
if(temperature>=10)
{
LCD1602_Set_Cursor(2,0);
LCD1602_Write_Dat(temperature/10 + 0x30);
LCD1602_Write_Dat(temperature%10 + 0x30);
}
else
{
LCD1602_Set_Cursor(2,0);
LCD1602_Write_Dat(temperature%10 + 0x30);
LCD1602_Write_Dat(0X20);
}
//湿度显示
if(humidity>=100)
{
LCD1602_Set_Cursor(10,0);
LCD1602_Write_Dat(humidity/100 + 0x30);
LCD1602_Write_Dat(humidity/10%10 + 0x30);
LCD1602_Write_Dat(humidity%10 + 0x30);
LcdPrintStr("%");
}
else if(humidity<100&&humidity>=10)
{
LCD1602_Set_Cursor(10,0);
LCD1602_Write_Dat(humidity/10%10 + 0x30);
LCD1602_Write_Dat(humidity%10 + 0x30);
//LCD1602_Set_Cursor(7,1);
LcdPrintStr("%");
LCD1602_Write_Dat(0X20);
}
else
{
LCD1602_Set_Cursor(10,0);
LCD1602_Write_Dat(humidity%10 + 0x30);
//LCD1602_Set_Cursor(6,1);
LcdPrintStr("%");
LCD1602_Write_Dat(0X20);
LCD1602_Write_Dat(0X20);
}
LCD1602_Set_Cursor(9,1);
LCD1602_Write_Dat(humi_L/10 + 0x30); //湿度上限
LCD1602_Write_Dat(humi_L%10 + 0x30);
LcdPrintStr("-");
LCD1602_Write_Dat(humi_H/10 + 0x30); //湿度下限
LCD1602_Write_Dat(humi_H%10 + 0x30);
LcdPrintStr("%");
if(humidity>humi_H) //湿度大于上限
{
LCD1602_Set_Cursor(13,0); //光标闪闪烁
LCD1602_Write_Cmd(0x0f);
}
else
{
LCD1602_Set_Cursor(13,0); //光标闪闪烁
LCD1602_Write_Cmd(0x0c);
}
}
delay_ms(10);
t++;
if(t==200)
t=0;
if(mode_run==0) //自动模式
{
LED_A=1;
LED_H=0;
if(humidity>humi_H) //湿度大于上限
{
LED_xd=0; //开启加热通风消毒
RELAY_tf=0;
if(temperature<40) //温度低于40开启加热
RELAY_jr=0;
else
RELAY_jr=1;
}
else
{
LED_xd=1; //关闭加热通风消毒
RELAY_tf=1;
RELAY_jr=1;
}
}
if(mode_run==1) //手动模式下
{
LED_A=0;
LED_H=1;
if(KEY_UP==0||app_add==1) //手动开
{
delay_ms(10);
if(KEY_UP==0||app_add==1)
{
LED_xd=0; //开启加热通风消毒
RELAY_tf=0;
if(temperature<40) //温度低于40开启加热
RELAY_jr=0;
else
RELAY_jr=1;
printf("手动开启!\r\n");
if(app_add==0)
while(!KEY_UP);
else
app_add=0;
}
}
if(KEY_DOWN==0||app_del==1) //手动关
{
delay_ms(10);
if(KEY_DOWN==0||app_del==1)
{
LED_xd=1; //关闭加热通风消毒
RELAY_tf=1;
RELAY_jr=1;
printf("手动关闭!\r\n");
if(app_del==0)
while(!KEY_DOWN);
else
app_del=0;
}
}
}
if(mode_run==2) //定时模式
{
if(app_time==1)
{
if(app_add==1) //手动开
{
if(ds_time<60)
ds_time++;
printf("定时运行时间为:%d 分钟\r\n",ds_time);
app_add=0;
}
if(app_del==1) //手动关
{
if(ds_time>1)
ds_time--;
printf("定时运行时间为:%d 分钟\r\n",ds_time);
app_del=0;
}
}
if(app_time==2)
{
LED_xd=0; //开启加热通风消毒
RELAY_tf=0;
if(temperature<40) //温度低于40开启加热
RELAY_jr=0;
else
RELAY_jr=1;
ds_cnt++;
if(ds_cnt>=ds_time*10*60)
{
ds_time=0;
ds_cnt=0;
app_time=0;
printf("定时运行结束!\r\n");
LED_xd=1; //关闭加热通风消毒
RELAY_tf=1;
RELAY_jr=1;
LED_A=1;
LED_H=1;
}
}
}
if(KEY_MODE==0)
{
delay_ms(10);
if(KEY_MODE==0)
{
mode_run=!mode_run;
if(mode_run==1)
{
LED_xd=1; //关闭加热通风消毒
RELAY_tf=1;
RELAY_jr=1;
}
while(!KEY_MODE);
}
}
}
Key_scand(); //按键设置
APP_Control(); //app控制函数
}
}