本设计的硬件构成:
STM32F103C8T6单片机最小系统板,OLED显示模块,红外热释人体传感器,LED指示灯模块,USB台灯,光敏电阻,按键电路,语音识别模块。
功能介绍:
1、台灯采用PWM的控制方式;
2、上电之后,黄色的 LED 灯点亮,代表当前是自动控制模式;蓝色的LED灯点亮,表示检测人体,灭则无检测到人体;
3、OLED显示屏可实时显示台灯当前状态,第一行显示当前是否检测到人体;第二行显示当前的控制模式;第三行显示当前环境亮度;第四行显示台灯亮度等级;
4、通过按键 1,可以在手动模式(黄灯灭)、自动模式(黄灯亮)、定时模式之间来回切换 ;
5、在定时模式下,用户可设定任意时长,台灯会在设定的时间内亮灯;设定时间倒数完毕,台灯熄灭;在定时模式下,按键2为设定键,按键3为减一键,按键4为加一键;
6、在手动模式下,可以通过按键 3 降低亮度,按键 4 增加亮度。
7、在自动模式下,首先要检测到有人,才进行亮度的自动控制,否则台灯熄灭。 可以挡住光敏电阻的光线,或用手电筒来照射光敏电阻,模拟光照的变化,从而就可以 看到台灯的亮度会随着环境中的光照强度的改变而改变,效果是光照越弱,台灯越亮。 如果人体传感器 30秒检测不到有人,台灯就会自动熄灭。
8、台灯的亮度共分为10个等级;
9、除了按键控制外,也可以通过语音对台灯进行控制,用户可发出“自动”、“手动”、“定时”等指令对台灯状态进行切换;
主要物料清单及型号:
显示屏:OLED12864-IIC模块;
单片机:STM32F103C8T6;
语音识别模块:LD3320;
红外人体检测:SR-602;
部分程序源码:
int main(void)
{
u8 key=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为115200
KEY_Init();
LED_Init(); //LED端口初始化
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
TIM2_PWM_Init(3999,0); //不分频。PWM频率=72000000/4000=18Khz,占空比最大为(3999+1)
TIM3_Int_Init(499,7199);//10Khz的计数频率,计数到500为50ms
Adc_Init();
LED1=0;
while(1)
{
key=KEY_Scan(0);
key_handle(key);
APP_Command_Process();
if(T_100ms%10==0)
{
if(SR501==1)
{
people = 60;
LED0 = 0;
}
else
{
if(people>0)
people--;
else
{
people=0;
LED0 = 1;
TIM_SetCompare3(TIM2,0);
PWM_DUTY=0;
}
}
if(ctl_mode==TIME_MODE)
{
if(T_100ms>=20&&set==0)
{
T_100ms=0;
if(time[1]>0)
time[1]--;
else
{
if(time[0]>0)
{
time[0]--;
time[1]=59;
}
}
}
}
light=(Get_Adc_Average(9,10)-700)*1.2;
if(people>0)
{
if(ctl_mode==AUTO_MODE || ctl_mode==TIME_MODE )
{
if(light>3600)
{
PWM_DUTY=0;
}
else if(light>70)
PWM_DUTY=4000-light;
else
PWM_DUTY=4000;
TIM_SetCompare3(TIM2,PWM_DUTY);
}
if(ctl_mode==TIME_MODE )
{
if(set==0&&(time[0]>0||time[1]>0))
{
if(light>3600)
{
PWM_DUTY=0;
}
else if(light>70)
PWM_DUTY=4000-light;
else
PWM_DUTY=4000;
TIM_SetCompare3(TIM2,PWM_DUTY);
}
else
TIM_SetCompare3(TIM2,0);
}
}
Display_State();
}
}
}