作者主页:编程千纸鹤
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与各位高校教师、企业讲师以及同行交流合作
主要内容:Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能与大数据、单片机开发、物联网设计与开发设计、简历模板、学习资料、面试题库、技术互助、就业指导等
业务范围:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文降重、长期答辩答疑辅导、腾讯会议一对一专业讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路等。
收藏点赞不迷路 关注作者有好处
文末获取源码
项目编号:BS-DPJ-022
一,环境介绍
语言环境:C语言嵌入式
技术实现:STM32
硬件构成:单片机+液晶显示+按键+蓝牙+红外感应+光敏电阻+照明灯+温湿度传感器+换气除湿+消毒+步进电机
二,项目简介
在当今社会,随着智能化家庭的出现以及人们生活质量的不断提升,传统的衣柜已不能适应现代家庭日益增长的需要。传统的衣柜只有一个功能,就是用来进行简单的储藏,而在气候湿润的情况下,衣服很可能会滋生细菌、霉菌,这会让使用者在穿衣服、找衣服等方面产生不便。针对以上问题,本设计提出了一种以单片机为核心的智能家居衣柜控制系统。
本文提出了一种以单片机为核心的智能家庭衣柜控制系统,并配备了温度,湿度,红外等多种传感器。该传感器可以对衣柜内的温度、湿度以及衣柜的开启和关闭情况进行实时监控。在发现衣柜中的温度超出了规定的限值后,系统就会自动开启风机,为衣柜降温、送风;如果空气中的湿度超出了规定的限制,那么系统就会自动开启风扇来干燥空气。这款基于单片机的智能家居衣柜控制系统不仅解决了传统衣柜的使用问题,而且还增加了多种实用功能,系统配备无线蓝牙,用户可以远程查看。为用户提供了更加便捷、智能化的衣物存储解决方案。
功能简述:
1. 温湿度采集当前环境温度和湿度,液晶显示当前衣柜温度,湿度,模式
2. 当湿度大于设置湿度上限液晶闪烁提醒
3. 可以通过按键对温湿度阈值进行设置
4. 大于设置湿度上限,继电器闭合开启风扇,除湿换气
开启消毒,一分钟后自动关闭,液晶显示XD
小于设置湿度上限,继电器断开关闭风扇
5. 红外感应到有人需要开门,电机正转,外再次感应到则关门,电机反转
6. 当开门后光敏检测当前衣柜光线强弱,
光线暗:点亮LED照明灯亮进行照明
光线强,关闭LED照明灯
手动模式下
7. 按键控制功能开关
蓝牙无线传输:
8. 通过蓝牙模块手机端传输当前温湿度,湿度上限
9 通过手机端可以设置湿度上限
三,系统展示
四,核心代码展示
#include "common.h"
#include "lcd1602.h"
#include "StepMotor.h"
#include "uart.h"
#include "dht.h"
#define UART_RX_BUF RX1_Buffer
#define UART_RX_Count RxCounter
#define UART_BUF_SIZE COM_RX1_Lenth
extern unsigned char U8RH_data_H;
extern unsigned char U8T_data_H;
sbit LED_XD = P1^0;//消毒LED
sbit LED_KM = P1^1;//开门LED
sbit LED_ZM = P1^2;//照明LED
sbit key1 = P1^3;//切换模式
sbit key2 = P1^4;//设置
sbit key3 = P1^5;//加/消毒
sbit key4 = P1^6;//减/开启关闭
sbit HW = P3^5;//红外传感器
sbit GM = P3^6;//光敏传感器
sbit RELAY = P3^7;//继电器
unsigned char HumiMax = 70;//湿度上限
unsigned char setn = 0;//设置标志
unsigned char miao = 0;//消毒时间
uchar MotorTime=0;//步进电机开启时间
unsigned char temperature;
unsigned char humidity;
bit OpenFlag = 0;
bit shanshuo = 0;
bit shuaxin=0;
bit mode=0; //0是手动模式,1是自动模式
bit sendFlag=0;
bit motorStopFlag=1;
bit displayFlag=0;
void Timer0Init(void)//11.0592M,定时50ms
{
TMOD |= 0x01;//定时器0,工作方式1
TL0 = 0x00; //50ms
TH0 = 0x4C;
ET0 = 1;//定时器0中断开启
TR0 = 1;//定时器0开始计时
EA = 1;//总中断开关开启
}
void display_mode(void) //显示模式
{
if(mode==0)lcd_write_str(0,1,"M:<Manual>");
else lcd_write_str(0,1,"M:< Auto >");
}
void display_state(void) //显示状态
{
if(OpenFlag==1){lcd_write_str(11,1,"OPEN");LED_KM=0;}
else {lcd_write_str(11,1," ");LED_KM=1;}
}
void keyscan(void)
{
if(key1 == 0)//切换模式
{
delay_ms(10);//消抖
if(key1 == 0)
{
while(key1 == 0);//等待按键松开
if(setn == 0)
{
mode = !mode;
display_mode();
}
}
}
if(key2 == 0)//设置按键
{
delay_ms(10);//消抖
if(key2 == 0)
{
while(key2 == 0);//等待按键松开
setn ++;
if(setn == 1)
{
lcd_write_str(0,0,"set the Humidity");
lcd_write_str(0,1,"max: 00% ");
lcd_write_char(8,1,HumiMax/10+0x30);
lcd_write_char(9,1,HumiMax%10+0x30);
}
if(setn >= 2) //退出设置
{
setn = 0;
lcd_write_str(0,0," C Humi: % ");
lcd_write_str(0,1," ");
lcd_write_char(2,0,0xdf);
display_mode();
}
}
}
if(key3 == 0)//加/消毒按键
{
delay_ms(10);
if(key3 == 0 )
{
while(key3 == 0);
if(setn == 0) //不在设置状态下是开启消毒
{
miao = 60;//消毒时间赋值1分钟
LED_XD = 0;//消毒灯亮起
}
else //在设置状态下。湿度上限加
{
if(HumiMax < 99)HumiMax++;
lcd_write_char(8,1,HumiMax/10+0x30);
lcd_write_char(9,1,HumiMax%10+0x30);
}
}
}
if(key4 == 0)//减/开启关闭
{
delay_ms(10);
if(key4 == 0)
{
while(key4 == 0);//等待按键松开
if(setn == 0)//不在设置状态下是开关门
{
if(mode==0)
{
OpenFlag = !OpenFlag;
display_state();
}
}
else //在设置状态下。湿度上限减
{
if(HumiMax > 0)HumiMax--;
lcd_write_char(8,1,HumiMax/10+0x30);
lcd_write_char(9,1,HumiMax%10+0x30);
}
}
}
}
void MotoHandle(void)//步进电机控制
{
static uchar djcount=0;//延时
if(OpenFlag == 1)
{
if(djcount < 100){djcount++;MotorCW();motorStopFlag=0;}//电机正转一段时间
else {MotorStop();motorStopFlag=1;}//电机停止
}
else
{
if(djcount > 0){djcount--;MotorCCW();motorStopFlag=0;}//电机反转一段时间
else {MotorStop();motorStopFlag=1;}//电机停止
}
}
void UsartSendReceiveData(void)
{
char *str1=0,i;
int setValue=0;
char setvalue[3]={0};
char xdata SEND_BUF[30];
if(UART_RX_Count > 0)
{
delay_ms(10);
if(strstr(UART_RX_BUF,"humi:")!=NULL)
{
str1 = strstr(UART_RX_BUF,"humi:");
while(*str1 < '0' || *str1 > '9') //判断是不是0到9有效数字
{
str1 = str1 + 1;
delay_ms(10);
}
i = 0;
while(*str1 >= '0' && *str1 <= '9') //判断是不是0到9有效数字
{
setvalue[i] = *str1;
i ++; str1 ++;
if(*str1 == '\r')break; //换行符,直接退出while循环
delay_ms(10);
}
setvalue[i] = '\0'; //加上结尾符
setValue = atoi(setvalue);
if(setValue>=0 && setValue<=99)
{
HumiMax = setValue; //设置的温度值
if(setn == 1)
{
lcd_write_char(8,1,HumiMax/10+0x30);
lcd_write_char(9,1,HumiMax%10+0x30);
}
}
}
if(strstr(UART_RX_BUF,"auto_mode")!=NULL)
{
mode = 1;
if(setn == 0)
{
display_mode();
}
}
if(strstr(UART_RX_BUF,"xiaodu")!=NULL)
{
miao = 60;//消毒时间赋值1分钟
LED_XD = 0;//消毒灯亮起
}
if(strstr(UART_RX_BUF,"manual_mode")!=NULL)
{
mode = 0;
if(setn == 0)
{
display_mode();
}
}
if(mode == 0)
{
if(strstr(UART_RX_BUF,"manual_on")!=NULL)
{
OpenFlag = 1;
display_state();
}
if(strstr(UART_RX_BUF,"manual_off")!=NULL)
{
OpenFlag = 0;
display_state();
}
}
memset(UART_RX_BUF,0,UART_BUF_SIZE);
UART_RX_Count = 0;
}
if(sendFlag==1) //1秒钟上传一次数据
{
sendFlag = 0;
memset(SEND_BUF,0,sizeof(SEND_BUF)); //清空缓冲区
sprintf(SEND_BUF,"$temp:%d#,$humi:%d#",(int)temperature,(int)humidity);
if(motorStopFlag)
uart_send(SEND_BUF,0xFF);
}
}
void main()
{
lcd_init();//1602液晶初始化
lcd_clear();
lcd_write_str(0,0,"00 C Humi:00% ");
lcd_write_str(0,1,"M:<Manual> ");
lcd_write_char(2,0,0xdf);
do
{
RH();delay_ms(100);
}while(U8RH_data_H==0&&U8T_data_H==0);
Timer0Init();
uart_init(9600);
while(1)
{
keyscan();//按键扫描
if(displayFlag)
{
if(setn==0)display_state();
displayFlag=0;
}
if(shuaxin==1 && setn==0)//延时一段时间
{
shuaxin=0;
if(miao>0)lcd_write_str(14,0,"XD");else lcd_write_str(14,0," ");
RH();//读取温湿度
//读出温湿度,只取整数部分
humidity = U8RH_data_H;
temperature = U8T_data_H;
lcd_write_char(0,0,temperature/10+0x30);
lcd_write_char(1,0,temperature%10+0x30);
if(humidity>=HumiMax&&shanshuo)
{
lcd_write_char(10,0,' ');
lcd_write_char(11,0,' ');
lcd_write_char(12,0,' ');
}
else
{
lcd_write_char(10,0,humidity/10+0x30);
lcd_write_char(11,0,humidity%10+0x30);
lcd_write_char(12,0,'%');
}
if(humidity>=HumiMax)RELAY=0; else RELAY=1;//湿度低高于上限,开启除湿
}
UsartSendReceiveData();
delay_ms(1);
}
}
void Tim0_str()interrupt 1//定时器中断函数,50ms执行一次中断函数
{
static uint count=0,count1=0;
static bit hw_handle=0;
TL0 = 0x00;
TH0 = 0x4C;
if(HW==0) //红外感应
{
hw_handle=1;
}
else
{
if(hw_handle==1 && mode==1)
{
OpenFlag = !OpenFlag;
displayFlag=1;
}
hw_handle = 0;
}
if(OpenFlag==1 && GM ==1)LED_ZM=0;else LED_ZM=1;//开门后光线暗。开灯
MotoHandle();
if(count1++ >= 10)//500毫秒
{
count1 = 0;
shanshuo = !shanshuo;
shuaxin=1;
}
if(count++ >= 20)//1秒时间到
{
count = 0;
sendFlag=1;
if(miao>0)miao--;
else LED_XD = 1;//消毒时间计时完毕,熄灭LED
}
}
五,相关作品展示
基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目
基于Nodejs、Vue等前端技术开发的前端实战项目
基于微信小程序和安卓APP应用开发的相关作品
基于51单片机等嵌入式物联网开发应用
基于各类算法实现的AI智能应用
基于大数据实现的各类数据管理和推荐系统