0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

外设移植 Ai-WB2+BH1750 光照强度传感器

AIoT行业洞察 来源:AIoT行业洞察 作者:AIoT行业洞察 2024-12-05 14:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

以下作品由安信可社区用户

WangChong制作

外设介绍

BH1750是一种基于光电二极管的数字光强传感器,能够测量环境中的光照强度,并将其转换为数字信号。它采用 I2C 接口进行通信,适合用于光强度检测的各种应用,如自动调节显示屏亮度、光线感应开关等。

外设规格参数

工作电压: 2.4V 至 3.6V

测量范围: 1 至 65535 lux

分辨率:

高分辨率模式(1 lx)

低分辨率模式(4 lx)

通信接口: I2C

I2C 地址: 0x23(默认),0x5C(可选) 根据 Address 是否接拉低或者拉高进行选择

测量时间:

高分辨率模式: 120ms - 180ms

低分辨率模式: 16ms - 24 ms

待机模式: 0.1 µA(典型值)

功耗:

测量模式: 0.12 mA(典型值)

移植过程

BH1750 数据手册:https://www.mouser.com/datasheet/2/348/bh1750fvi-e-186247.pdf

根据数据手册得知, BH1750 是使用的 I2C 通信,同时我们使用的是 WB2,因此我们需要根据原理图确认 WB2 的 I2C 接口 PIN。

由于使用的是 WB2-12F 的开发板,所以可以在安信可社区 WB2 专题下找到对应的原理图,同时根据博流官方 GPIO 的功能复用,可以找到哪些 PIN 支持 I2C。

https://dev.bouffalolab.com/media/doc/602/open/datasheet/zh/html/content/Pindefinition.html

wKgZO2dRSOqAWL65AAF-ZTZTzb4783.jpg

SDK 下的 application/iot-solution/demo_bh1750 下已经提供了一个完整的实现。我们来尝试将 I2C 配置中的 PIN3(SDA)改成 PIN17 (SDA)。同时将 WB2-12F devkit 的 12 号 PIN 和 17 号 PIN 分别接到 BH1750 的 SCL 和 SDA 上进行烧录测试。

wKgZPGdRSOuARWNGAAA69lPR2_o232.jpg

wKgZO2dRSOuARkuWAAOMYyhTQak293.jpg

烧录验证

wKgZPGdRSOyAZmADAADeLIlPSJQ900.jpg

此时可以通过串口助手已经可以正确的查看到 WB2-12F 正确的读取了 BH1750 的光照强度。

代码解读

#include
#include
#include
#include
#include
#include
// BH1750 的默认 I2C 地址
#define BH1750_DEFAULT_ADDR BH1750_ADDR_L
#define BH1750_ADDR_H 0x5c // BH1750 高地址
#define BH1750_ADDR_L 0x23 // BH1750 低地址
// BH1750 的各种操作命令
#define BH1750_POWER_DOWN 0x00 // 断电命令
#define BH1750_POWER_ON 0x01 // 开机命令
#define BH1750_RESET 0x07 // 重置命令
#define BH1750_CONTINUOUS_H_MODE 0x10 // 高分辨率模式,持续测量
#define BH1750_CONTINUOUS_H_MODE2 0x11 // 高分辨率模式2,持续测量
#define BH1750_CONTINUOUS_L_MODE 0x13 // 低分辨率模式,持续测量
#define BH1750_ONETIME_H_MODE 0x20 // 高分辨率模式,一次性测量
#define BH1750_ONETIME_H_MODE2 0x21 // 高分辨率模式2,一次性测量
#define BH1750_ONETIME_L_MODE 0x23 // 低分辨率模式,一次性测量
int main(void)
{
// 定义并初始化 I2C 设备 i2c0
static hosal_i2c_dev_t i2c0 = {
.config = {
.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT, // 7位地址模式
.freq = 100000, // I2C 通信频率为 100kHz
.mode = HOSAL_I2C_MODE_MASTER, // I2C 主机模式
.scl = 12, // 时钟引脚 GPIO 12
.sda = 17, // 数据引脚 GPIO 17
},
.port = 0, // I2C 端口
};
// 初始化 I2C 接口
hosal_i2c_init(&i2c0);
for (;;) {
uint8_t buffer[2]; // 用于接收光照强度数据的缓冲区
uint8_t cmd = BH1750_ONETIME_H_MODE; // 设置 BH1750 的测量模式为高分辨率一次性测量
hosal_i2c_master_send(&i2c0, BH1750_DEFAULT_ADDR, &cmd, 1, HOSAL_WAIT_FOREVER); // 发送测量命令到 BH1750

// 接收来自 BH1750 的测量结果(2字节)
int ret = hosal_i2c_master_recv(&i2c0, BH1750_DEFAULT_ADDR, buffer, 2, 100);

if (ret) {
// 如果接收超时,重新发送上电命令并记录错误日志
cmd = BH1750_POWER_ON;
hosal_i2c_master_send(&i2c0, BH1750_DEFAULT_ADDR, &cmd, 1, 100);
blog_error("i2c timeoutrn");
} else {
// 将接收到的两个字节数据合并为一个16位整数
uint16_t result = buffer[0];
result <<= 8; // 左移8位,放置高8位
result |= buffer[1]; // 组合低8位
// 将测量值转换为光照强度(lux)
float luxlevel = result;
result /= 1.2f;
// 输出光照强度日志
blog_info("lux level: %.02frn", luxlevel);
}
// 任务延时 1000 毫秒,即每隔 1 秒执行一次测量
vTaskDelay(portTICK_RATE_MS * 1000);
}
return 0;
}

库函数

让我们简单的对上面的库函数进行一下整理

bh1750.c

#include "bh1750.h"
#include
#include
#include
static hosal_i2c_dev_t i2c0 = {
.config = {
.address_width = HOSAL_I2C_ADDRESS_WIDTH_7BIT,
.freq = 100000,
.mode = HOSAL_I2C_MODE_MASTER,
.scl = 12,
.sda = 17,
},
.port = 0,
};
void bh1750_init()
{
blog_info("Initializing I2C...n");
hosal_i2c_init(&i2c0);
}
void read_bh1750(void *args)
{
for (;;)
{
uint8_t buffer[2];
uint8_t cmd = BH1750_ONETIME_H_MODE;
int ret;
blog_info("Sending command to BH1750...n");
ret = hosal_i2c_master_send(&i2c0, BH1750_DEFAULT_ADDR, &cmd, 1, HOSAL_WAIT_FOREVER);
if (ret != 0)
{
blog_error("I2C send failed with error: %dn", ret);
continue;
}
blog_info("Receiving data from BH1750...n");
ret = hosal_i2c_master_recv(&i2c0, BH1750_DEFAULT_ADDR, buffer, 2, 100);
if (ret != 0)
{
cmd = BH1750_POWER_ON;
hosal_i2c_master_send(&i2c0, BH1750_DEFAULT_ADDR, &cmd, 1, 100);
blog_error("I2C receive failed with error: %dn", ret);
}
else
{
uint16_t result = (buffer[0] << 8) | buffer[1];
float luxlevel = result / 1.2f;
blog_info("Lux level: %.02fn", luxlevel);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // 使用宏将毫秒转换为FreeRTOS时间单位
}
}

bh1750.h

#ifndef BH1750_H
#define BH1750_H
#include
// BH1750 的默认 I2C 地址
#define BH1750_DEFAULT_ADDR BH1750_ADDR_L
#define BH1750_ADDR_H 0x5c // BH1750 高地址
#define BH1750_ADDR_L 0x23 // BH1750 低地址
// BH1750 的各种操作命令
#define BH1750_POWER_DOWN 0x00 // 断电命令
#define BH1750_POWER_ON 0x01 // 开机命令
#define BH1750_RESET 0x07 // 重置命令
#define BH1750_CONTINUOUS_H_MODE 0x10 // 高分辨率模式,持续测量
#define BH1750_CONTINUOUS_H_MODE2 0x11 // 高分辨率模式2,持续测量
#define BH1750_CONTINUOUS_L_MODE 0x13 // 低分辨率模式,持续测量
#define BH1750_ONETIME_H_MODE 0x20 // 高分辨率模式,一次性测量
#define BH1750_ONETIME_H_MODE2 0x21 // 高分辨率模式2,一次性测量
#define BH1750_ONETIME_L_MODE 0x23 // 低分辨率模式,一次性测量
// 函数声明
void bh1750_init();
void read_bh1750(void *args);
#endif // BH1750_H
main.c
#include
#include
#include
#include
#include
#include
#include "bh1750.h"
int main(void)
{
bh1750_init();
xTaskCreate(read_bh1750, "BH1750 Task", 4096, NULL, 10, NULL);
return 0;
}

注意事项

切记,不要在主函数中开启任务的调度器,主函数在其他地方使用 extern 引用了,相当于一个中转的中间方法,可以用于初始化 task。

附上后续的验证过程:

验证过程

1. 编译代码

上述帖子中已经贴出来了完整的工程代码。直接将其拷贝到 sdk 目录,为了与 sdk 中的代码冲突,将验证工程目录改名为 demo_bh17501。

进入到目录中进行编译:

wKgZO2dRSOyAabDlAABNAA_Dqss280.jpg

很快就可以看到编译成功。

wKgZPGdRSOyAHHaiAAExS5bd2VM780.jpg

2. 代码烧录

wKgZO2dRSO2AbiPWAADehpAZljQ924.jpg

烧录完成:

wKgZPGdRSO2ABHzPAAGYocshE7c784.jpg

3. 测试验证

wKgZO2dRSO2AEKJOAAEVjuHyh1U133.jpg

打开串口工具:

可以看到传感器的数据有输出了。实际测试用不同强度的光线照射得到的 lux 是和预期相符的。

wKgZO2dRSO6AC3tHAAF7yuSYC5k476.jpg

至此,验证通过。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2574

    文章

    54382

    浏览量

    786122
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    [RA4M2-SENSOR]使用OLED显示光照传感器信号数据

    基于 FreeRTOS 构建,能够与其他实 时操作系统(RTOS)和中间件兼容,并且可以通过丰富的外设接口(如 I2C、SPI、ADC 等)与各种传感器模块(如温湿度、气体、光传感器
    发表于 09-13 20:30

    超强感光,即时检测!高精度光照传感器赋能纳祥科技迷你照度计方案

    覆盖,采样率达2次/秒,无需复杂调试即可瞬时检测,很好地平衡性能与能耗。方案概述本方案通过高精度光电传感器捕捉环境光照强度,经单片机实时校准处理,驱动LED屏直观
    的头像 发表于 09-02 15:41 396次阅读
    超强感光,即时检测!高精度<b class='flag-5'>光照</b><b class='flag-5'>传感器</b>赋能纳祥科技迷你照度计方案

    【RA-Eco-RA6M4开发板评测】用I2C实现光照强度的检测和显示

    这个项目我们利用瑞萨的RA6M4的I2C控制功能实现光照传感器BH1750光照测试,并进行屏幕显示。 为了方便进行
    发表于 08-26 22:05

    数字16位串行输出型环境光传感器IC BH1750FVI数据手册

    BH1750FVI数据手册
    发表于 08-09 16:04 0次下载

    【沁恒CH585开发板免费试用体验】+光照传感器及其检测

    光照传感器在对环境的光线情况的检测中起着重要的作用,这里所采用的是数字式光照传感器BH1750,它具有集成度高和检测精度高的特点。 该
    发表于 07-06 00:08

    **【技术干货】Nordic nRF54系列芯片:传感器数据采集与AI机器学习的完美结合**

    和更多外设接口。无论是运行还是休眠状态,功耗表现都非常出色! 3. 在传感器数据采集与AI机器学习中的优势? 答:主频高、功耗低,内置专用核处理数据采集,还配备AI加速
    发表于 04-01 00:00

    DLP NIRScan Nano光照强度如何计算?

    我获取到了Nano的扫描数据,在对数据进行解析的时候遇到了一个问题,我搞不明白光照强度是如何得出来的,我在例程库里边找到了代码,我没看懂,还有就是按照代码计算出来的光强是不正确的,请教各位工程师给予指点。
    发表于 02-28 07:30

    壁挂光照传感器技术规格与安装指南

    在智能家居和智能环境监测系统中,壁挂光照传感器扮演着重要的角色。它能够实时监测环境中的光照强度,为智能照明系统、环境研究等提供关键数据支持。本文将详细介绍壁挂光照
    的头像 发表于 02-19 14:08 863次阅读
    壁挂<b class='flag-5'>光照</b><b class='flag-5'>传感器</b>技术规格与安装指南

    光照传感器的工作原理与应用场景

    在科技日新月异的今天,传感器作为信息时代的“触角”,正以前所未有的速度渗透到我们生活的方方面面。其中,光照传感器作为一种关键的环境感知元件,以其独特的工作原理和广泛的应用场景,成为推动智能化、节能化
    的头像 发表于 02-06 09:47 1547次阅读

    基于物联网技术设计的陈列馆监控系统

    该项目构建一个功能全面、实时监控的陈列馆智能监控系统。通过引入高精度的温湿度传感器(SHT30)、光照强度检测模(BH1750)、烟雾和火焰传感器(MQ
    的头像 发表于 01-15 09:29 1975次阅读
    基于物联网技术设计的陈列馆监控系统

    光敏电阻与其他传感器的联合应用

    光敏电阻作为一种能够根据光照强度变化而改变电阻值的传感器,在与其他传感器联合应用时,能够拓展出更多元化的应用场景和功能。以下是对光敏电阻与其他传感器联合应用的介绍: 一、光敏电阻与温度
    的头像 发表于 01-13 09:39 1483次阅读

    光敏电阻与光电传感器的区别

    在现代电子技术中,光传感器是一类非常重要的传感器,它们能够将光信号转换为电信号,从而实现对光强度的检测和控制。光敏电阻和光电传感器是两种常见的光传感
    的头像 发表于 01-13 09:11 1962次阅读

    【CW32模块使用】BH1750光照强度传感器

    采用ROHM原装BH1750FVI芯片供电电源:3-5V,光照度范围:0-65535lx传感器内置16bitAD转换,直接数字输出,省略复杂的计算,省略标定,不区分环境光源接近于视觉
    的头像 发表于 12-30 11:17 1387次阅读
    【CW32模块使用】<b class='flag-5'>BH1750</b><b class='flag-5'>光照强度</b><b class='flag-5'>传感器</b>

    光电传感器应用领域 光电传感器工作原理解析

    生产线上,光电传感器用于检测物体的位置、速度、颜色等,实现精准控制。 医疗设备 :在医疗领域,光电传感器用于心率监测、血压测量、血液分析等。 环境监测 :用于监测空气质量、水质、光照强度等环境参数。 交通管理 :用于车辆流量统
    的头像 发表于 12-17 16:46 3718次阅读

    【RA-Eco-RA4E2-64PIN-V1.0开发板试用】04、I2C驱动BH1750光照传感器并在串口打印输出

    0 前言 本次实验将使用板子上的I2C功能。瑞萨R7FA4E2B93CFM支持I3C和I2C,手头没有I3C的设备,但正好有一个I2C协议的光照
    发表于 12-16 16:17