首页 > 其他分享 >4.STM32传感器ADC采样+继电器控制实现声光控灯

4.STM32传感器ADC采样+继电器控制实现声光控灯

时间:2023-06-30 21:45:05浏览次数:37  
标签:HAL lux 继电器 STM32 turn ADC time 光控 noisy

找到环境光与声音传感器对应的管教,使能,再在时钟树中设置频率为12Mhz,一般不要太高

 

在adc.c 中可以添加如下代码:

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

在adc.h中声明函数后,可以在main函数中调用,用串口调试助手测试结果:

 

基于此,我们可以实现简单的声光控灯了。

 ----------------------------------------------------------------------------------------------------------------

继电器介绍:

  

 

 

 以下是用开发板上的rgb灯,根据环境光和声音情况模拟继电器开关控制灯的代码:

if( OFF == light_status)
	  {
		  adc_sample_lux_noisy(&lux,&noisy);
		  printf("lux: %ld,noisy: %ld\n",lux,noisy);

		  if(lux <30 && noisy >800)
		  {
			  printf("turn light on\r\n");
			  turn_relay(ON);
			  turn_led(RedLed,ON);
			  light_status = ON;

			  start = HAL_GetTick();
		  }
	  }
	  else
	  {
		  if(time_after(HAL_GetTick(),start+15000))
		  {
			  printf("Turn Light off\r\n");
			  turn_relay(OFF);
			  turn_led(RedLed,OFF);

			  HAL_Delay(200);
			  light_status = OFF;
		  }

	  }

	  HAL_Delay(300);

 

    代码中,我们通过ADC采样当前的光强和噪音值,如果光线较弱并且声音比较大的话就控制继电器开灯。为了符合实际情况,做了一个时间的控制,15s后将自动关灯。

    延时15s 的控制逻辑实现里,我们并没有直接用HAL_Delay(1500),而是在点灯的时候记录当前时间,然后循环获取当前时间看有没有超时,如果超时则”控制继电器关灯”。(这样可以在每次循环间隙做一些其他的操作)


    在判断时间是否到没有,我们不能直接if((HAL_GetTick() - start) - 15000)这个条件判断,因为变量的最大记值是有限制的(uint32_t最大计数到2^32-1),而时间是无限的,这样会存在时间回绕的问题。
    

    (参考Linux内核里的jiffies回绕解决方案,使用了time_after()这个宏来判断是否超时。这个宏需要添加到main.h头文件中。)

 

#define time_after(a,b)	((int32_t)(b) - (int32_t)(a) <0)
#define time_before(a,b) time_after(b,a)

#define time_after_eq(a,b) ((int32_t(a) - (int32_t)(b) >=0))
#define time_before_eq(a,b) time_after_eq(b,a)

  

 

 

标签:HAL,lux,继电器,STM32,turn,ADC,time,光控,noisy
From: https://www.cnblogs.com/genm/p/17517791.html

相关文章

  • 一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程,
    一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程,使用的是SOEM协议栈的1.3.1版本。此外,还可以使用NUCLEO-H743ZI开发板进行配套开发。该系统支持DC同步,并且可以与多种驱动器型号配合使用,包括汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、......
  • STM32 HAL库关于延时函数
    1堵塞式延时用这种程序会一直等待不能做其它工作,优点是实现简单,适用于断时的单任务等待。HAL_Delay(1000);//延时1000ms2非堵塞式等待借用系统的开机时间,可以边等待边完成其它任务,不占用CPU,比较推荐这种方式。1uint32_tstartTime,now;23startTime=HAL_GetTick();......
  • stm32 IAP升级 OTA升级 野外设备远程升级 自建FTP服务器升级 多App备份 切换,防变砖
    stm32IAP升级OTA升级野外设备远程升级自建FTP服务器升级 多App备份切换,防变砖芯片stm32f103系列4G模块EC200T程序简介:一个bootloader程序 多个主程序程序可相互切换主程序A出厂前烧录,永不更改,用于升级失败后,做应急程序使用,保障单片机不变砖主程序B日常运行,可升级......
  • RT-Thread 正点原子阿波罗STM32F429IGT6-软件IIC控制I/O扩展模块PCF8574T(踩坑)
    第一步:在RT-ThreadSettings中打开I2C设备驱动,Ctrl+S保存 第二步:在drivers->board.h中进行配置,取消BSP_USING_I2C2的注释,并根据说明定义好引脚; 第三步:对引脚进行初始化,这里可使用CubeMX进行生成; 第四步:根据设备名查找设备 第五步:调用 rt_i2c_transfer 发......
  • STM32 USART1 改成 UART4 出现问题
    STM32USART1改成UART4出现问题群里面叫了半天,野火胸也不出来,那么久没有办法了,我自己发个帖子解决下问了一下度娘,网上有很多关于stm32uart4的问题,有时进不去串口中断的,有发送乱码的,那么我就在这里总结一下首先我们看一下文档我用的stm32f103vet6的,所以USART是模式是3+2,......
  • 为什么 Keil 中C/C++选项要 define STM32F10X_LD/MD/HD
    原因1:配置相应的中断向量表 原因2:配置相应的寄存器  总结原因:因为所有的stm32f10x 系列的芯片都会用到stm32f10x.h 这个头文件,但是问题的所在是:每种芯片的配置不同(中断向量个数、寄存器个数等等)因此宏条件编译#if!defined 判断这个宏(这个宏就是STM32F10X_LD......
  • 基于STM32单片机的差分升级和增量升级算法源码,这些源码可以在不同平台上进行移植
    基于STM32单片机的差分升级和增量升级算法源码,这些源码可以在不同平台上进行移植。此外,IAP升级和OTA升级技术,这些技术在物联网和车联网领域中得到广泛应用。原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/653978935134.html提取的知识点和领域范围:1.单片机(STM32):单片机是一......
  • 10bit 高速SAR ADC基于0.18um工艺的电路 可以直接用于性能仿真
    一个关于10位高速逐次逼近型模数转换器(ADC)的描述,它采用了0.18微米工艺制造的电路。这个ADC电路可以直接用于性能仿真。它的有效位数(ENOB)为9.6位,信号到噪声加性失真比(SFDR)为63.7分贝。该模数转换器是基于virtuoso设计工具开发的。知识点和领域范围:原创文章,转载请说明出处,资料来源:h......
  • FreeRTOS在STM32中是如何使用内存的
    转载自:《FeeRTOS在STM32中是如何使用内存的》没有FreeRTOS的时候:STM32资源的分配: 有FreeRTOS后(注意FreeRTOS的任务栈空间位于FreeRTOS的堆之中): STM32无OS编程Stack_Size和Heap_Size大小设置的意义其中STACK_SIZE和HEAP_SIZE在STM32的启动文件startup_stm32fxx.s......
  • stm32 基于HAL工程硬件I2C读取PCF8563
    参考链接:https://download.csdn.net/download/xqw19891201/11267260  #include"stm32xxxx.h"#include"stm32xxxx_hal.h"#definePCF8563_ADDRESS0xA2//PCF8563的I2C地址I2C_HandleTypeDefhi2c;//I2C句柄//从PCF8563读取一个字节uint8_tPCF8563_ReadByte(......