【Proteus仿真】【STM32单片机】多功能智能台灯

news2024/12/29 9:15:44

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真STM32单片机控制器,使用LCD1604液晶、按键、蜂鸣器、语音识别模块、PCF8591 ADC模块、DHT11温湿度传感器、光线传感器、台灯、人体红外传感器等。
主要功能:
系统运行后,LCD1604液晶显示温湿度和光线强度、时间日期,系统工作模式;系统默认为自动模式,可通过K4键切换为手动/自动模式;
当处于手动模式,可通过K1调节台灯亮度,共3级,低中高,K2键关闭;当处于自动模式,可通过K3键进入阈值设置,K1和K2调节阈值,闹钟、光线强度;K4确定返回主界面;
如果检测有人,且光线低于阈值,则根据光线强度自动调节台灯亮度;如果坐姿不对,蜂鸣器报警;如果闹钟时间到达,报警,一段时间后自动关闭,亦可通过K1键手动关闭;如果检测无人,则台灯关闭;可通过语音控制台灯亮度调节、关闭和自动切换;仿真内使用串口助手模拟语音控制指令,指令为16进制格式数据。
调亮–>0X11
关–>0X10
自动切换–>0X12


二、软件设计

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

*/



//系统数据设置
void sys_data_set(void)
{
	u8 key=0;
	static u8 oneflag=0;
	//正常模式
	if(sys_ctrl.mode==0)
	{
		key=KEY_Scan(0);
		//自动/手动
		if(key==KEY4_PRESS)
		{
			sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
		}
	}
	//自动切换
	if(USART1_RX_BUF[0]==LED_MODE_CMD)
	{
		USART1_RX_BUF[0]=0;
		sys_ctrl.auto_flag=!sys_ctrl.auto_flag;
	}
	//自动模式
	if(sys_ctrl.auto_flag==0)
	{
		key=KEY_Scan(1);
		//模式设置
		if(key==KEY3_PRESS)
		{
			sys_ctrl.mode++;
			if(sys_ctrl.mode>3)sys_ctrl.mode=1;
			if(oneflag==0)
			{
				oneflag=1;
				sys_parm_set_show();//系统参数设置界面显示
			}
		}
		//确定
		else if(key==KEY4_PRESS)
		{
			sys_ctrl.mode=0;
			if(oneflag==1)
			{
				oneflag=0;
				sys_open_show();//系统开机界面显示
			}
		}
		//加
		else if(key==KEY1_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://时
					sys_ctrl.hour++;
					if(sys_ctrl.hour>23)sys_ctrl.hour=0;
					break;
				case 2://分
					sys_ctrl.min++;
					if(sys_ctrl.min>59)sys_ctrl.min=0;
					break;
				case 3://亮度
					sys_ctrl.lighth++;
					if(sys_ctrl.lighth>99)sys_ctrl.lighth=0;
					break;
			}
			//闹钟时间到达
			if(sys_ctrl.time_flag==1)//响铃手动关闭
			{
				sys_ctrl.time_flag=0;
			}
		}
		//减
		else if(key==KEY2_PRESS)
		{
			switch(sys_ctrl.mode)
			{
				case 1://时
					sys_ctrl.hour--;
					if(sys_ctrl.hour<0)sys_ctrl.hour=23;
					break;
				case 2://分
					sys_ctrl.min--;
					if(sys_ctrl.min<0)sys_ctrl.min=59;
					break;
				case 3://亮度
					sys_ctrl.lighth--;
					if(sys_ctrl.lighth<0)sys_ctrl.lighth=99;
					break;
			}
		}
	}
	//手动模式
	else
	{
		//亮度调节
		if(key==KEY1_PRESS || USART1_RX_BUF[0]==LED_ADD_CMD)
		{
			sys_ctrl.lev++;
			if(sys_ctrl.lev>3)sys_ctrl.lev=0;
			USART1_RX_BUF[0]=0;
		}
		//关
		else if(key==KEY2_PRESS  || USART1_RX_BUF[0]==LED_OFF_CMD)
		{
			sys_ctrl.lev=0;
			USART1_RX_BUF[0]=0;
		}
		
		if(sys_ctrl.lev!=0)sys_ctrl.ledsta=1;
		else sys_ctrl.ledsta=0;
		switch(sys_ctrl.lev)//亮度调节
		{
			case 0:pcf8591_set_dac_out(0);break;
			case 1:pcf8591_set_dac_out(200);break;
			case 2:pcf8591_set_dac_out(225);break;
			case 3:pcf8591_set_dac_out(250);break;
		}
	}
}

//系统功能控制
void sys_fun_ctrl(void)
{
	u8 hour=gDS1302_TIME[2]/16*10+gDS1302_TIME[2]%16;
	u8 min=gDS1302_TIME[1]/16*10+gDS1302_TIME[1]%16;
	
	//自动模式
	if(sys_ctrl.auto_flag==0)
	{
		//检测有人
		if(sys_ctrl.man==1)
		{
			//坐姿不好,报警
			if(sys_ctrl.pos==1)
			{
				beep_alarm(2,2000);
			}
			//如果光线低于阈值,自动调节亮度
			if(sys_ctrl.light<sys_ctrl.lighth)
			{
				if(sys_ctrl.light>sys_ctrl.lighth-20)sys_ctrl.lev=1;
				else if(sys_ctrl.light>sys_ctrl.lighth-40)sys_ctrl.lev=2;
				else sys_ctrl.lev=3;	
			}
			//如果光线大于阈值,不需要开灯
			else sys_ctrl.lev=0; 
			if(sys_ctrl.lev!=0)sys_ctrl.ledsta=1;
			else sys_ctrl.ledsta=0;
			switch(sys_ctrl.lev)//亮度调节
			{
				case 0:pcf8591_set_dac_out(0);break;
				case 1:pcf8591_set_dac_out(200);break;
				case 2:pcf8591_set_dac_out(225);break;
				case 3:pcf8591_set_dac_out(250);break;
			}
		}
		//检测无人
		else
		{
			sys_ctrl.ledsta=0;
			pcf8591_set_dac_out(0);//关灯
		}
	}
	
	//闹钟还未到达
	if(sys_ctrl.time_flag==0)
	{
		//闹钟时间到达
		if(hour==sys_ctrl.hour && min==sys_ctrl.min && gDS1302_TIME[0]==0)
		{
			sys_ctrl.time_flag=1;
		}
	}
	if(sys_ctrl.time_flag==1)
	{
		if(min>sys_ctrl.min)sys_ctrl.time_flag=0;//响铃一段时间自动关闭
		beep_alarm(2,2000);
	}
}

//应用控制系统
void appdemo_show(void)
{
	u8 i=10;
	sys_parm_init();//系统参数初始化
	KEY_Init();
	BEEP_Init();
	pcf8591_init();
	ctrl_pin_init();
	DS1302_GPIO_Init();
//	DS1302_Init();
	DHT11_Init();
	USART1_Init(9600);
	lcd1604_init();//LCD1602初始化
	//读取数据,等待稳定
	while(i--)
	{
		//读取DHT11温湿度值
		DHT11_Read_Data(&sys_ctrl.temp,&sys_ctrl.humi);
		delay_ms(100);		
	}
	sys_open_show();//系统初始界面显示

	while(1)
	{
		sys_data_set();//系统数据设置
		sys_data_get();//系统数据获取
		sys_data_show();//系统数据显示
		sys_fun_ctrl();//系统功能控制		
	}
}



三、实验现象

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


联系作者

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1044916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为Mate 60系列搭配出境易,轻松玩转出境游高能体验~

今年中秋国庆假期“合体”&#xff0c;长达8天的超级黄金周即将到来。不少朋友期待来一场说走就走的出境旅行&#xff0c;趁此机会远游异国他乡&#xff0c;领略不一样的风土人情。众所周知&#xff0c;海外的应用生态和网络环境和国内并不相同。想要获得“一机在手&#xff0c…

python二级

python二级Turtle 太阳花四瓣花正六边形和圆内切六边形质数&#xff08;素数&#xff09;鲁棒输入异常处理python math模块 解密函数的返回结果是元组类型类 太阳花 题目&#xff1a;用turtle库的turtle.fd()函数和turtle.left()函数绘制一个边长为200的太阳花。绘制效果如图&…

感性负载箱与电容负载箱有什么区别?

感性负载箱和电容负载箱在电力系统中的应用场景有所不同&#xff0c;感性负载箱通常用于测试和评估电力系统中的感性负载设备&#xff0c;如电动机和变压器。这些设备在运行过程中会产生感性负载&#xff0c;即对电流的相位差有一定要求。感性负载箱可以通过调节串联的电感元件…

小米科技笔记 | ElasticSearch与Redis底层原理解析

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴&#xff01;今天&#xff0c;我们来探讨一下两个非常重要的数据存储和检索工具&#xff1a;ElasticSearch和Redis。虽然它们都是高度优化的工具&#xff0c;但在底层原理上有着明显的区别。接下来&#xff0…

多维时序 | MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络)

多维时序 | MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络) 目录 多维时序 | MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.MATLAB实现GA-BP多变量时间序列预测(遗传算法优化BP神经网络)&…

Linux IP地址、主机名

查看ip地址指令 ifconfig 如无法使用ifconfig命令&#xff0c;可以安装 yum -y install net-tools ip address show--显示协议地址

AEM TESTPRO K50 ROADSHOW华南区路演

AEM的测试和测量解决方案是由一个具有四十多年经验的团队为企业和汽车客户的解决方案而设计开发的。AEM的解决方案也是专为用户在整个产品生命周期阶段&#xff0c;包括布线和连接器&#xff0c;无论是制造和实验室环境&#xff0c;在安装或日常网络故障排除方面&#xff0c;其…

Zabbix5.0_介绍_组成架构_以及和prometheus的对比_大数据环境下的监控_网络_软件_设备监控_Zabbix工作笔记001

z 这里Zabbix可以实现采集 存储 展示 报警 但是 zabbix自带的,展示 和报警 没那么好看,我们可以用 grafana进行展示,然后我们用一个叫睿象云的来做告警展示, 会更丰富一点. 可以看到 看一下zabbix的介绍. 对zabbix的介绍,这个zabbix比较适合对服务器进行监控 这个是zabbix的…

Win11系统安装WSA 的简单方式

Win11 WSA 的简单安装方式&#xff0c;无需开启Hyper-V&#xff0c;无需下载安装包。 ​ Win11系统安装WSA 1. 开启虚拟机 注&#xff1a;我只开启了虚拟机平台和Bios的虚拟化&#xff0c;其他没有操作&#xff0c;其他人出现问题可以用通过Hyper-v解决&#xff0c;但我并不…

jvm垃圾回收机制概述

一、jvm内存的分区 JVM的内存结构包括五大区域&#xff1a;程序计数器、虚拟机栈、本地方法栈、堆区、方法区。 其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭&#xff0c;因此这几个区域的内存分配和回收都具备确定性&#xff0c;就不需要过多考虑回收…

boost序列化单例3

源码见文章底部。 class singleton 声明了一个静态引用 static T & m_instance; 这个静态引用是用来干嘛的呢&#xff1f;注意到该文件末尾有如下代码&#xff1a; template<class T> T & singleton< T >::m_instance singleton< T >::get_instan…

第8讲:Vue 对象的生命周期

Vue 实例在创建时有一系列初始化步骤——例如&#xff0c;它需要建立数据观察&#xff0c;编译模板&#xff0c;创 建必要的数据绑定。在此过程中&#xff0c;它也将调用一些生命周期钩子&#xff0c;给自定义逻辑提供运行机 会。 生命周期图示 Vue 对象的生命周期函数 1、bef…

04 Zookeeper集群详解

上一篇&#xff1a;03-Zookeeper客户端使用 Zookeeper 集群模式一共有三种类型的角色 Leader: 处理所有的事务请求&#xff08;写请求&#xff09;&#xff0c;可以处理读请求&#xff0c;集群中只能有一个LeaderFollower&#xff1a;只能处理读请求&#xff0c;同时作为 Le…

TCP连接的三次握手与四次挥手【重点】

TCP的运输连接管理概述 TCP是面向连接的协议&#xff0c;它基于运输连接来传送TCP报文段 TCP运输连接的建立和释放是每一次面向连接的通信中必不可少的过程 TCP运输连接有以下三个阶段 TCP的运输连接管理就是使运输连接的建立和释放都能正常的进行 TCP建立连接的三次握手&a…

ChatGPT 在机器学习中的应用

办公室里一个机器人坐在人类旁边&#xff0c;Artstation 上的流行趋势&#xff0c;美丽的色彩&#xff0c;4k&#xff0c;充满活力&#xff0c;蓝色和黄色&#xff0c; DreamStudio出品 一、介绍 大家都知道ChatGPT。它在解释机器学习和深度学习概念方面也非常高效&#xff0c;…

springboot 简单配置mongodb多数据源

准备工作&#xff1a; 本地mongodb一个创建两个数据库 student 和 student-two 所需jar包&#xff1a; # springboot基于的版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>&l…

csdn未经允许将我的文章设置成vip收费

以前在csdn写了一些笔记&#xff0c;后来不用csdn了&#xff0c;想着留下这些笔记或多或少能帮助其他初学者&#xff0c;就没管它。结果csdn把文章设置成收费了&#xff0c;这个收费不是我本人弄的&#xff0c;是csdn弄的&#xff01;我现在只能把这些文章删除掉了。

ThreeJS-3D教学三:平移缩放+物体沿轨迹运动

我们在项目中会有一些这样的需求&#xff0c;我们可视化一个场景&#xff0c;需要俯视、平移、缩放&#xff0c;方便观察场景中的数据或者模型&#xff0c;之所以把这个案例拿出来 1、这是个很实用的需求&#xff0c;我相信很多人会用到 2、我自己认为在实际案例中我们可以学习…

高手必备!电脑剪辑视频的实用方法

随着数码时代的到来&#xff0c;越来越多的人开始使用电脑剪辑视频。电脑剪辑视频不仅可以为日常生活留下美好回忆&#xff0c;还可以为专业人士提供更多的创作可能性。在本文中&#xff0c;我们将介绍两种电脑剪辑视频的方法&#xff0c;不需要专业技能&#xff0c;只需要一台…

精细高效 智慧公厕为城市公共厕所联网管理装上“智慧中枢”

近年来&#xff0c;随着城市化进程的加速&#xff0c;城市公共设施的更新与改进也成为各地的重要任务之一。而其中&#xff0c;城市公共厕所的建设和管理更是备受关注。为了提高公厕的服务水平和城市形象&#xff0c;各地纷纷采取创新的智能化手段&#xff0c;将公厕与互联网技…