b站演示视频:https://b23.tv/IrjLmNO
资料获取:关注公众号【一起来学习哟】回复【智能台灯】
标题:基于STM32的智能台灯设计
摘要:本文介绍了一个基于STM32微控制器的智能台灯设计方案。该台灯具备人体感应开灯、长时间工作提醒、自动关灯、小夜灯模式以及可调节亮度和色温等功能。设计中使用了红外传感器来检测人体靠近,使用了光线传感器来判断环境亮度,以及采用了PWM技术来控制LED灯的亮度和色温。
关键词:STM32;智能台灯;红外感应;人体接近;闪烁提醒;自动关灯;小夜灯;触控开关
一、引言
随着科技的发展,智能家居产品越来越受到人们的喜爱。智能台灯作为智能家居的一部分,不仅可以提供基本的照明功能,还能根据用户的需求自动调节亮度和色温,甚至可以通过人体感应和声音检测来提供更加人性化的服务。
二、系统设计
- 硬件设计
本设计的硬件部分主要包括STM32微控制器、红外传感器、光线传感器、LED灯、触控开关等。STM32微控制器负责整个系统的控制和数据处理,红外传感器用来检测人体是否靠近台灯,光线传感器用来判断环境是否昏暗,LED灯则是照明的执行部件。触控开关既可以用来控制LED灯的开关,也可以用来设置亮度和色温。
- 软件设计
软件设部分主要包括主程序和各个功能模块。主程序负责初始化硬件设备和启动各个功能模块。人体感应模块负责检测人体是否靠近台灯,并在满足条件时开启LED灯。长时间工作提醒模块会在人在台灯下工作时间过长或过于靠近时,通过闪烁灯提醒人注意保持距离。自动关灯模块则是在人离开或环境变亮时自动关闭LED灯。小夜灯模块会在夜间有声音时,以较小亮度打开灯,持续3分钟关闭。亮度和色温调节模块则是通过触控开关来设置LED灯的亮度和色温。
部分主程序:
#include "SysTick.h"
#include "timer.h"
#include "ADC.h"
#include "DMA.h"
#include "key.h"
u16 AD;//用于保存ADC结果
u8 LED_Status=0;//用于指示LED状态:关闭、打开、闪烁
u8 AI=1;//用于标记智能模式是否打开,默认打开
int main()
{
SysTick_Init();//初始化systick,要求72M,更改主频要修改相关参数
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组,分2组
ADC1_Init();//初始化ADC
DMA1_Init(DMA1_Channel1,(u32)&ADC1->DR,(u32)&AD,1);//初始化DMA,用于传输ADC结果
TIME2_Init();//初始化定时器2、PWM
TIME3_Init();//初始化定时器3,用于定时
key_Init();//IO初始化、外部中断初始化
while(1)
{
if(!touch_sw)//检测到触摸按键触摸
{
delay_ms(20);//延时消除抖动
if(!touch_sw)//延时后再次检测
{
if(LED_Status==close || LED_Status==twinkle)//如果LED关闭或者LED在闪烁
{
time_cnt=0;//声控开启LED计数清零
Duty=3590;//打开LED
LED_Status = open;//更新LED状态
while(!touch_sw);//等待手松开
}
else//如果LED打开
{
delay_ms(200);//延时0.2秒,检测连续触摸
if(!touch_sw)//0.2秒后还在触摸,则视为连续触摸
{
while(!touch_sw)//0.2秒后还在触摸,则视为连续触摸
{
if(Duty<3590)//在连续触摸中,如果不是最大亮度,则优先变亮
{
Duty=Duty+10;//增加亮度
TIM_SetCompare3(TIM2,Duty);//更新亮度
delay_ms(10);//延时10毫秒
if(Duty>=3590)//若果亮度达到最大
{
while(!touch_sw);//亮度最大时,等待手松开
break;//亮度最大时,不会增加或减小,退出当前循环,
}
}
else//如果LED是最大亮度,则减小亮度
{
while(!touch_sw)//检测是否在触摸
{
if(Duty>100)//如果没有达到最小亮度
{
Duty=Duty-10;//减小亮度
TIM_SetCompare3(TIM2,Duty);//更新亮度
delay_ms(10);//延时10毫秒
}
}
break; //退出当前循环
}
}
}
else///0.2秒后没有触摸,视为要关闭
{
Duty=0;//关闭LED
time_cnt=0;//关闭LED后,不再对开启LED时间计时
LED_Status = close;//更新LED状态
}
}
TIM_SetCompare3(TIM2,Duty); //更新LED亮度
}
}
if(AI_key==0)//如果智能控制按键按下
{
delay_ms(10);//延时消除抖动
if(AI_key==0)//再次检测
AI = !AI;//关闭或打开智能模式
while(AI_key==0);//等待按键松开
}
if(AI)//在智能模式打开时,才执行以下程序
{
if(LED_Status!=twinkle && !night_cnt_start)//当LED没有闪烁并且没有开启夜灯功能时,才执行以下程序
{
if(PIS && AD>2000)//如果热释电模块检测到人体活动且环境比较暗时
{
Duty=3590;//打开LED
LED_Status = open;//更新LED状态
}
else
{
Duty=0;//关闭LED
LED_Status = close;//更新LED状态
}
TIM_SetCompare3(TIM2,Duty); //更新LED亮度
}
}
}
}
三、功能实现
-
人体感应开灯:当人体靠近台灯(1.5米以内)且环境较暗时,红外感应模块检测到人体并发送信号给STM32微控制器,微控制器接收到信号后驱动LED灯点亮。
-
长时间工作提醒:当人在台灯下工作时间超过45分钟或过于靠近时(设定的近距离用于近视形成防护),闪烁灯提醒模块会启动并使LED灯闪烁,提醒人注意保持距离。此功能可以通过触控开关手动停止闪烁或关闭该功能。
-
自动关灯:当人离开台灯(红外感应模块不再检测到人体)或环境变亮时(光线传感器检测到环境亮度超过设定值),自动关灯模块会驱动LED灯熄灭。
-
小夜灯功能:夜间有声音时,小夜灯模块会启动并以较小亮度打开LED灯持续3分钟后自动关闭。此功能通过声音传感器来检测声音并触发。
-
亮度和色温调节:通过触控开关可以设置LED灯的亮度和色温。用户可以根据自己的喜好和需求调整亮度和色温达到最佳的照明效果。此外还可以设置为普通台灯模式(关闭智能功能)仅通过触控开关控制LED灯的开关和亮度。
四、结论
本文介绍了一个基于STM32的智能台灯设计方案具有人体感应开灯、长时间工作提醒、自动关灯、小夜灯模式以及可调节亮度和色温等功能。该设计方案充分利用了现代微控制器和传感器技术实现了智能化和人性化的照明服务为用户提供更加舒适便捷的生活体验。