草庐IT

【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

Hai小易 2023-09-26 原文

文章目录


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、按键模块、HC05蓝牙、DHT11温湿度、PCF8591 ADC模块、光线传感器、28BYJ48步进电机等。

主要功能:
系统运行后,LCD1602显示温湿度和光线强度值和系统模式状态。
系统模式以自动模式运行,当按下K4键切换为手动模式,在手动
模式下,按下K1和K2键打开和关闭窗帘,同时可使用串口助手模拟
蓝牙APP,发送命令0X10切换自动手动模式,发送命令0X11打开,
0X12关闭。在自动模式下,默认温度上限为30,下限为25,光线
上限为60,下限为30,当前温度在温度阈值范围内,光线低于下限
,窗帘打开,高于上限窗帘关闭。如果温度高于温度上限,则打开
窗帘,温度低于温度下限,则关闭窗帘。在自动模式下,可通过K3键进入阈值设置窗口,K3键用于切换温度和光线上下限调节位置,K1和K2进行加减调节。


二、软件设计

/*
作者:嗨小易(QQ:3443792007)
*/

//系统初始界面显示
void sys_open_show(void)
{
	lcd1602_clear();
	lcd1602_show_string(0,0,"Tp:  C");
	lcd1602_show_string(10,0,"Hi:  %");
	lcd1602_show_string(0,1,"Light:   %");
	lcd1602_show_string(12,1,"Auto");
}

//系统数据采集
void sys_data_get(void)
{
	while(1)
	{
		//读取DHT11温湿度值
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		//光线强度采集
		sys_ctrl.light=pcf8591_read_adcvalue(0);
		sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,100);
		
		break;
	}	
}

//系统数据设定
void sys_data_set(void)
{
	u8 key=0;
	static u8 one=0;
	
	key=KEY_Scan(0);
	//自动手动模式选择
	if(key==KEY4_PRESS || USART1_RX_BUF[0]==AUTO_MAN_CMD)
	{
		sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
		USART1_RX_BUF[0]=0;
	}
	//手动模式下控制
	if(sys_ctrl.auto_flag==1)
	{
		//打开
		if(key==KEY1_PRESS || USART1_RX_BUF[0]==OPEN_CMD)
		{
			sys_ctrl.run=1;
			sys_ctrl.dir=0;
			USART1_RX_BUF[0]=0;
		}
		//关闭
		else if(key==KEY2_PRESS || USART1_RX_BUF[0]==CLOSE_CMD)
		{
			sys_ctrl.run=2;
			sys_ctrl.dir=1;
			USART1_RX_BUF[0]=0;
		}
	}
	//自动模式下K3键设置阈值
	if(sys_ctrl.auto_flag==0)
	{
		//阈值设置
		if(key==KEY3_PRESS)
		{
			sys_ctrl.mode++;
			//只显示一次阈值设置界面
			if(one==0)
			{
				lcd1602_clear();
				lcd1602_show_string(0,0," Temp:  -  C");
				lcd1602_show_string(0,1,"Light:  -  %");
				one=1;
			}
			if(sys_ctrl.mode>=5)
			{
				sys_ctrl.mode=0;
				one=0;
				sys_open_show();//主界面显示
			}
		}
		//加
		else if(key==KEY1_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下限
					sys_ctrl.templ++;
					if(sys_ctrl.templ>99)sys_ctrl.templ=0;
					break;
				case 2://温度上限
					sys_ctrl.temph++;
					if(sys_ctrl.temph>99)sys_ctrl.temph=0;
					break;
				case 3://光线下限
					sys_ctrl.lightl++;
					if(sys_ctrl.lightl>99)sys_ctrl.lightl=0;
					break;
				case 4://光线上限
					sys_ctrl.lighth++;
					if(sys_ctrl.lighth>99)sys_ctrl.lighth=0;
					break;
			}
		}
		//减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://温度下限
					sys_ctrl.templ--;
					if(sys_ctrl.templ<0)sys_ctrl.templ=99;
					break;
				case 2://温度上限
					sys_ctrl.temph--;
					if(sys_ctrl.temph<0)sys_ctrl.temph=99;
					break;
				case 3://光线下限
					sys_ctrl.lightl--;
					if(sys_ctrl.lightl<0)sys_ctrl.lightl=99;
					break;
				case 4://光线上限
					sys_ctrl.lighth--;
					if(sys_ctrl.lighth<0)sys_ctrl.lighth=99;
					break;
			}
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	static u8 sta=0;
	
	//手动模式下窗帘控制
	if(sys_ctrl.auto_flag)
	{
		if(sys_ctrl.run==1)//只执行1次,打开窗帘
		{
			if(sta==0)
			{
				step_motor_28BYJ48_send_pulse(4,sys_ctrl.dir,50,3,1);
				sta=1;
			}
		}
		else if(sys_ctrl.run==2)//只执行1次,关闭窗帘
		{
			if(sta==1)
			{
				step_motor_28BYJ48_send_pulse(4,sys_ctrl.dir,50,3,1);
				sta=0;
				sys_ctrl.run=0;
			}
		}
	}
	//自动模式下窗帘控制
	else
	{
		//如果温度高于上限值,打开窗帘
		if(sys_ctrl.temp>sys_ctrl.temph)
		{
			sys_ctrl.dir=0;
			if(sta==0)//只打开1次
			{
				step_motor_28BYJ48_send_pulse(4,sys_ctrl.dir,50,3,1);
				sta=1;
			}
		}
		//如果温度低于下限,关闭窗帘
		else if(sys_ctrl.temp<sys_ctrl.templ)
		{
			sys_ctrl.dir=1;
			if(sta==1)//只关闭1次
			{
				step_motor_28BYJ48_send_pulse(4,sys_ctrl.dir,50,3,1);
				sta=0;
			}
		}
		//如果在阈值范围内
		else 
		{
			//光线高于上限,关闭窗帘
			if(sys_ctrl.light>sys_ctrl.lighth)
			{
				sys_ctrl.dir=1;
				if(sta==1)//只关闭1次
				{
					step_motor_28BYJ48_send_pulse(4,sys_ctrl.dir,50,3,1);
					sta=0;
				}
			}
			//光线低于下限,打开窗帘
			else if(sys_ctrl.light<sys_ctrl.lightl)
			{
				sys_ctrl.dir=0;
				if(sta==0)//只打开1次
				{
					step_motor_28BYJ48_send_pulse(4,sys_ctrl.dir,50,3,1);
					sta=1;
				}
			}
		}
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	KEY_Init();
	pcf8591_init();
	DHT11_Init();
	step_motor_gpio_init();
	lcd1602_init();//LCD1602初始化
	USART1_Init(9600);
	while(i--)
	{
		//读取DHT11温湿度值
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		//光线强度采集
		sys_ctrl.light=pcf8591_read_adcvalue(0);
		sys_ctrl.light=cal_map(sys_ctrl.light,0,255,0,100);
	}
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_data_get();
		sys_data_show();
		sys_data_set();
		sys_fun_ctrl();		
	}
}




三、实验现象

B站演示视频:https://space.bilibili.com/444388619






联系作者

专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

有关【Proteus仿真】【STM32单片机】智能窗帘控制系统设计的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  3. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  4. 玩以太坊链上项目的必备技能(初识智能合约语言-Solidity之旅一) - 2

    前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型

  5. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  6. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  7. 智能客服 | 浅谈人工智能聊天机器人ChatGPT - 2

    2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动

  8. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  9. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  10. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

随机推荐