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

至此,验证通过。


审核编辑 黄宇

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

    关注

    2550

    文章

    51039

    浏览量

    753094
收藏 人收藏

    评论

    相关推荐

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

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

    外设移植 安信可Ai-WB2+FPM383C指纹

    -M61-32S https://bbs.ai-thinker.com/forum.php?mod=viewthreadfromuid=15918 这里主要说一下移植 FPM383C 指纹到 Ai-WB2 模块时遇到
    的头像 发表于 10-29 14:54 151次阅读
    <b class='flag-5'>外设</b><b class='flag-5'>移植</b> 安信可<b class='flag-5'>Ai-WB2</b>+FPM383C指纹

    光照传感器和光敏电阻区别在哪

    光照传感器和光敏电阻是两种不同的光电元件,它们在光电领域中有着广泛的应用。虽然它们都对光有响应,但它们在工作原理、结构、性能、应用等方面存在显著差异。 一、工作原理 光照传感器和光敏电
    的头像 发表于 10-12 14:34 535次阅读

    光照传感器和光敏传感器一样吗

    光照传感器和光敏传感器并不完全一样 ,它们在工作原理、应用场景以及优缺点上都有所不同。 一、工作原理 光照传感器
    的头像 发表于 10-12 14:22 784次阅读

    外设移植 安信可Ai-WB2-32S开发板+TM1637 NTP时钟

    使用的是AI-WB2-32S开发板,自己画了一个板子整合TM1637和舵机、BLE(舵机、BLE的将会在另外2篇帖子介绍),对应的接线方式如下: 移植过程: 根据参考帖子以及TM1637的规格书进行更改,时序
    的头像 发表于 09-24 14:29 287次阅读
    <b class='flag-5'>外设</b><b class='flag-5'>移植</b> 安信可<b class='flag-5'>Ai-WB2</b>-32S开发板+TM1637 NTP时钟

    CW32模块使用:光敏电阻光照传感器

    光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻,其工作原理是基于内光电效应。随着光照强度的升高,电阻值迅速降低,由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源
    的头像 发表于 09-18 11:54 1258次阅读
    CW32模块使用:光敏电阻<b class='flag-5'>光照</b><b class='flag-5'>传感器</b>

    16位数字输出型环境光强度传感器集成电路bh1750FVI中文数据手册

    电子发烧友网站提供《16位数字输出型环境光强度传感器集成电路bh1750FVI中文数据手册.pdf》资料免费下载
    发表于 09-11 14:26 4次下载

    光照传感器:工作原理与多领域应用

    来源:传感器专家网 在科技日新月异的今天,传感器作为信息时代的“触角”,正以前所未有的速度渗透到我们生活的方方面面。其中,光照传感器作为一种关键的环境感知元件,以其独特的工作原理和广泛
    的头像 发表于 08-28 09:54 480次阅读

    光敏电阻随光照强度的变化规律

    光敏电阻是一种半导体材料,其电阻值会随着光照强度的变化而变化。这种特性使得光敏电阻在许多领域得到广泛应用,如光控开关、光度计、自动控制等。 一、光敏电阻的工作原理 光敏电阻的工作原理基于半导体材料
    的头像 发表于 08-27 10:31 2031次阅读

    光敏电阻与光照强度的关系是什么

    光敏电阻是一种特殊的电阻元件,其电阻值会随着光照强度的变化而变化。 一、光敏电阻的工作原理 光敏电阻是一种半导体材料制成的电阻元件,其电阻值会随着光照强度的变化而变化。光敏电阻的工作原理主要
    的头像 发表于 08-27 10:29 1280次阅读

    智能家居、智慧工厂,AI传感器无处不在!国内外厂商积极布局

    AI传感器是一种能够感知和测量环境物理量的设备,如温度、湿度、光照强度、压力等,并将这些物理量转化为数字信号,通过通信接口将数据传输给计算机或其他设备。与传统的传感器相比,
    的头像 发表于 04-22 08:00 2994次阅读

    硅光电池测量光照强度

    我了解到的原理是,硅光电池的电池内阻远大于R1,且在一定光强范围内,输出电流(uA级别)随光照强度的增加而线性增加,所以我想通过2DU3硅光电池通过以下电路,将硅光电池输出电流通过R1转化为电压,并
    发表于 04-02 15:20

    外设移植】I2C 光照传感器BH1750)M61开发板驱动

    本作品由安信可社区用户 制作 IC光度传感器模块种类很多,我选择一种比较常用的模块(BH1750)做外设移植BH1750的优点如下: 1、
    的头像 发表于 03-21 11:24 970次阅读
    【<b class='flag-5'>外设</b><b class='flag-5'>移植</b>】I<b class='flag-5'>2</b>C <b class='flag-5'>光照</b>度<b class='flag-5'>传感器</b>(<b class='flag-5'>BH1750</b>)M61开发板驱动

    I2C光照传感器BH1750)M61开发板驱动步骤

    IC光度传感器模块种类很多,我选择一种比较常用的模块(BH1750)做外设移植
    的头像 发表于 03-17 16:00 2465次阅读
    I<b class='flag-5'>2</b>C<b class='flag-5'>光照</b>度<b class='flag-5'>传感器</b>(<b class='flag-5'>BH1750</b>)M61开发板驱动步骤

    【飞腾派4G版免费试用】飞腾派+4G+EMQX+eKuiper +Zigbee 传感器搭建物联网边缘计算网关

    本文只介绍一个小的单元测试,系统集成后面再增加。飞腾开发板I2C接口连接了BH1750光照传感器,模块测试的具体内容为读取传感器数据,并以
    发表于 12-29 18:25