Advertisement

【硬件设计】_基于STM32单片机的智能台灯系统

阅读量:

一. 系统概述

该款智能台灯系统拥有多种功能,并不仅能够自动调节亮度和监测人体活动,还具备感知环境光照的功能。此外还具有定时与报警的功能,显著提升了用户体验,并且增强了其扩展性。

亮度调节

台灯有两种调节亮度的模式:一种是智能模式(根据环境光强自动调整),另一种是手控模式(通过按键调节亮度)。

坐姿提醒

复制代码
 * 利用红外光电开关监测人体与台灯的距离,若距离过近则发出报警提醒。

学习定时

时钟模块具备记录学习时间的功能,并在预设时间段自动触发定时提醒;OLED显示屏实时显示当前时间段;当设定的时间到达时,蜂鸣器被触发发出提醒

光照检测

复制代码
 * 通过光敏电阻模块检测光强,OLED显示屏实时显示数据。
在这里插入图片描述

二. 电路设计

电路设计采用Altium Designer进行绘制:

该系统的核心控制模块基于STM32F103C8T6单片机实现。其中包含时钟定时模块DS1302时钟定时功能并采用SDA、SCK、DAT引脚与单片机建立通信连接。光电开关用于人体检测功能并将其采集到的数据直接传输至单片机的GPIO端口完成处理逻辑运算。独立按键装置分别用于控制灯光亮度和模式切换功能在一端接地线引脚上并将另一端连接至单片机对应的人口 GPIO 引脚完成信号传递操作。数据显示部分选用0.96寸OLED12864显示屏并采用IIC总线协议进行人机交互界面构建以及与单片机的数据通信工作流程。光敏电阻传感器则用于检测光强变化并在模拟输出端子处将信号传递至单片机模拟输入子接口处完成后续处理逻辑运算。

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

三.程序设计

复制代码
    #include "stm32f10x.h"
    #include "OLED_I2C.h"
    #include "ds1302.h"
    #include "timer.h"
    #include "gpio.h"
    #include "delay.h"
    #include "key.h"
    #include "adc.h"
    #include "stdio.h"
    #include "string.h"
    
    unsigned char setn=0;
    unsigned char txshi=12,txfen=0,txmiao=0;
    u8 tixing=0;//0:时间提醒关,1:时间提醒开
    u8 mode=0;//0:自动模式,1手动模式
    unsigned char miao = 0;//没有人的计时时间
    unsigned char PWM_Val = 0xFF;//用于PWM调节
    unsigned char GearTemp = 0;//0~3档
    u8 RemindFlag=0;//提醒时间到了标志
    u8 PostureFlag=0;//坐姿提醒
    
    int main(void)
    {
    	char i=0;
    	
    	DelayInit();
    	I2C_Configuration(); //IIC初始化
    	OLED_Init(); //OLED初始化
    	KEY_Init(); //按键初始化
    	BEEP_AND_GD_RTHW_GPIO_Config();
      OLED_CLS();//清屏
    	DS1302_Init(&SysDate);
    	DelayMs(100); 
    	DS1302_DateRead(&SysDate);//读时间 
    	OLED_CLS();//清屏
    	for(i=0;i<4;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:亮度等级
    	OLED_ShowStr(62,2,": ",2);//显示冒号
    	for(i=0;i<4;i++)OLED_ShowCN(i*16,4,i,0);//测试显示中文:提醒时间
    	DisplayMode();
      TIM2_Init(49,71);     //定时器初始化,定时50us
    	TIM3_Init(499,7199);  //定时器初始化,定时50ms
    	//Tout = ((arr+1)*(psc+1))/Tclk ;  
    	//Tclk:定时器输入频率(单位MHZ)
    	//Tout:定时器溢出时间(单位us)
    	while(1)
    	{
    		  KeySettings();
    	    DisplayTime();
    		  DisplayTiXingTime();
    		  AutoHandle();
    		  LedGearHandle(GearTemp);
    		  if(GD == 0)//检测坐姿不正确
    			{
    					if(PostureFlag==0)
    					{
    							PostureFlag=1;
    						  BEEP=1;//蜂鸣器提醒
    						  OLED_CLS();//清屏
    						  for(i=0;i<6;i++)OLED_ShowCN(i*16+16,2,i+16,0);//测试显示中文:请注意坐姿!
    						  DelayMs(1000); 
    						  OLED_CLS();//清屏
    						  for(i=0;i<4;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:亮度等级
    							OLED_ShowStr(62,2,": ",2);//显示冒号
    							for(i=0;i<4;i++)OLED_ShowCN(i*16,4,i,0);//测试显示中文:提醒时间
    						  DisplayMode();
    					}
    			}
    			else
    			{
    					PostureFlag=0;
    			}
    	}
    }
    
    void TIM2_IRQHandler(void)//定时器2中断服务程序	 
    { 
    	  static u8 time_count = 0;
    		if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    		{ 
    				TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
    			  time_count++;
    			  if(time_count > 200)time_count = 0;//10ms一个周期
    				if(time_count >= PWM_Val)LED = 1;//占空比调节
    				else LED = 0;  
    	  }
    }
    
    void TIM3_IRQHandler(void)   //TIM3中断
    {
    		static u8 count=0,count2=0;
    		if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    		{
    				TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  //清除TIMx的中断待处理位:TIM 中断源 
    			  if(count2++>=2)
    				{
    					  count2 = 0;
            if(GD == 1)
    						{
    							 if(RemindFlag==1 && txshi==SysDate.hour && txfen==SysDate.min)
    							 {
    									 BuzzerSound();
    							 }
    							 else
    							 {
    									 BEEP=0;
    							 }
    						}
    				}
        if(count++ >= 20)//1秒时间到
    				{
    						count = 0;
    						if(RTHW==1)miao=30;//检测到有人,时间赋值30秒
    					  else
    						{
    								if(miao>0)miao--;//没有人,30秒倒计时
    						}
    				}
    		}
    }
    
    
    
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/vPBy3ubMDhpk1CawRc82K5nmfqrW.png)
在这里插入图片描述

四.资料内容

在这里插入图片描述

24-32-04

全部评论 (0)

还没有任何评论哟~