基于stm32单片机的智能台灯设计(语音控制+OLED显示)

 本设计的硬件构成:

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();       
    }
  }   
 }

资料

STM32F407IGT6单片机 HC-SR501人体红外感应模块(串口屏显示)KEIL软件工程源码, int main(void) { uint8_t state; /* 复位所有外设,初始化Flash接口和系统滴答定时器 */ HAL_Init(); /* 配置系统时钟 */ SystemClock_Config(); /* 初始化串口并配置串口中断优先级 */ MX_DEBUG_USART_Init(); HMI_USARTx_Init(); /* 初始化LED */ LED_GPIO_Init(); HC_SR501_GPIO_Init(); /* 无限循环 */ while (1) { state=HC_SR501_StateRead(); switch(state) { case HC_SR501_LOW: HMI_string_setting("page1.t1.txt=\"无人\""); break; case HC_SR501_HIGH: HMI_string_setting("page1.t1.txt=\"有人\""); break; } } } /** * 函数功能: 向串口屏发送数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void HMI_value_setting(const char *val_str,uint32_t value) { uint8_t tmp_str[30]={0}; uint8_t i; sprintf((char *)tmp_str,"%s=%d",val_str,value); for(i=0;i<strlen((char *)tmp_str);++i) { HMI_USARTx->DR=tmp_str[i]; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } /** * 函数功能: 向串口屏发送浮点数据 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void HMI_string_setting(const char *val_str) { uint8_t tmp_str[50]={0}; uint8_t i; sprintf((char *)tmp_str,val_str); for(i=0;i<strlen((char *)tmp_str);++i) { HMI_USARTx->DR=tmp_str[i]; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); } HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); HMI_USARTx->DR=0xFF; while(__HAL_UART_GET_FLAG(&husartx_HMI, UART_FLAG_TXE) == RESET); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值