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

相关文章

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

sky-take-out项目中Redis的使用示例详解

《sky-take-out项目中Redis的使用示例详解》SpringCache是Spring的缓存抽象层,通过注解简化缓存管理,支持Redis等提供者,适用于方法结果缓存、更新和删除操作,但无法实现... 目录Spring Cache主要特性核心注解1.@Cacheable2.@CachePut3.@Ca

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化