STM32单片机开发实现楼道声、光控制灯

STM32单片机开发实现楼道声、光控制灯

1、STM32CubeIDE配置

###1、配置使能LED灯
这里我们使用LED灯模拟灯泡实现灯光控制,配置LED连接的相应CPU管脚,设置默认电平为高电平(灯状态为灭)

1.配置LED管脚

在这里插入图片描述

2.配置使能ADC

配置ADC1,使能IN15和IN16,选择Single-ended(Differential 为差分信号)。这时候PB0和PB1两个管脚设置为输入模式了,然后对管脚进行重命名。
在这里插入图片描述
在这里插入图片描述
ADC的时钟树最好不要设置的太高,这里调整为12MHZ;
在这里插入图片描述

2、 任意位置按Ctrl+s将开始自动生成代码

在这里插入图片描述

3.修改相关源代码

修改gpio.c代码实现LED灯

/* USER CODE BEGIN 2 */

typedef struct gpio_s

{
	GPIO_TypeDef		*group;

	uint16_t			pin;
}gpio_t;

gpio_t     leds[LedMax]=
{
		{RedLed_GPIO_Port, RedLed_Pin},
		{GreenLed_GPIO_Port,GreenLed_Pin},
		{BlueLed_GPIO_Port, BlueLed_Pin},
};//LED灯

gpio_t		relays[RelayMax] =
{
		{Relay_GPIO_Port, Realy_Pin},

};//继电器

void turn_led(int which, int status)

{
	GPIO_PinState		level;


	if(which>=LedMax)

		return ;

	level = status==OFF ? GPIO_PIN_SET : GPIO_PIN_RESET;

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

void blink_led(int which, uint32_t interval)

{
	turn_led(which,ON);
	HAL_Delay(interval);

	turn_led(which,ON);
	HAL_Delay(interval);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	static uint8_t		relay_status=OFF;

	if(Key1_Pin == GPIO_Pin)
	{
		blink_led(BlueLed,500);
	}

	else if(Key2_Pin == GPIO_Pin)
	{
		blink_led(RedLed,500);
	}
	
}

头文件gpio.h里添加LED控制函数turn_led()和blink_led()的声明及相关枚举、宏定义:

/* USER CODE BEGIN Prototypes */

enum
{
	RedLed,

	GreenLed,

	BlueLed,

	LedMax,
};

enum

{
	Relay,
	RelayMax,
};

#define OFF		0
#define ON      1

/*函数说明:控制LED灯?/灭的功能函数
 * 参数说明:which指定要控制哪个灯,取枚举里的?
 *        status要控制灯亮还是灭,取宏定?
 * 返回值:无
 */

extern void turn_led(int which, int status);
/*函数说明:控制LED闪烁功能函数
 * 参数说明:which指定要控制的灯?
 *        interval:指定闪烁的间隔时间,单位为毫秒
 * 返回值: 无
 */
extern void blink_led(int which, uint32_t interval);

extern void turn_relay(int which,int status);

/* USER CODE END Prototypes */

修改adc.c文件,添加环境光强传感器和声音传感器实现;

/* USER CODE BEGIN 1 */

enum
{
	ADCCHN_LUX,

	ADCCHN_NOISY,

	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_LUX == i)
		{
			*lux=HAL_ADC_GetValue(&hadc1);
		}

		else if(ADCCHN_NOISY ==i)
		{
			*noisy=HAL_ADC_GetValue(&hadc1);
		}

		HAL_Delay(10);
	}

	HAL_ADC_Stop(&hadc1);

	return 0;
}

/* USER CODE END 1 */

修改adc.h,添加ADC采样函数的声明


/* USER CODE BEGIN Includes */

extern int adc_sample_lux_noisy(uint32_t *lux,uint32_t *noisy);

/* USER CODE END Includes */

4.修改main.c源代码

实现功能

/* USER CODE BEGIN 1 */

	uint32_t 		lux,noisy;

	uint32_t        start;

	uint8_t         light_status=0;

  /* USER CODE END 1 */
 /* USER CODE BEGIN WHILE */

 //beep_start(2,300);

  while (1)
  {
	  if(OFF==light_status)

	  {
		  adc_sample_lux_noisy(&lux,&noisy);

		  printf("Lux[%lu]  Noisy[%lu]\r\n",lux,noisy);

		  if(lux<800&& noisy>100)
		  {
			  printf("Turn light ON\r\n");
			  turn_led(RedLed,ON);

			  light_status=ON;

			  start = HAL_GetTick();
		  }

		  else
		  {
			  if(time_after(HAL_GetTick(),start+10000))

			  {
				  printf("Turn Light OFF\r\n");
				  turn_led(RedLed,OFF);

				  /*must give delay for turn relay off got noisy*/

				  HAL_Delay(200);

				  /*set light status as OFF*/

				  light_status=OFF;
			  }
		  }
	  }


	  HAL_Delay(500);
	  
    /* USER CODE END WHILE */

至此相关功能均已实现
请添加图片描述
在这里插入图片描述

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
自动延时控制设计是指一种能根据环境噪音和照强度的变化自动调节亮度和开关时间的具。这种设计可以实现智能化的照明控制,提高照明系统的能效和使用舒适度。 自动延时控制设计主要包括音检测模块、敏电阻模块、控制模块和照明模块。音检测模块通过麦克风感知环境中的音变化,将音信号转换成电信号输入到控制模块。敏电阻模块通过感应环境中的照强度变化,将电信号输入到控制模块。 控制模块根据音信号和电信号判断环境状况,并根据预设的控制参数进行亮度和开关时间的调节。如果环境噪音较大或照不足,控制模块会自动调高亮度和延长开关时间,以保证良好的照明效果。如果环境噪音较小或照充足,控制模块会适当降低亮度和缩短开关时间,以节约能源。 自动延时控制设计具有多种应用场景。例如,在办公室或学习空间中,当环境噪音较大或照不足时,会自动调亮,为人们提供舒适的工作或学习环境。而在住宅区或公共场所,当环境噪音较小或照充足时,会自动调暗,节约能源并减少环境污染。 自动延时控制设计在提高照明系统能效和使用舒适度方面具有重要意义。它不仅能够明显减少人工干预,还能根据环境变化自动调节,满足不同场景下的实际需求,实现智能化的照明控制。未来随着技术的发展,自动延时控制设计将会得到更广泛的应用,并为人们带来更便利和舒适的生活体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值