前言
本系统设计了一个智能台灯系统,可以切换两种不同的模式:自动模式、手动模式。当处于自动模式下可以根据当前亮度以及是否有人实现自动开灯;当处于手动模式下可以手动的开关灯;两种模式均支持手动按键调节亮度。
一、设计任务
- 使用人体传感器检测是否有人
- 使用光线传感器检测是否低光
- 使用按键可以控制LED灯亮度
- 按键实现模式的自动切换
二、系统硬件设计
1.器件选择
- STM32F103ZET6核心板
- 人体传感器 HC_SR501
- 光线传感器
- 触摸开关 TTP223 (选装)
- LED灯泡 (选装)
2.系统模型设计
光敏传感器以及人体传感器可以实时读取当前状态并将信息发送到STM32单片机上,实现在光线暗以及有人的条件下点亮LED灯,当无人时自动关闭;按键实时检测状态,并将其发送至STM32单片机,当检查到被按下时实现模式切换/亮度调节。
3.硬件连接
三、系统程序设计
1.程序设计
程序开始会进行各模块的初始化,当初始化完成后会检测当前模式(默认时自动模式);当处于自动模式时(LED2点亮),系统会检测人体传感器和光敏传感器所传递的信号,当人体传感器和光敏传感器输出高电平(有人低光),LED1点亮,当按下KEY0(同KEY_UP)时可以切换LED1亮度,亮度三档可调,自动模式不支持手动开关灯;当处于手动模式时(LED2熄灭),点击KEY0(同KEY_UP)时可以开启LED1/调节LED1亮度。软件工作流程图如下图所示。
特别说明:D0是LED1(控制灯泡);D1是LED2(状态显示灯泡)
2.程序代码
main.c
#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "key.h"
#include "usart.h"
#include "pwm.h"
#include "ls.h"
#include "hc_sr501.h"
int brightness=50,mode=0,hand_brightness=0;
int main()
{
u8 i;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组
LED_Init();
KEY_Init();
LS_Init();
USART1_Init(115200);
TIM3_CH2_PWM_Init(500,72-1); //频率是2Kh
while(1)
{
i++;
if(mode == 0)
{
LED2 = 0;
}
else
{
LED2 = 1;
}
if(mode == 0)
{
if(HC_SR501_KEY()==1 && LS_KEY()==1)
{
TIM_SetCompare2(TIM3,brightness); //i值最大可以取499,因为ARR最大值是499.
}
else
{
TIM_SetCompare2(TIM3,0);
}
}
else
{
TIM_SetCompare2(TIM3,hand_brightness);
}
switch(KEY_Scan(0))
{
case KEY_UP_PRESS:
if(mode == 0)
{
brightness += 100 ;
if(brightness == 350) brightness = 50;
}
if(mode == 1)
{
hand_brightness += 100 ;
if(hand_brightness == 400) hand_brightness = 0 ;
}
break;
case KEY1_PRESS:
mode++;
if(mode==1) hand_brightness = 0;
if(mode==2) mode = 0;
break;
case KEY0_PRESS:
if(mode == 0)
{
brightness += 100 ;
if(brightness == 350) brightness = 50;
}
if(mode == 1)
{
hand_brightness += 100 ;
if(hand_brightness == 400) hand_brightness = 0 ;
}
break;
}
delay_ms(100);
}
}
四、实物展示
五、源码下载
注意:购买前请再三确认,商品一旦出售概不退货,如有疑问请转至 疑问帮助