STM32项目分享:智能鞋柜

描述

项目成品图片:


 

STM32


 

 

项目简介


 

1.功能详解


 

STM32智能鞋柜

功能如下:


 

DHT11检测鞋柜温湿度,温度低于阈值开启加热,湿度高于阈值开启加热和通风;

PM2.5传感器检测粉尘浓度,当粉尘浓度值大于设置最大值,进行通风
 

MQ-135检测鞋柜空气质量,过高时启动紫外线杀菌
 

光电红外传感器检测柜门状态,关闭时,自动打开消毒灯,打开时,消毒灯关闭
 

光敏传感器检测光照值,光照值低于阈值且鞋柜门打开时,开启灯光
 

按键可调节阈值
 

显示屏显示当前测量值
 

蓝牙模块将测量数据发送到手机端,并可以控制加热、除湿、通风、消毒、照明以及模式切换


 

2.材料清单

STM32F103C8T6单片机

OLED 屏幕
 

DHT11温湿度传感器
 

PM2.5粉尘传感器
 

MQ-135空气质量传感器
 

光电红外传感器
 

光敏传感器
 

BT04A蓝牙模块
 

加热片
 

风扇模块
 

UV消毒灯
 

照明灯
 

有源蜂鸣器

 


 

02


 

原理图设计


 

STM32


 

03

PCB硬件设计


 

   PCB图

STM32STM32


 

04

程序设计

 

  •  

#include "sys.h"#include "stdio.h"#include "usart.h"#include "stdlib.h"#include "math.h"#include "delay.h"#include "gpio.h"#include "key.h"#include "oled.h"#include "usart.h"#include "dht11.h"#include "adc.h"#include "pm25.h"

/**********************************变量定义**********************************/uint8_t key_num = 0;//按键扫描标志位uint8_t flag_display = 0;//显示界面标志位uint32_t time_num = 0;//10ms计时char display_buf[32];//显示缓存区
_Bool flag_mode = 0;                  //模式标志位int jr_flag = 0;int xd_flag = 0;int tf_flag = 0;int zm_flag = 0;
u16 humi_value = 0;//鞋柜湿度值u16 humi_max = 70;//鞋柜湿度最大值u16 temp_value = 0;//鞋柜温度值u16 temp_min = 10;      //最小温度变量
u16 light_value = 0;//光照值u16 light_min = 50;  //光照最小值
u16 pm25_value = 0;                   //粉尘值u16 pm25_max = 250;                   //粉尘最大值
u16 nh_value = 0;                   //氨气值u16 nh_max = 80;                    //氨气最大值
extern uint8_t usart1_buf[256];//串口1接收数组

/**********************************函数声明**********************************/void Key_function(void);//按键函数void Monitor_function(void);//监测函数void Display_function(void);//显示函数void Manage_function(void);//处理函数

/***********主函数 *****/int main(void){Delay_Init();     //延时初始化  Gpio_Init();  //IO初始化Key_Init();  //按键初始化Oled_Init();  //OLED初始化Oled_Clear_All();//清屏Usart1_Init(9600);  //串口1初始化Adc_Init();//ADC初始化PM25_Init();//PM2.5初始化  while(DHT11_Init());//DHT11初始化Delay_ms(1000);Delay_ms(1000);
while(1){Key_function();//按键函数Monitor_function();//监测函数Display_function();//显示函数Manage_function();//处理函数
time_num++;//计时变量+1Delay_ms(10);    if(time_num %10 == 0)      LED_SYS = ~LED_SYS;if(time_num >= 5000){time_num = 0;}}}
/***********按键函数*****/void Key_function(void){key_num = Chiclet_Keyboard_Scan(0);//按键扫描if(key_num != 0)//有按键按下{switch(key_num){case 1://按键1:切换界面flag_display++;        if(flag_display >= 6)          flag_display = 0;Oled_Clear_All();//清屏break;
case 2://按键2:加键switch(flag_display){case 0://界面0:
break;
case 1://界面1:温度最小值+1if(temp_min < 99)temp_min++;break;
case 2://界面2:湿度最大值+1if(humi_max < 99)humi_max++;break;
case 3://界面3:粉尘最大值+1if(pm25_max < 650)pm25_max++;break;
case 4://界面4:氨气最大值+1if(nh_max < 300)nh_max++;break;
case 5://界面5:光照最小值+1if(light_min < 99)light_min++;break;

default:break;}break;
case 3://按键3:减键switch(flag_display){case 0://界面0:自动模式flag_mode = 0;break;
case 1://界面1:温度最小值-1if(temp_min > 0)temp_min--;break;
case 2://界面2:湿度最大值-1if(humi_max > 0)humi_max--;break;
case 3://界面3:粉尘最大值-1if(pm25_max > 0)pm25_max--;break;
case 4://界面4:氨气最大值-1if(nh_max > 0)nh_max--;break;
case 5://界面5:光照最小值-1if(light_min > 0)light_min--;break;
default:break;}break;
default:break;}}}
/***********监测函数*****/void Monitor_function(void){if(flag_display == 0)//测量界面{if(time_num % 10 == 0){Dht11_Get_Temp_Humi_Value(&temp_value,&humi_value);//获取温湿度值light_value = 100-30*(Get_Adc_Average(0,3)*3.3/4096.0);//获取光照强度
pm25_value = Pm25_Get_Value(3);//获取PM2.5
if(NH == 0)nh_value = 90*(Get_Adc_Average(4,3)*3.3/4096.0);//获取氨气值elsenh_value = 0;
if(time_num % 30 == 0)//发送测量数据{UsartPrintf(USART1,"\r\n温度:%d.%dC  湿度:%d.%d%%",temp_value/10,temp_value%10,humi_value/10,humi_value%10);UsartPrintf(USART1,"\r\n粉尘:%d  空气质量:%d",pm25_value,nh_value);UsartPrintf(USART1,"\r\n光照:%d  ",light_value);
if(DOOR == 1)UsartPrintf(USART1,"    柜门:关");elseUsartPrintf(USART1,"   柜门:开");
if(flag_mode == 0)UsartPrintf(USART1,"\r\n模式:自动");elseUsartPrintf(USART1,"\r\n模式:手动");}}
if(USART1_WaitRecive() == 0){if(usart1_buf[0] == 'A')flag_mode = 0;              //切换自动模式else if(usart1_buf[0] == 'B') {flag_mode = 1;              //切换手动模式jr_flag++;if(jr_flag%2==1){RELAY_JR= 1;                //开加热}elseRELAY_JR = 0;}
else if(usart1_buf[0] == 'C') {flag_mode = 1;              //切换手动模式tf_flag++;if(tf_flag%2==1){RELAY_TF= 1;                //开通风}elseRELAY_TF = 0;}
else if(usart1_buf[0] == 'D') {flag_mode = 1;              //切换手动模式xd_flag++;if(xd_flag%2==1){RELAY_XD = 1;               //开消毒}elseRELAY_XD = 0;}
else if(usart1_buf[0] == 'E') {flag_mode = 1;              //切换手动模式zm_flag++;if(zm_flag%2==1){RELAY_ZM = 1;               //开照明}elseRELAY_ZM = 0;
}

USART1_Clear();}}}
/***********显示函数*****/void Display_function(void){switch(flag_display)//根据不同的显示模式标志位,显示不同的界面{case 0://界面0:测量界面,显示测量值及模式Oled_ShowCHinese(1,0,"温");sprintf(display_buf,":%d.%dC ",temp_value/10,temp_value%10);Oled_ShowString(1, 2, display_buf);
Oled_ShowCHinese(1,4,"湿");sprintf(display_buf,":%d.%d%% ",humi_value/10,humi_value%10);Oled_ShowString(1, 10, display_buf);
Oled_ShowCHinese(2,0,"粉");sprintf(display_buf,":%d  ",pm25_value);Oled_ShowString(2, 2, display_buf);
Oled_ShowCHinese(2,4,"气");sprintf(display_buf,":%d  ",nh_value);Oled_ShowString(2, 10, display_buf);
 Oled_ShowCHinese(3,0,"光");sprintf(display_buf,":%d  ",light_value);Oled_ShowString(3, 2, display_buf);
Oled_ShowCHinese(3,4,"柜门");Oled_ShowString(3, 12, ":");
if(DOOR == 1)Oled_ShowCHinese(3,7,"关");elseOled_ShowCHinese(3,7,"开");
if(flag_mode == 1)Oled_ShowCHinese(4,2,"手动模式");elseOled_ShowCHinese(4,2,"自动模式");
break;
case 1://界面1:显示设置温度最小值Oled_ShowCHinese(1,0,"设置温度最小值");if(time_num % 5 == 0){sprintf(display_buf,"%d  ",temp_min);Oled_ShowString(2, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(2, 7, "    ");}break;
case 2://界面2:显示设置湿度最大值Oled_ShowCHinese(1,0,"设置湿度最大值");if(time_num % 5 == 0){sprintf(display_buf,"%d  ",humi_max);Oled_ShowString(2, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(2, 7, "    ");}break;
case 3://界面3:显示设置粉尘最大值Oled_ShowCHinese(1,0,"设置粉尘最大值");if(time_num % 5 == 0){sprintf(display_buf,"%d  ",pm25_max);Oled_ShowString(2, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(2, 7, "    ");}break;
case 4://界面4:显示设置氨气最大值Oled_ShowCHinese(1,0,"空气质量最大值");if(time_num % 5 == 0){sprintf(display_buf,"%d  ",nh_max);Oled_ShowString(2, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(2, 7, "    ");}break;
case 5://界面5:显示设置光照最小值Oled_ShowCHinese(1,0,"设置光照最小值");if(time_num % 5 == 0){sprintf(display_buf,"%d  ",light_min);Oled_ShowString(2, 7, display_buf);}if(time_num % 10 == 0){Oled_ShowString(2, 7, "    ");}break;
default:break;}}
/***********处理函数*****/void Manage_function(void){if(flag_display == 0)//测量界面{if(flag_mode == 0){if(DOOR == 1)        //如果鞋柜门是关闭的,关照明灯,如果氨气超高,开消毒灯      {        RELAY_ZM = 0;if(nh_max < nh_value){RELAY_XD = 1;
}        else{RELAY_XD = 0;}      }      else                      //如果鞋柜门是打开的,关消毒,如果光照低于最小值开照明灯      {        RELAY_XD = 0;        if(light_value < light_min)        {          RELAY_ZM = 1;        }        else        {          RELAY_ZM = 0;        }      }
if(temp_value < temp_min*10 || humi_value > humi_max*10)      {                             //如果温度低于最小值或湿度大于最大值,那么打开加热        RELAY_JR = 1;      }      else      {        RELAY_JR = 0;      }
if(humi_value > humi_max*10||pm25_value > pm25_max){//如果是湿度大于最大值或粉尘大于最大值开通风RELAY_TF = 1;}else{RELAY_TF = 0;}

if(nh_max < nh_value||pm25_value > pm25_max){BEEP=1;}elseBEEP=0;
}}else//设置界面,关闭所有继电器{RELAY_ZM = 0;    RELAY_TF = 0;    RELAY_JR = 0;    RELAY_XD = 0;}}

 


 

05

实验效果

STM32STM32


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分