首页 > 其他分享 >单片机实战项目|基于stm32单片机的智能衣柜设计

单片机实战项目|基于stm32单片机的智能衣柜设计

时间:2024-09-23 09:20:09浏览次数:3  
标签:write char LED 10 void stm32 单片机 lcd 衣柜

作者简介: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智能应用

基于大数据实现的各类数据管理和推荐系统

 

 

标签:write,char,LED,10,void,stm32,单片机,lcd,衣柜
From: https://blog.csdn.net/znzbs/article/details/142448693

相关文章

  • 单片机实战项目|基于stm32单片机的智能衣柜设计
    作者主页:编程千纸鹤作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,有较为丰富的相关经验。期待与......
  • 手动移植FreeRTOS到stm32
    手动移植FreeRTOSstm32cubemx内置了freertos,如果不想手动移植,可以参考这个视频:https://www.bilibili.com/video/BV1To4UeVEHA/但手动移植可以加深自己的理解,可以参考下面这个视频:https://www.bilibili.com/video/BV1vUpje9Ej2?p=11以下内容是手动移植的过程记录使用stm32cub......
  • 用Eide下配合Cubemx配置stm32环境
    PS:本篇为个人学习的记录,一是方便回忆,二是相同时方便给像我一样的小白一点建议。本文默认已安装好STM32Cubemx和VSCode,以及VsCode下的EideCubemx部分选择好需要使用的对应单片机创建工程。在ProjectManager选项下选择Toolchain/IDE下的makefile方式来创建工程。什么是ma......
  • [51单片机 PROTEUS仿真设计]基于温度传感器的恒温控制系统
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于51单片机,具有晶振电路、复位电路、DS18B20温度传感器、LED灯和蜂鸣器灯光报警模块、LCD1602显示模块、L298N驱动电机散热模块和按键模块。主要功能:系统开始运行,显示屏显示最大温度阈值和最小......
  • 电赛毕设:基于stm32的非接触式交流电流检测装置
    需求如下:设计一种非接触式的交流电流检查装置1、基本要求:(1)由任意波信号发生器产生的信号经功率放大电路驱动后,通过导线连接1002电阻负载,形成一电流环路:(2)设计一采用非接触式传感的电流信号检测装置。2、发挥要求:(1)检测环路电流信号的幅度及频率(2)将信号的参数显示出来......
  • (六)Protues仿真STM32单片机控制8x8LED显示
    (六)Protues仿真STM32单片机控制8x8LED显示–ARMFUN1,配置CUBEMX,将PA0~7,PAB0~7配置为GPIOOUTPUT模式2,GPIOA负责8bit数据,高电平有效,GPIOB负责行选则,低电平有效,编写行刷新函数voiddisp_set_row(unsignedchardat,charsel){ GPIOB->ODR=0xff;//关闭行选,防止将数据......
  • STM32流水灯程序代码及解析:三种实现方式
    STM32流水灯程序代码及解析:三种实现方式在这篇文章中,我们将介绍三种方式来实现STM32的流水灯程序,包括使用HAL库、标准库和直接操作寄存器的方法。通过这三种不同的方式。1.硬件准备STM32开发板(如STM32F4或STM32F1系列)若干LED灯(通常是4个)适当的电阻连接线2.接线图将L......
  • stm32 FLASH闪存(读写内部FLASH&读取芯片ID)
    理论1.FLASH简介STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)(FLASH管理员)可以对程序存储器和选项字节进行擦除和编程读写FLASH的用途:   利用程序存储器的剩余空间来保存掉电不丢失的用户数据    通过在程序中编......
  • 51单片机双机通信——DS18B20温度测量
    目标实现功能    甲机控制数字温度传感器DS18B20采集温度、并将温度传递给乙机;乙机接收甲机传递的温度数据、并通过8位数码管动态显示。1.DS18B20简介1.1 DS18B20特点DS18B20采用单总线接口,测量结果直接输出数字信号,通过单总线传递给微处理器。工作电压在3.0v~5.5v......
  • 基于单片机的风机故障检测装置的设计与实现
    基于单片机的风机故障检测装置的设计与实现毕业论文摘要本文设计并实现了一种基于单片机的风机故障检测装置,旨在通过集成多种传感器和单片机控制技术,实时监测风机的运行状态,并在检测到故障时及时报警。系统采用STM32F103单片机作为核心控制单元,结合DS18B20温度传感器、ACS712......