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

相关文章

从零教你安装pytorch并在pycharm中使用

《从零教你安装pytorch并在pycharm中使用》本文详细介绍了如何使用Anaconda包管理工具创建虚拟环境,并安装CUDA加速平台和PyTorch库,同时在PyCharm中配置和使用PyTor... 目录背景介绍安装Anaconda安装CUDA安装pytorch报错解决——fbgemm.dll连接p

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

Java中的Cursor使用详解

《Java中的Cursor使用详解》本文介绍了Java中的Cursor接口及其在大数据集处理中的优势,包括逐行读取、分页处理、流控制、动态改变查询、并发控制和减少网络流量等,感兴趣的朋友一起看看吧... 最近看代码,有一段代码涉及到Cursor,感觉写法挺有意思的。注意是Cursor,而不是Consumer

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安