IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32的楼道灯 -> 正文阅读

[嵌入式]基于STM32的楼道灯


前言

楼道灯是楼道专用的照明灯,属于新型建筑照明系统,楼道灯单灯采用声光控,实现人来灯亮,人走灯灭,达到节能,降耗,使用方便,性能安全可靠,可满足住宅楼及办公楼的不同需要。既符合了国家绿色节能建筑的要求,也提升了楼宇建筑的品位.

视频链接:https://www.bilibili.com/video/BV1xf4y1J7cB/
进阶版视频:https://www.bilibili.com/video/BV1qU4y1P7GW/


准备材料

一、硬件方面

  1. stm32单片机
  2. 灯模块(可以使用led代替)
  3. 环境光传感器
  4. 声音传感器

二、软件方面

  1. STM32CubeIDE
  2. STM32CubeProgrammer

三、建立工程

1.代码编写

①ADC配置:

hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.NbrOfConversion = 2;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_9;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
  sConfig.SingleDiff = ADC_SINGLE_ENDED;
  sConfig.OffsetNumber = ADC_OFFSET_NONE;
  sConfig.Offset = 0;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel
  */
  sConfig.Channel = ADC_CHANNEL_11;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

adc.c

/* USER CODE BEGIN 1 */
enum
{
	ADCCHN_NOISY,
	ADCCHN_LUX,
	ADCCHN_MAX,
};

int adc_sample_lux_noisy(uint32_t *lux, uint32_t *noisy)
{
	uint8_t    i;
	uint32_t   timeout = 0xffffff;

	for(i=0; i<ADCCHN_MAX; i++)
	{
		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1, timeout);

		if(ADCCHN_NOISY == i)
		{
			*noisy = HAL_ADC_GetValue(&hadc1);
		}
		else if(ADCCHN_LUX == i)
		{
			*lux = HAL_ADC_GetValue(&hadc1);
		}
		HAL_Delay(10);
	}

	HAL_ADC_Stop(&hadc1);
	return 0;
}

/* USER CODE END 1 */

②ADC配置:

GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(DHT11_GPIO_Port, DHT11_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, jidianqi1_Pin|jidianqi2_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, SysLed_Pin|BlueLed_Pin|RedLed_Pin|GreenLed_Pin, GPIO_PIN_SET);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = DHT11_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(DHT11_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : PBPin PBPin PBPin PBPin
                           PBPin PBPin */
  GPIO_InitStruct.Pin = jidianqi1_Pin|jidianqi2_Pin|SysLed_Pin|BlueLed_Pin
                          |RedLed_Pin|GreenLed_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pin : PtPin */
  GPIO_InitStruct.Pin = KEY0_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(KEY0_GPIO_Port, &GPIO_InitStruct);

  /* EXTI interrupt init*/
  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

gpio.c

gpio_t  leds[LedMax] =
{
		{ "SysLed", GPIOB,  SysLed_Pin},
		{ "BlueLed", GPIOB,  BlueLed_Pin},
		{ "RedLed", GPIOB,  RedLed_Pin},
		{ "GreenLed", GPIOB,  GreenLed_Pin},
};
void turn_led(int led,int status)
{
	GPIO_PinState  level;

	if(led >= LedMax || led < 0) return;

	level = (status == OFF)? GPIO_PIN_SET : GPIO_PIN_RESET;

	HAL_GPIO_WritePin(leds[led].group, leds[led].pin,level);

}

③main函数

简易法:

	uint32_t	lux,noisy;
	uint32_t	start = 0;
	uint8_t		light_status = OFF;
while (1)
  {
	  if( OFF == light_status )
	  {
		  adc_sample_lux_noisy(&lux, &noisy);
		  printf("LUX=[%lu],NOISY[%lu]\r\n", lux, noisy);

		  if( lux > 30 && noisy > 800 )
		  {
			  printf("Light_status is ON\r\n");
			  turn_led(GreenLed, ON);
			  HAL_Delay(5000);
			  turn_led(GreenLed, OFF);
		  }
	  }

不过这个代码还不够完善,就是你还希望做其他的事的的时候就不行了,因为进入delay函数,就干不了其他的了。

升级版: 运用巧妙的超时控制(time_after();)
很好的解决可以一边干别的事一边实现这个功能。(解决时间回绕问题)
在这里我还加上了蜂鸣器,当晚上有人经过的时候,发出提示声音并亮灯十五秒。
使用的是无源蜂鸣器,利用PWM来使它发出声响。
tim.c


  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 80-1;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 370-1;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 185;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */

  /* USER CODE END TIM2_Init 2 */
  HAL_TIM_MspPostInit(&htim2);
void buzzer_Start(uint8_t times,uint16_t interval)
{

	while( times-- )
	{
		if(HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2) != HAL_OK)
		{
			Error_Handler();
		}

		HAL_Delay(interval);

		if(HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2) != HAL_OK)
		{
			Error_Handler();
		}

		HAL_Delay(interval);
	}
}

main.c

while (1)
  {
	  if( OFF == light_status )
	  {
		  adc_sample_lux_noisy(&lux, &noisy);
		  //printf("LUX=[%lu],NOISY[%lu]\r\n", lux, noisy);

		  if( lux < 30 && noisy > 850 )
		  {
			  printf("Light_status is ON\r\n");
			  turn_led(GreenLed, ON);

			  light_status = ON;

			  start = HAL_GetTick();
		  }


	  }

	  else
	  {
		  if( time_after(HAL_GetTick(), start + 15000) )
		  {
			  printf("Light_status is ON\r\n");
			  turn_led(GreenLed, OFF);

			  HAL_Delay(200);

			  light_status = OFF;
		  }
	  }

	  HAL_Delay(10);

2.工程的初建立

在这里插入图片描述
选择对应的芯片型号
在这里插入图片描述
然后命名选择
在这里插入图片描述
点击ioc进入配置设置
在这里插入图片描述
选择下载模式
这里我用的是USB方式下载,选择的是这个,如果你选择ST-Link下载你可选择JTAG(4pins)。
在这里插入图片描述
RCC 配置界面。以外部时钟为例,STM32CubeMX中外部时钟配置可选类型为 Disable 、 BYPASS Clock Source(旁路时钟源) 、Crystal/Ceramic Resonator(石英/陶瓷 晶振) 三种类型.
选择Crystal/Ceramic Resonator(石英/陶瓷 晶振)
在这里插入图片描述
选择你需要的灯GPIO口,配置输出模式
在这里插入图片描述
选择你想选用的ADC模块端口进行声音传感器和环境光传感器连接,并配置
这里我选择的是PA4和PA6(可以去芯片的datasheet查看哪些是adc的串口)
在这里插入图片描述
使能这两个通道,并配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
时钟配置
在这里插入图片描述
adc时钟配置,最好不要太高,这里我选择12MHZ
在这里插入图片描述
然后保存ctrl+s即可。


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 11:11:07  更:2021-09-05 11:13:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:32:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码