环境光传感器--OPT3001,硬件开发与程序设计

环境光传感器–OPT3001,硬件开发与程序设计

前言

  最近又给自己挖了个小坑,算是之前波形发生器的分支学习任务吧,想在设备上集成一些传感器,用于学习和多传感器合并算法的开发。
  目前设计的一个传感器小板,包含了环境光传感器(OPT3001)、温度传感器(TMP102)、九轴运动传感器(BMX160)、气压温湿度传感器(BME280)。可以说这些传感器可以让我得到周围环境参数和本体的运动参数了。
  由于硬件部分是一体的,所以在Github上四个传感器的硬件、程序等我都放在了一个仓库中,完成一个我便会上传一个。程序风格都一致,都是基于STM32HAL库的小白级教学。最大程序的方便移植。

硬件部分介绍

OPT3001介绍

应用

  目前我的用途还是测量环境的光线亮度,来实时调整屏幕的亮度,和手机、平板上的光线传感器用途差不多,由于该传感器可以隔绝红外线什么的,所以可以在暗色玻璃下使用,之后可以尝试一下。

参数性能

测量范围:0.01Lux–83000Lux
12种量程,可以由IC自动设置量程。
由上下阈值中断功能,可以滤波。

量程方面,我在较暗环境光下,用手指按住传感器,基本是个位数的Lux,用手机手电筒照传感器,基本可以满量程。测量范围在日常使用是足够的。
最主要的功能就是这些了,详细参数可以参见官方文档

电路部分

  电路设计几乎没有难度,我将四个IIC地址的调试焊盘都画了出来。
在这里插入图片描述

程序设计

移植部分

  OPT的寄存器不多,所以程序也不是很复杂,先贴出移植中需要修改的部分。
  在int OPT3001_Init(void)函数中

OPT3001 Eye_1;
int OPT3001_Init(void)
{
  /********用户参数********/
  //INT脚位
  Eye_1.INT_Pin = OPT3001_INT_Pin;
  Eye_1.INT_Prot = OPT3001_INT_GPIO_Port;
  //使用的IIC
  Eye_1.IIC_Aisle = hi2c1;
  Eye_1.IIC_ADDR = 0x45;
  //低阈值
  Eye_1.Low_Limit = 200;
  //高阈值
  Eye_1.High_Limit = 60000;
  //当前量程
  Eye_1.Configuration.Range = Range_AUTO;
  //转换时间
  Eye_1.Configuration.Conversion_Time = completely_Conversion;
  //转换模式
  Eye_1.Configuration.Conversion_Mode = continuous;
  //INT极性
  Eye_1.Configuration.Polarity_Field_Bit = Low_efficient;
  //故障计数字段
  Eye_1.Configuration.Fault_Count_Field_Bit = Fault_One;
  //屏蔽指数字段
  Eye_1.Configuration.Mask_Exponent_Field_Bit = Exponent_show;
  //中断模式
  Eye_1.Configuration.Latch_field_Bit = latched_Window_style;

结构体中,需要根据自己的硬件修改INT脚位、所使用的IIC名称和地址
除了这几个,其他的是需要根据自己软件的需求来设置的,详细介绍一下
  高低阈值:在中断模式为latched_Window_style时候,超过高阈值或者低于低阈值,都会累计在故障中,当故障计数超过Fault_Count_Field_Bit所设定的数量后,会触发中断。(这故障可以理解为滤波,可以设置在多次超过阈值时,才触发中断)
  当前量程:可以手动设置量程或设置为自动量程,自动量程由IC自动完成,所以除非特定领域,否则自动量程还是比较好用的。所以在程序中我只写了自动量程的代码。
  转换时间:OPT3001有两种转换模式:标准转换(800ms)和快速转换(100ms)。除了时间的区别之外,标准转换比快速转换的精度高。在代码上的体现就是当一次转换后需要等待对应的时间才能更新数据,但接口不读取时,数据依旧在刷新,所以在读取亮度的API中,我没有加入Delay,需要在调用函数时,判断是否是连续读取,自行延时。
  转换模式:可以设置为关机、单次转换、连续转换。关机可以省电,单次转换会在转换完成后将数据存入寄存器等待读取,然后关机。
  INT极性:就是触发中断是上升沿还是下降沿,一般都使用下降沿,修改为上升沿需要修改中断相关的代码
  故障计数字段:可以选择一个、两个、四个、八个连续故障才触发中断,相当于滤波的程度。
  中断模式:分为transparent_Hysteresis_style(透明滞后式)和latched_Window_style(锁窗式),翻译出来怪怪的。区别简而言之就是透明滞后式仅对高阈值做触发(寄存器中低阈值位依旧工作),而锁窗式对高低阈值都做触发。作为懒鬼,我也只写了latched_Window_style(锁窗式)的代码 = =
  设置好了这些,在Main中调用OPT3001_Init,对OPT3001初始化后,即可调用API获取数据了。

API介绍

  最常用的就是读取当前亮度的函数了
参数只需要设备结构体和存放结果的变量就可以了。

/**
  * @brief 读取当前亮度
  * @param OPT3001:读目标设备
  * @param DATA:读取内容
  * @retval 读操作反馈
  */
int OPT3001_Read_Brightness(OPT3001 *OPT3001, float *DATA_OUT)

如果高低阈值需要变动,可以调用以下两个函数

/**
  * @brief 设置高阈值
  * @param OPT3001:设置目标设备
  * @param DATA:阈值
  * @retval 写操作反馈
  */
int OPT3001_Write_High_Limit(OPT3001 *OPT3001, int DATA)

/**
  * @brief 设置低阈值
  * @param OPT3001:设置目标设备
  * @param DATA:阈值
  * @retval 写操作反馈
  */
int OPT3001_Write_Low_Limit(OPT3001 *OPT3001, int DATA)

  OPT3001自带了两个ID寄存器,分别是生产厂商寄存器和设备寄存器。可以由于检测通讯是否正常,在OPT3001初始化的程序中,我对这个两个ID做了验证,如果通讯不正常或者ID错误,返回错误。也可以调用以下两个函数对两个ID读取。

/**
  * @brief 读取生产厂商ID
  * @param OPT3001:读目标设备
  * @retval 写操作反馈
  */
int OPT3001_Read_Manufacturer_ID(OPT3001 *OPT3001)

/**
  * @brief 读取设备ID
  * @param OPT3001:读目标设备
  * @retval 写操作反馈
  */
int OPT3001_Read_Device_ID(OPT3001 *OPT3001)

  需要修改OPT3001的转换模式、转换时间等属于配置寄存器的参数可以直接使用结构体修改,修改完成后,使用上传函数,对OPT3001配置寄存器做修改
/**

  • @brief 上传配置寄存器
  • @param OPT3001:设置目标设备
  • @retval 写操作反馈
    */
    int OPT3001_Write_Configuration(OPT3001 *OPT3001)

中断部分

中断部分其实也算是需要移植的一部分,
  这是我STM32CUBMX生成的中断函数和我自己修改的部分。

void EXTI0_1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_1_IRQn 0 */

  /* USER CODE END EXTI0_1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  /* USER CODE BEGIN EXTI0_1_IRQn 1 */
  if(HAL_GPIO_ReadPin(OPT3001_INT_GPIO_Port,OPT3001_INT_Pin) == 0)
  {
    OPT3001_INT(&Eye_1);
  }
  /* USER CODE END EXTI0_1_IRQn 1 */
}

对引脚验明正身后就跳转到OPT3001.c文件中中断函数。
  这是我自己写的中断需要处理的程序,只是判断亮度是超过了高阈值还是低阈值。每个人的需求不一样,这部分只能按照自己的需求自己写了。

int OPT3001_INT(OPT3001 *OPT3001)
{
  //中断标志
  OPT3001_Read_Configuration(&*OPT3001);
  //判断高低标志位
  if (OPT3001->Configuration.Low_Limit_Bit == 1)
  {
    OPT3001->Configuration.Low_Limit_Bit = 0;
    printf("低中断 \r\n");
  }
  if (OPT3001->Configuration.High_Limit_Bit == 1)
  {
    OPT3001->Configuration.High_Limit_Bit = 0;
    printf("高中断 \r\n");
  }
}

开源地址

后续的三个传感器我也会抓紧开发,会一并上传在同一个库了。
可以去白嫖了~下载的时候求求点一下星星,抱拳了!
github :https://github.com/lijinlong21549/Sensor-collection
关于硬件有什么问题欢迎私信。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值