一、功能简介

项目名:基于单片机的语音识别灯光控制系统设计
项目编号:dz-663
单片机类型:STM32F103C8T6
具体功能:
1、通过人体热释电D203S是否有人,有人且光照较低时自动开灯,当人离开后,30s自动熄灭灯
2、通过光照模块5516检测当前环境的光照强度,检测到有人根据光照强度自动调节台灯的亮度;
3、通过按键可设置光照值、可调节灯的亮度;
4、通过语音识别模块SU-03T可控制台灯开关可调节亮度;
5、通过OLED显示亮度等级、模式、是否有人;
6、将检测的数据通过WiFi模块ESP8266传输到用户的手机端,并可以通过手机端远程控制台灯的开关。
 

二、系统框图设计

三、32实物图

单片机型号:STM32F103C8T6

板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。

供电接口:TYPE-C

 四、原理图

软件版本:AD2013

电路连线方式:网络标号连线方式

注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图

 五、PCB图

由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。

两层板,上下覆铜接地。

六、部分程序展示

软件版本:keil5

逻辑程序和驱动程序分开,分布于main.c和其他.c文件

/**********************************
函数名:处理函数
传参值:无
返回值:无
**********************************/
void Manage_Function(void)
{
	if(display_num == 0)								  										//测量界面
	{
		if(flag_mode == 0)                 										  //在自动模式下
    {
      if(HUMAN == 0)                   											//如果有人
      {
        light_middle = (light_trigger + light_min)/2;       //计算中间值
        if((light_value < light_trigger) && (light_value > light_middle)) //如果光照值处于中间值和触发值之间,开低档
        {
          flag_led = 1;
        }
        else if((light_value > light_min) && (light_value < light_middle))//如果光照值处于中间值和最小值之间,开中档 
        {
          flag_led = 2;
        }
        else if(light_value < light_min)                                  //如果光照值小于最小值,开高档 
        {
          flag_led = 3;
        }
        else                                                              //如果光照值大于触发值,关灯 
        {
          flag_led = 0;
        }
				
				flag_timer_begin_30s = 0;
				flag_timer_finish_30s = 0;
      }
      else                                                                //如果周围没人,30s后灯关闭
      {
				if(flag_timer_finish_30s == 1)																		
				{
					flag_timer_begin_30s = 0;
					
					flag_led = 0;
				}
				else													
				{
					flag_timer_begin_30s = 1;
				}
      }
    }
	}
	else																											//设置界面,关闭灯
	{
		flag_led = 0;
	}
	
	if(flag_led == 0)																					//灯光标志位对应PWM值
	{
		pwm_value = 0;
	}
	else if(flag_led == 1)
	{
		pwm_value = 3;
	}
	else if(flag_led == 2)
	{
		pwm_value = 6;
	}
	else
	{
		pwm_value = 10;
	}
	
	if(flag_finish_5s == 1)																		//5秒上传一次数据
  {
    flag_begin_5s = 0;
    Aliyun_Send_Data();
    flag_begin_5s = 1;
  }
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_USART1_UART_Init();
  MX_ADC1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

	Delay_Init();													//延时初始化
	Oled_Init();													//OLED初始化
	Key_Init();														//KEY初始化
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	
	Oled_Clear_All();											//清屏
	HAL_TIM_Base_Start_IT(&htim1);				//启动定时器
	HAL_UART_Receive_IT(&huart1, &huart1_rx_data, 1);				//获取串口1接收数据
	HAL_UART_Receive_IT(&huart2, &huart2_rx_data, 1);				//获取串口2接收数据

	Oled_ShowString(1,6,"WIFI ");
	Oled_ShowCHinese(2, 2, "初始化中");
	ESP8266_Init();											//初始化ESP8266
	Oled_ShowString(3,4,"........");
	while(Aliyun_DevLink())							//接入阿里云
	Delay_ms(500);
	Oled_ShowString(4,4,"........");
	Aliyun_Subscribe(topics_set, 1);		//订阅主题
	Delay_ms(500);
	Aliyun_Send_Data();									//数据上报初始状态
  flag_begin_5s = 1;									//开启定时
  Oled_Clear_All();										//清屏

  while (1)
  {
		Key_Function();										  //按键函数
		Monitor_Function();									//监测函数
		Display_Function();									//显示函数
		Manage_Function();									//处理函数

		if(flag_time_10ms == 1)							//计时
		{
			flag_time_10ms = 0;
			time_num++;
			if(time_num >= 6000)
			{
				time_num = 0;
			}
		}
		
		if(time_num % 10 == 0)							//指示灯闪烁
		{
			SYSTEM_LED = !SYSTEM_LED;
		}

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
  PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐