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

    文章

    50937

    浏览量

    752752
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    硅光电池测量光照强度

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

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

    本作品由安信可社区用户 制作 IC光度传感器模块种类很多,我选择一种比较常用的模块(BH1750)做外设移植BH1750的优点如下: 1、
    的头像 发表于 03-21 11:24 936次阅读
    【<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 2440次阅读
    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

    【飞腾派4G版免费试用】硬件编程、运行、代码编译之I2C光照传感器调试

    0.概述 本文主要介绍以I2C 接口的光照传感器BH1750为例子,介绍硬件编程、运行、C代码编译和运行。 1.光照
    发表于 12-17 18:00

    什么是无线物联网传感器,为什么无线物联网传感器有用呢?

    的采集、传输、存储和分析的设备。无线物联网传感器可以通过感知环境中的各种物理量,如温度、湿度、光照强度、压力、加速度等,将这些数据通过无线通信技术传输到云平台或者应用程序中进行分析和利用。 为什么无线物联网传感器有用?答案有三个
    的头像 发表于 12-15 10:10 888次阅读