HI3861学习笔记(16)——光强度GY-30(BH1750)使用

2023-10-13 06:59

本文主要是介绍HI3861学习笔记(16)——光强度GY-30(BH1750)使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

传感器特点:

  • 支持I2CBUS接口
  • 接近视觉灵敏度的光谱灵敏度特性
  • 输出对应亮度的数字值
  • 对应广泛的输入光范围。(相当于1-65535lx)
  • 通过降低功率功能,实现低电流化。
  • 通过50Hz/60Hz除光噪音功能实现稳定的测定。
  • 支持1.8v逻辑输入接口。
  • 无需其他外部件。
  • 光源依赖性弱。
  • 有两种可选的I2Cslave地址。
  • 可调的测量结果影响较大的因素为光入口大小。
  • 使用这种功能计算1.1lx到100000lx马克斯/分钟的范围。
  • 最小误差变动在±20%。
  • 受红外线影响很小。

1.1 测量程序步骤

1.2 指令集合

1.3 测量模式说明

二、硬件连接

功能口引脚
SCLGPIO0
SDAGPIO1
ADDRADDR ≥ 0.7VCC 从机地址为”1011100“
ADDR ≤ 0.3VCC 从机地址为”0100011“

三、添加I2C驱动

查看 HI3861学习笔记(15)——I2C接口使用

四、I2C通信流程

测量结果为2字节(高字节 High Byte 和低字节 Low Byte)数据,计算公式为:

光照强度(单位lx)=(High Byte  + Low Byte)/ 1.2

五、HI3861作为主机与BH1750光照强度传感器通信

编译时在业务BUILD.gn中包含路径

include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/interfaces/kits/wifiiot_lite",]

连续高分辨率模式

I2C_Init()初始化I2C后

BH1750_Init()配置BH1750连续高分辨率模式

BH1750_ReadLightIntensity()获取光强度

#include <stdio.h>
#include <string.h>
#include <unistd.h>#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_errno.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_i2c.h"
#include "wifiiot_i2c_ex.h"#define I2C_TASK_STACK_SIZE 1024 * 8
#define I2C_TASK_PRIO 25#define WRITE_BIT           0x00
#define READ_BIT            0x01#define BH1750_SLAVE_ADDR   0x23 // 从机地址
#define BH1750_PWR_DOWN     0x00 // 关闭模块
#define BH1750_PWR_ON       0x01 // 打开模块等待测量指令
#define BH1750_RST          0x07 // 重置数据寄存器值在PowerOn模式下有效
#define BH1750_CON_H        0x10 // 连续高分辨率模式,1lx,120ms
#define BH1750_CON_H2       0x11 // 连续高分辨率模式,0.5lx,120ms
#define BH1750_CON_L        0x13 // 连续低分辨率模式,4lx,16ms
#define BH1750_ONE_H        0x20 // 一次高分辨率模式,1lx,120ms,测量后模块转到PowerDown模式
#define BH1750_ONE_H2       0x21 // 一次高分辨率模式,0.5lx,120ms,测量后模块转到PowerDown模式
#define BH1750_ONE_L        0x23 // 一次低分辨率模式,4lx,16ms,测量后模块转到PowerDown模式/**@brief I2C驱动初始化@param 无@return 无
*/
void I2C_Init(void)
{GpioInit();//GPIO_0复用为I2C1_SDAIoSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA);//GPIO_1复用为I2C1_SCLIoSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL);//baudrate: 400kbpsI2cInit(WIFI_IOT_I2C_IDX_1, 400000);
}/**@brief I2C写数据函数@param slaveAddr -[in] 从设备地址@param regAddr -[in] 寄存器地址@param pData -[in] 写入数据@param dataLen -[in] 写入数据长度@return 错误码
*/
int I2C_WriteData(uint8_t slaveAddr, uint8_t regAddr, uint8_t *pData, uint16_t dataLen)
{int ret;WifiIotI2cData i2c_data = {0};if(0 != regAddr){i2c_data.sendBuf = &regAddr;i2c_data.sendLen = 1;ret = I2cWrite(WIFI_IOT_I2C_IDX_1, (slaveAddr << 1) | WRITE_BIT, &i2c_data);if(ret != 0){printf("===== Error: I2C write status1 = 0x%x! =====\r\n", ret);return 0;}}i2c_data.sendBuf = pData;i2c_data.sendLen = dataLen;ret = I2cWrite(WIFI_IOT_I2C_IDX_1, (slaveAddr << 1) | WRITE_BIT, &i2c_data);if(ret != 0){printf("===== Error: I2C write status1 = 0x%x! =====\r\n", ret);return 0;}return 1;
}/**@brief I2C读数据函数@param slaveAddr -[in] 从设备地址@param regAddr -[in] 寄存器地址@param pData -[in] 读出数据@param dataLen -[in] 读出数据长度@return 错误码
*/
int I2C_ReadData(uint8_t slaveAddr, uint8_t regAddr, uint8_t *pData, uint16_t dataLen)
{int ret;WifiIotI2cData i2c_data = {0};if(0 != regAddr){i2c_data.sendBuf = &regAddr;i2c_data.sendLen = 1;ret = I2cWrite(WIFI_IOT_I2C_IDX_1, (slaveAddr << 1) | WRITE_BIT, &i2c_data);if(ret != 0){printf("===== Error: I2C write status = 0x%x! =====\r\n", ret);return 0;}}i2c_data.receiveBuf = pData;i2c_data.receiveLen = dataLen;ret = I2cRead(WIFI_IOT_I2C_IDX_1, (slaveAddr << 1) | READ_BIT, &i2c_data);if(ret != 0){printf("===== Error: I2C read status = 0x%x! =====\r\n", ret);return 0;}return 1;
}/**@brief BH1750初始化函数@param 无@return 无
*/
void BH1750_Init(void)
{uint8_t data;data = BH1750_PWR_ON;              // 发送启动命令I2C_WriteData(BH1750_SLAVE_ADDR, 0, &data, 1);data = BH1750_CON_H;               // 设置连续高分辨率模式,1lx,120msI2C_WriteData(BH1750_SLAVE_ADDR, 0, &data, 1);
}/**@brief BH1750获取光强度@param 无@return 光强度
*/
float BH1750_ReadLightIntensity(void)
{float lux = 0.0;uint8_t sensorData[2] = {0};I2C_ReadData(BH1750_SLAVE_ADDR, 0, sensorData, 2);lux = (sensorData[0] << 8 | sensorData[1]) / 1.2;return lux;
}static void I2CTask(void)
{int cnt = 0;float lux;I2C_Init();BH1750_Init();usleep(180000);                     // 设置完成后要有一段延迟while (1){printf("test cnt: %d", cnt++);lux = BH1750_ReadLightIntensity();printf("sensor val: %.02f [Lux]\n", lux);usleep(1000000);}
}static void I2CExampleEntry(void)
{osThreadAttr_t attr;attr.name = "I2CTask";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = I2C_TASK_STACK_SIZE;attr.priority = I2C_TASK_PRIO;if (osThreadNew((osThreadFunc_t)I2CTask, NULL, &attr) == NULL){printf("Falied to create I2CTask!\n");}
}APP_FEATURE_INIT(I2CExampleEntry);

查看打印:


• 由 Leung 写于 2021 年 10 月 10 日

• 参考:BH1750FVI光强度传感器及其STM32驱动程序
    BH1750 STM32 驱动程序
    BearPi-HM_Nano开发板传感器驱动开发——E53_SC1读取光照强度

这篇关于HI3861学习笔记(16)——光强度GY-30(BH1750)使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/201543

相关文章

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文