一、简介

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

传感器特点:

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

1.1 测量程序步骤

1.2 指令集合

1.3 测量模式说明

二、硬件连接

功能口 引脚
SCL GPIO23
SDA GPIO18
ADDR ADDR ≥ 0.7VCC 从机地址为”1011100“
ADDR ≤ 0.3VCC 从机地址为”0100011“

三、添加I2C驱动

查看 ESP32学习笔记(17)——I2C接口使用

四、I2C通信流程

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

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

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

连续高分辨率模式

I2C_Init()初始化I2C后

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

BH1750_ReadLightIntensity()获取光强度

#include <stdio.h>
#include "esp_log.h"
#include "driver/i2c.h"static const char *TAG = "i2c-example";#define I2C_MASTER_SCL_IO GPIO_NUM_23           /*!< gpio number for I2C master clock */
#define I2C_MASTER_SDA_IO GPIO_NUM_18           /*!< gpio number for I2C master data  */
#define I2C_MASTER_NUM 1                        /*!< I2C port number for master dev */
#define I2C_MASTER_FREQ_HZ 100000               /*!< I2C master clock frequency */
#define I2C_MASTER_TX_BUF_DISABLE 0             /*!< I2C master doesn't need buffer */
#define I2C_MASTER_RX_BUF_DISABLE 0             /*!< I2C master doesn't need buffer */#define WRITE_BIT I2C_MASTER_WRITE              /*!< I2C master write */
#define READ_BIT I2C_MASTER_READ                /*!< I2C master read */
#define ACK_CHECK_EN 0x1                        /*!< I2C master will check ack from slave*/
#define ACK_CHECK_DIS 0x0                       /*!< I2C master will not check ack from slave */
#define ACK_VAL 0x0                             /*!< I2C ack value */
#define NACK_VAL 0x1                            /*!< I2C nack value */#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模式SemaphoreHandle_t print_mux = NULL;/**@brief I2C驱动初始化@param 无@return 无
*/
int I2C_Init(void)
{int i2c_master_port = I2C_MASTER_NUM;i2c_config_t conf;conf.mode = I2C_MODE_MASTER;conf.sda_io_num = I2C_MASTER_SDA_IO;conf.sda_pullup_en = GPIO_PULLUP_ENABLE;conf.scl_io_num = I2C_MASTER_SCL_IO;conf.scl_pullup_en = GPIO_PULLUP_ENABLE;conf.master.clk_speed = I2C_MASTER_FREQ_HZ;i2c_param_config(i2c_master_port, &conf);return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
}/**@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;i2c_cmd_handle_t cmd = i2c_cmd_link_create();i2c_master_start(cmd);i2c_master_write_byte(cmd, (slaveAddr << 1) | WRITE_BIT, ACK_CHECK_EN);if(NULL != regAddr){i2c_master_write_byte(cmd, regAddr, ACK_CHECK_EN);}i2c_master_write(cmd, pData, dataLen, ACK_CHECK_EN);i2c_master_stop(cmd);ret = i2c_master_cmd_begin(1, cmd, 1000 / portTICK_RATE_MS);i2c_cmd_link_delete(cmd);return ret;
}/**@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;i2c_cmd_handle_t cmd = i2c_cmd_link_create();i2c_master_start(cmd);i2c_master_write_byte(cmd, (slaveAddr << 1) | READ_BIT, ACK_CHECK_EN);if(NULL != regAddr){i2c_master_write_byte(cmd, regAddr, ACK_CHECK_EN);}i2c_master_read(cmd, pData, dataLen, ACK_VAL);i2c_master_stop(cmd);ret = i2c_master_cmd_begin(1, cmd, 1000 / portTICK_RATE_MS);i2c_cmd_link_delete(cmd);return ret;
}/**@brief BH1750初始化函数@param 无@return 无
*/
void BH1750_Init(void)
{uint8_t data;data = BH1750_PWR_ON;              // 发送启动命令I2C_WriteData(BH1750_SLAVE_ADDR, NULL, &data, 1);data = BH1750_CON_H;               // 设置连续高分辨率模式,1lx,120msI2C_WriteData(BH1750_SLAVE_ADDR, NULL, &data, 1);
}/**@brief BH1750获取光强度@param 无@return 光强度
*/
float BH1750_ReadLightIntensity(void)
{float lux = 0.0;uint8_t sensorData[2] = {0};I2C_ReadData(BH1750_SLAVE_ADDR, NULL, sensorData, 2);lux = (sensorData[0] << 8 | sensorData[1]) / 1.2;return lux;
}static void i2c_test_task(void *arg)
{int cnt = 0;float lux;BH1750_Init();vTaskDelay(180 / portTICK_RATE_MS); // 设置完成后要有一段延迟while (1) {ESP_LOGI(TAG, "test cnt: %d", cnt++);lux = BH1750_ReadLightIntensity();xSemaphoreTake(print_mux, portMAX_DELAY);printf("sensor val: %.02f [Lux]\n", lux);xSemaphoreGive(print_mux);vTaskDelay(1000 / portTICK_RATE_MS);}vSemaphoreDelete(print_mux);vTaskDelete(NULL);
}void app_main(void)
{print_mux = xSemaphoreCreateMutex();ESP_ERROR_CHECK(I2C_Init());xTaskCreate(i2c_test_task, "i2c_test_task_0", 1024 * 2, NULL, 10, NULL);
}

查看打印:


• 由 Leung 写于 2021 年 5 月 14 日

• 参考:BH1750FVI光强度传感器及其STM32驱动程序
    BH1750 STM32 驱动程序

ESP32学习笔记(18)——光强度GY-30(BH1750)使用相关推荐

  1. ESP32学习笔记(30)——BLE GATT服务端自定义服务和特征

    一.简介 1.1 低功耗蓝牙(BLE)协议栈 链路层(LL) 控制设备的射频状态,有五个设备状态:待机.广播.扫描.初始化和连接. 广播 为广播数据包,而 扫描 则是监听广播. GAP通信中角色,中心 ...

  2. ESP32学习笔记(49)——RFID RC522使用

    一.简介 MF RC522 是应用于 13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员.是 NXP 公司针对"三表"应用推出的一款低电压.低成本.体积小的非接触式读写 ...

  3. ESP32学习笔记(20)——SPI(从机)接口使用

    一.SPI简介 SPI(Serial Peripheral Interface) 协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种高速全双工的通信总线.它被广泛地使用在 ADC.LCD ...

  4. ESP32学习笔记(一) 芯片型号介绍

    ESP32学习笔记(一) 芯片型号介绍 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介 ...

  5. ESP32学习笔记(19)——SPI(主机)接口使用

    一.SPI简介 SPI(Serial Peripheral Interface) 协议是由摩托罗拉公司提出的通讯协议,即串行外围设备接口,是一种高速全双工的通信总线.它被广泛地使用在 ADC.LCD ...

  6. ESP32学习笔记( VSCode + ESP-IDF环境) 3 ——GPIO相关的简单外设驱动

    1.如何在VSCode和ESP-IDF的环境下创建工程 说实话,这是我用ESP-IDF在VSCode环境下最不喜欢的事情,在一顿CSDN和百度之后,很多大佬博主都推荐使用VSCode,通过官方示例来进 ...

  7. Hadoop学习笔记—18.Sqoop框架学习

    Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...

  8. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...

  9. 华为HCIA-datacom 学习笔记18——SDN与NFV概述

    华为HCIA-datacom 学习笔记18--SDN与NFV概述 SDN与NFV概述 1.计算机时代的演进 1.1大型机 专门的硬件 专门的操作系统 专门的应用.(稳定性能好,但封闭) 1.2小型机 ...

  10. 关于esp32蓝牙模块的使用——esp32学习笔记

    关于esp32蓝牙模块的使用--esp32学习笔记 关于esp32蓝牙模块的使用--esp32学习笔记 关于esp32蓝牙模块的使用--esp32学习笔记 零.前言 一.经典蓝牙BT 二.低功耗蓝牙B ...

最新文章

  1. VDI序曲二十一 APP-V 4.6 SP1服务器端部署
  2. HPE品牌存储为啥高调? 因为“王炸”多啊!
  3. Silverlight 和WPF的Composite Guidance(Prism V2)发布了
  4. 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?
  5. 架构师养成之道-03-jvm内存分布详解
  6. iOS SEL类型和创建
  7. js和css实现手机横竖屏预览思路整理
  8. angular 权限 php,PHP,Angular,HTACCESS-仅允许来自源域的请求
  9. ios加载本地html懒加载图片方案,IOS开发中加载大量网络图片优化方法
  10. System Center 2012 R2实例3—SCOM之SharePoint全方位监视11—服务监视
  11. 引物设计软件_你的引物设计进行得如何了?这份PCR引物设计及软件使用技巧供你参考...
  12. struts2——快速入门
  13. 进入“后红海”时代,大数据体系到底是什么?
  14. 这 10 个 Python 可视化工具,你用过哪些?
  15. 半导体二极管的伏安特性和电流方程
  16. 迅雷 java_Java实现迅雷地址转成普通地址
  17. 【Python】多文件夹图片重命名
  18. java 混淆 ant_Ant编译android,并Proguard代码混淆,v4混淆配置
  19. declare命令,export命令
  20. 51单片机实现8只LED左右来回点亮

热门文章

  1. 服务器管理系统推荐,十大Windows服务器工具 系统管理员必备
  2. php微信支付的分账,微信支付分账,就是这么简单!
  3. git入门-----初始化命令(init、clone),Basic Snapshotting(add、status、commit、diff、reset、stash)
  4. JSP环境的搭建及程序初步
  5. hdoj 超级赛亚ACMer (贪心)
  6. 【DirectX学习笔记】02_D3D初始化
  7. html边框倾斜,弯曲的边框CSS实现
  8. Matlab求一阶导数
  9. 决策树案例学习(Python实现)
  10. 您的APP上架,遇到【安全评估报告】这道门槛了吗?