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

2024-06-08 17:52

本文主要是介绍STM32项目分享:智能台灯系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、前言

二、项目简介

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);	 			//串口一初始化为9600TIM2_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;}}	
}

六、实验效果 

七、资料内容

项目分享

这篇关于STM32项目分享:智能台灯系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042891

相关文章

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详