STM32项目分享:智能台灯系统

news2024/11/28 8:39:43

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板及元器件图

五、程序设计 

六、实验效果 

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1kQ4y1p77V/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32智能台灯系统。

功能如下:

  1. 亮度控制:按键控制照明灯的亮度(5挡亮度)
  2. 计时功能:按键启动计时,累计台灯运行时间(作息时间)
  3. OLED显示:显示当前模式、环境光强、超声波距离
  4. 控制模式:通过按键控制照明灯为手动模式/自动模式
  5. 蓝牙APP控制:通过蓝牙APP控制照明灯模式选取、亮度调节、计时等功能
  6. 智能调光:自动模式下根据外界光线变化,LED照明灯自动调节亮度
  7. 人体姿态提醒:超声波距离近于5cm触发蜂鸣器报警,提醒纠正人体姿态

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(4针I2C协议)
  • 光敏传感器
  • 大功率LED照明灯模块
  • HC-SR04超声波传感器
  • HC-SR501人体红外传感器
  • 蓝牙模块(BT04-A)
  • 蜂鸣器

三、原理图设计

四、PCB硬件设计

1.PCB图 

2.PCB板及元器件图

五、程序设计 

int main(void)
{	

	unsigned char p[16]=" ";

	u8 datatemp[SIZE];	
	unsigned int  STEP=0;			//步数临时替换值			
	_Bool Heart_OK = 0;				//读取到正确心率标志位
	unsigned char Heart = 0;		//心率值
	short temperature = 0; 				//温度值
	
	STEPS_DIS = 1;
	delay_init();	    			//延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级
	
    LED_Init();		  				//初始化与控制设备连接的硬件接口
	OLED_Init();					//OLED初始化
	delay_ms(50);
	OLED_CLS();						//清屏
	OLED_ShowCN(32,2,0);			//万事可期(欢迎使用) 
	OLED_ShowCN(32+16,2,1);
	OLED_ShowCN(32+32,2,2);
	OLED_ShowCN(32+32+16,2,3);

	ADXL345_Init();
	
	while(ADXL345_Init())			//3D加速度传感器初始化	
	{
		OLED_ShowStr(0,0,"ADXL345 Error",2);
		delay_ms(200);
		OLED_ShowStr(0,0,"             ",2);
 		delay_ms(200);
	}
	while(DS18B20_Init())	//DS18B20初始化	
	{
		OLED_ShowStr(0,0,"DS18B20 Error",2);
		
		delay_ms(200);
		OLED_ShowStr(0,0,"             ",2);	

		delay_ms(200);
	}
	delay_ms(100);
	while(DS18B20_Get_Temp()==850);	//DS18B20刚上电时候 读取的值是850 这里等待 直到不是850才开始下一步		
	delay_ms(5000);
	
	OLED_CLS();						//清屏
	Adc_Init();
	TIM3_Int_Init(1999,71);			//定时2ms中断
	
	uart_init(9600);	 			//串口一初始化为9600
	TIM2_Int_Init(199,7199);		//10Khz的计数频率,计数到500为20ms 
	KEY_Init();						//IO初始化		
	EXTIX_Init();					//外部中断初始化
	
	OLED_CLS();						//清屏 
	Dis_Init();						

	STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,SIZE);  //flash中读出步数
	
	STEPS = (datatemp[0]-0x30)*10000+(datatemp[1]-0x30)*1000+(datatemp[2]-0x30)*100+(datatemp[3]-0x30)*10+(datatemp[4]-0x30);//读到值转换为步数
	RTC_Init();
	
//	RTC_Set(2019,8,5,20,43,55);  //设置时间
 	while(1)
	{	

		if(Timer_Flag==1)					//500ms到 读取数据
		{
			Timer_Flag = 0;					//清除标志
			TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE ); 						//使能指定的TIM3中断,允许更新中断
			TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE ); 						//使能指定的TIM3中断,允许更新中断		
			temperature=DS18B20_Get_Temp();	//读取温度
			TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); 						//使能指定的TIM3中断,允许更新中断
			TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); 						//使能指定的TIM3中断,允许更新中断

			TIM_Cmd(TIM2, ENABLE);  		//使能TIMx	
			if (QS == true)					//读取到了心率信号
			{			
				QS = false; 				//清除标志 等待下一次读取
				if(BPM>HEART_MIN_ERROR&&BPM<HEART_MAX_ERROR)		//读取到的值再正常心率区间 40-160内
				{
					Heart_OK = 1;			//标志位置一
					Heart = BPM;			//心率传递给Heart
				}
				else
				{
					Heart_OK = 0;			//标志位清零
					Heart = 0;				//设置为0
				}	
			}
		}
				
		if(ADXL345_FLAG==1)					//20ms到?
		{
			ADXL345_FLAG = 0;	  			//清除标志位
			step_counter();	
		}
//		printf("三轴加速器: %d \r\n",ADXL345_FLAG);	//串口发送出去

		delay_ms(20);	
		if(STEP!=STEPS)						//步数发生改变 存储一次
		{
			STEP = STEPS;
			TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
			TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
			TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
			TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
			TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
		}
		if(calendar.hour==0&&calendar.min==0&&(calendar.sec==0||calendar.sec==1||calendar.sec==2))		//凌晨00:00:00  清除步数
		{
			STEPS = 0;
			TEXT_Buffer[0]=(u16)STEPS/10000+0x30;
			TEXT_Buffer[1]=(u16)STEPS%10000/1000+0x30;
			TEXT_Buffer[2]=(u16)STEPS%10000%1000/100+0x30;
			TEXT_Buffer[3]=(u16)STEPS%10000%1000%100/10+0x30;
			TEXT_Buffer[4]=(u16)STEPS%10000%1000%100%10+0x30;

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);
			delay_ms(500);
			
		}
		Key_set();							//时间设置
	
		if(KEY0==0)							//KEY0切换显示按键
		{
			while(KEY0==0);					//等待松开
			OLED_CLS();						//清屏	
			if(Dis_mode==0)					//如果上一次是显示心率、步数、体温 的 则显示时间
				Dis_mode = 1;
			else 							//如果上一次不是显示心率、步数、体温 的 则心率、步数、体温
			{
				Dis_mode = 0;				
				Dis_Init();					//显示汉字信息
			}		
		}
		if(KEY2==0)	   						//清除步数
		{
			while(KEY2==0);
			STEPS = 0;
			TEXT_Buffer[0]=(u16)'0';
			TEXT_Buffer[1]=(u16)'0';
			TEXT_Buffer[2]=(u16)'0';
			TEXT_Buffer[3]=(u16)'0';
			TEXT_Buffer[4]=(u16)'0';

			STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)TEXT_Buffer,SIZE);		//清除后存储一次数据
		}
	
		if(update_flag==1) 					//2S标志到 发送一次数据到手机APP
		{
			update_flag = 0;
			printf("Step:%5d H:%3d T:%4.1f \r\n",STEPS,Heart,(float)temperature/10);	//串口发送出去

		}
	
		switch(Dis_mode)
		{
			case 0:	  										//显示传感器数据
				if(STEPS_DIS==1)							//刷新计步
				{
					sprintf((char*)p,":%-5d ",STEPS);		//显示步数
					OLED_ShowStr(32,2,p,2);
				}
 				sprintf((char*)p,":%4.1f    ",(float)temperature/10);
				OLED_ShowStr(32,4,p,2);						//显示温度
				
				if(Heart_OK==1)								//读取到正确心率
				{
					sprintf((char*)p,":%3dr/min",Heart);	//显示心率
					OLED_ShowStr(32,0,p,2);	
				}
				else
				{
					sprintf((char*)p,":---r/min");	
					OLED_ShowStr(32,0,p,2);
				}
			break;

			case 1:											//显示时间 日期等信息
				RTC_Display();								//显示时钟
			break;
		}
		
	}	
}

六、实验效果 

七、资料内容

项目分享

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

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

相关文章

大模型学习之菜鸟的进阶道路---工程迭代

我们的大模型学习开始了新篇章&#xff0c;这一章还是比较基础的调用api&#xff0c;有些朋友建议直接搞构造大模型&#xff0c;很显然这是很不科学的&#xff0c;我们先从基础学习&#xff0c;大模型本来就是很晦涩难懂的东西&#xff0c;并且知识体系十分庞大&#xff0c;所以…

Progressive Feature Fusion Framework Based on Graph Convolutional Network

以Resnet50作为主干网络&#xff0c;然后使用GCN逐层聚合多级特征&#xff0c;逐级聚合这种模型架构早已不新鲜&#xff0c;这篇文章使用GCN的方式对特征进行聚合&#xff0c;没有代码。这篇文章没有过多的介绍如何构造的节点特征和邻接矩阵&#xff0c;我觉得对于图卷积来说&a…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(三)

概述 在上一篇 Swift 序列(Sequence)排序面面俱到 - 从过去到现在(二) 博文中,我们介绍了如何构建一个自定义类型中“多属性”排序的通用实现。 而在本课中我们将再接再厉介绍 iOS 15+ 中新的排序机制,并简要剖析就地排序(In-place sorting)对运行性能有着怎样的显著影…

数据挖掘--数据预处理

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性&#xff1a;基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析&#xff1a;基本概念和方法 数据清理 缺失值 如果数据集含有分类属性…

阿里云(域名解析) certbot 证书配置

1、安装 certbot ubuntu 系统&#xff1a; sudo apt install certbot 2、申请certbot 域名证书&#xff0c;如申请二级域名aa.example.com 的ssl证书&#xff0c;同时需要让 bb.aa.example.com 也可以使用此证书 1、命令&#xff1a;sudo certbot certonly -d “域名” -d “…

聪明人社交的基本顺序:千万别搞反了,越早明白越好

聪明人社交的基本顺序&#xff1a;千万别搞反了&#xff0c;越早明白越好 国学文化 德鲁克博雅管理 2024-03-27 17:00 作者&#xff1a;方小格 来源&#xff1a;国学文化&#xff08;gxwh001&#xff09; 导语 比一个好的圈子更重要的&#xff0c;是自己优质的能力。 唐诗宋…

c++编译器在什么情况下会提供类的默认构造函数等,与析构函数

我们都知道&#xff0c;在 c 里&#xff0c;编写的简单类&#xff0c;若没有自己编写构造析构函数与 copy 构造函数 与 赋值运算符函数&#xff0c;那么编译器会提供这些函数&#xff0c;并实现简单的语义&#xff0c;比如成员赋值。看 源码时&#xff0c;出现了下图类似的情形…

《C++避坑神器·二十七》VS中release打断点方法,#undef作用

1、release打断点方式 2、#undef作用 #undef指令用于”取消“已定义的#define指令 案例&#xff1a;

小主机折腾记24

好久不更新&#xff0c;最近折腾的事如下 1.10块钱自提买了个半高机箱&#xff0c;15086140&#xff0c;把之前拆机的H61m-A/M32AA/DP_MB与200w航嘉电源装了进去&#xff0c;额外买了半高pcie转接了个m2位&#xff0c;江波龙64g安装了win10专业版&#xff0c;最后卖了176块钱&a…

连山露【诗词】

连山露 雾隐黄山路&#xff0c;十步一松树。 树上惊松鼠&#xff0c;松子衔木屋。 松子青嫩芽&#xff0c;尖尖头探出。 卷挂白露珠&#xff0c;装映黄山雾。

UML实战-BUG管理系统

概述 根据 UML建模的过程来进行一个完整系统的设计–Bug 管理系统。下面是一个标注 UML 设计过程的参考。 需求分析:用例图。系统分析:分析业务规则–状态图。系统分析:分析业务流程–活动图。系统设计:设计静态结构–类图和包图。系统设计:Action类被调用关系–序列图。…

检测五个数是否一样的算法

目录 算法算法的输出与打印效果输出输入1输入2 打印打印1打印2 算法的流程图总结 算法 int main() {int arr[5] { 0 };int i 0;int ia 0;for (i 0; i < 5; i) { scanf("%d", &arr[i]); }for (i 1; i < 5; i) {if (arr[0] ! arr[i]) {ia 1;break;} }…

Linux-常用命令-常用设置

1.帮助类命令 1.man命令-获得帮助信息 man [命令或配置文件]例&#xff1a;查看ls命令的帮助信息 man ls输入 ZZ 退出帮助2.服务管理类命令 1.centos7语法 1.1 临时开关服务命令 开启服务&#xff1a; systemctl start 服务名 关闭服务&#xff1a; systemctl stop 服务…

Javaweb---HTTPS

题记 为了保护数据的隐私性我们引入了HTTPS 加密的方式都有那些呢? 1.对称加密: 加密和解密使用的密钥是同一个密钥 2.非对称加密:有两个密钥(一对),分为公钥和私钥(公钥是公开的,私钥是要藏好的) HTTPS的工作过程(旨在对body和header进行加密) 1.对称加密 上述引出的…

两张图片进行分析

两张图片进行分析&#xff0c;可以拖动左边图片进行放大、缩小查看图片差异 底图 <template><div class"box_container"><section><div class"" v-for"item in imgData.imgDataVal" :key"item.id"><img :s…

Kafka监控系统efak的安装

下载地址Kafka Eaglehttp://download.kafka-eagle.org/下载地址连接不稳定&#xff0c;可以多次尝试直到成功连接下载 1.解压安装包并重命名 tar -zxvf kafka-eagle-bin-3.0.1.tar.gz 查看到解压后包含一个安装包&#xff0c;再解压 tar -zxvf efak-web-3.0.1-bin.tar.gz 移…

小程序简单版录音机

先来看看效果 结构 先来看看页面结构 <!-- wxml --><view class"wx-container"><view id"title">录音机</view><view id"time">{{hours}}:{{minute}}:{{second}}</view><view class"btngroup"…

【JavaSE】面向对象---多态

前言 本篇以Java初学者视角写下&#xff0c;难免有不足&#xff0c;或者术语不严谨之处。如有错误&#xff0c;欢迎评论区指正。本篇说明多态相关的知识。若本文无法解决您的问题&#xff0c;可以去最下方的参考文献出&#xff0c;找出想要的答案。 多态概念 多态&#xff08…

【Ardiuno】实验使用ESP32连接Wifi(图文)

ESP32最为精华和有特色的地方当然是wifi连接&#xff0c;这里我们就写程序实验一下适使用ESP32主板连接wifi&#xff0c;为了简化实验我们这里只做了连接部分&#xff0c;其他实验在后续再继续。 由于本实验只要在串口监视器中查看结果状态即可&#xff0c;因此电路板上无需连…

最短路径——迪杰斯特拉与弗洛伊德算法

一.迪杰斯特拉算法 首先对于最短路径来说&#xff1a;从vi-vj的最短路径&#xff0c;不用非要经过所有的顶点&#xff0c;只需要找到路径最短的路径即可&#xff1b; 那么迪杰斯特拉的算法&#xff1a;其实也就与最小生成树的思想类似&#xff0c;找到较小的&#xff0c;然后…