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

资料

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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); }
### 回答1: 基于STM32单片机的DHT11温湿度传感器OLED显示程序可以实现以下功能: 首先,需要连接STM32单片机与DHT11温湿度传感器以及OLED显示屏。 然后,编写程序读取DHT11传感器的温湿度数值。可以通过引脚连接和使用相应的库函数来实现数据读取。 接下来,使用OLED显示屏库函数将温湿度数据显示OLED屏幕上。可以在屏幕上创建相应的文本框或者图标来显示温湿度值。可以使用合适的库函数调用,将温湿度数据转换为字符串格式并在屏幕上显示出来。 同时,可以设计一个定时器来定时更新温湿度数据的显示。可以设置一个适当的时间间隔来实现数据的定时更新,并使用相应的库函数来控制定时器的启动和停止。 此外,为了增加用户体验,还可以添加一些额外的功能,比如在某个温湿度阈值超过一定值时,显示警告信息或者触发报警器等。 最后,将编写好的程序下载到STM32单片机中进行测试。通过观察OLED显示屏是否能够正确显示温湿度数值,以及数据是否能够定时更新,来验证程序的正确性。 总体来说,基于STM32单片机的DHT11温湿度传感器OLED显示程序需要通过串口和I2C总线连接硬件设备,并使用相应的库函数来读取传感器数据和控制OLED显示屏,以实现温湿度数据的实时显示。 ### 回答2: 基于STM32单片机的DHT11温湿度传感器和OLED显示程序可以实现如下功能。 首先,我们需要连接DHT11温湿度传感器到STM32单片机的GPIO口。DHT11传感器的信号线接到单片机的输入GPIO口,供电线接到单片机的5V电源口,接地线接到单片机的地线。 接着,需要通过STM32的GPIO口读取DHT11传感器发送的温湿度数据。通过向DHT11传感器发送一个读取请求信号,然后在适当的时间间隔后读取传感器发送的数据,包括温度和湿度值。 接下来,我们需要将读取到的温湿度数据通过I2C或SPI协议发送到连接的OLED显示屏上显示出来。首先,需要初始化I2C或SPI接口,然后将温湿度数据传送到OLED显示屏的适当位置进行显示。可以使用相应的OLED显示屏库函数来帮助实现这一功能。 此外,为了更好地呈现温湿度数据,还可以添加一些额外的功能。例如,可以设置一个温度和湿度的阈值,当温度或湿度超过阈值时,通过OLED显示屏进行警告或提示。还可以添加一个实时钟表显示当前的时间,并将当前温湿度数据显示在时钟表上。 需要注意的是,在编写程序时,应根据单片机型号和开发环境选择相应的库函数和配置参数,确保程序正确运行。 以上是基于STM32单片机的DHT11温湿度传感器和OLED显示程序的简要说明。具体的实现细节和代码可以根据具体的需求和硬件平台进行调整和开发。 ### 回答3: 基于STM32单片机的DHT11温湿度传感器OLED显示程序主要实现了以下功能。 首先,我们需要通过STM32单片机与DHT11传感器进行通信。我们可以通过引脚连接和编程设置来实现数据的读取。在程序中,我们需要配置引脚输入/输出模式,并通过适当的延时来与DHT11发送和接收数据。 接下来,我们需要解析从DHT11传感器接收到的数据。DHT11传感器会发送40位二进制数据,其中包含温度和湿度信息。我们可以根据协议来解析这些数据,并将其存储到相应的变量中。 然后,我们需要将解析后的数据通过OLED显示屏进行显示。在STM32单片机中,我们可以使用相应的库函数来控制OLED显示屏。我们需要将温度和湿度信息转换为字符串,并使用适当的字符函数来显示OLED屏幕上。 最后,我们可以通过循环来实现数据的持续更新和显示。以一定的时间间隔读取DHT11传感器的数据,并将其显示OLED屏幕上。这样,我们就实现了基于STM32单片机的DHT11温湿度传感器OLED显示程序。 需要注意的是,为了确保程序的正常运行,我们还需要根据实际情况对程序进行优化和调试。这可能包括校准温湿度传感器、处理错误情况和调整程序逻辑等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值