1:基于STM32的智能鞋盒

资源链接:

在文章头部CSDN直接下载免费的,不要积分和VIP大家直接下载。(好像只有电脑端看得见)

实物图片:

设计功能:

  1. LCD1602显示被测量的温度和湿度。
  2. 按键调整温湿度上下限,超过设定值继电器会控制加热和除湿器进行工作。
  3. 可以通过按键切换自动模式与手动模式。
  4. 通过蓝牙与手机连接,通过手机实现以上操作。

原理图:

展示代码:

#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控制函数
			
	}
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值