BearPi-IoT Std学习笔记9——使用I2C读取BH1750光强度传感器数据

2023-11-06

1.BH1750模块(E53_SC1扩展板)

BH1750FV1是两线式串行总线接口(IIC)的16位数字输出型环境光强度传感器,利用它的高分辨率可以探测较大范围内的光照强度变化(1lx - 65535lx)。

BH1750的原理图如下:

2.配置

首先创在STM32CubeMX中选择芯片型号STM32L431RCT6

a.配值时钟源:

b.配置串口:
 

小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

 将开发板上的开关拨到AT-MCU模式,使PC的串口与USART1之间连接:

c.配置I2C接口


查看小熊派E53接口的原理图:

接下来开始配置I2C接口1:

 d.配置时钟树

 STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

 最后,创建文件名,生成工程

3.重定向printf( )函数

参考重定向printf函数到串口输出:http://t.csdn.cn/cJQBQ

4.程序代码修改及添加

a.修改I2C初始化代码的小BUG

再I2C.c文件中,

b.宏定义BH1750器件地址

BH1750的器件地址由ADDR端口的高低电平决定:

结合原理图,在 bh1750_i2c_drv.c头文件中可以定义如下:

#define    BH1750_ADDR_WRITE   0x46    //01000110
#define    BH1750_ADDR_READ    0x47    //01000111

在 bh1750_i2c_drv.h头文件中,要将上面的代码写进去

c.枚举BH1750工作模式

参考数据手册在 bh1750_i2c_drv.c 头文件中进行如下枚举定义:

typedef enum
{
    POWER_OFF_CMD   =   0x00,   //断电:无激活状态
    POWER_ON_CMD    =   0x01,   //通电:等待测量指令
    RESET_REGISTER  =   0x07,   //重置数字寄存器(在断电状态下不起作用)
    CONT_H_MODE     =   0x10,   //连续H分辨率模式:在11x分辨率下开始测量,测量时间120ms
    CONT_H_MODE2    =   0x11,   //连续H分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms
    CONT_L_MODE     =   0x13,   //连续L分辨率模式:在411分辨率下开始测量,测量时间16ms
    ONCE_H_MODE     =   0x20,   //一次高分辨率模式:在11x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
    ONCE_H_MODE2    =   0x21,   //一次高分辨率模式2:在0.51x分辨率下开始测量,测量时间120ms,测量后自动设置为断电模式
    ONCE_L_MODE     =   0x23    //一次低分辨率模式:在411x分辨率下开始测量,测量时间16ms,测量后自动设置为断电模式
} BH1750_MODE;

在 bh1750_i2c_drv.h头文件中,要将上面的代码写进去

d.发送命令和读取数据

接下来编写bh1750_i2c_drv.c驱动文件,参考数据手册中的这部分:

本驱动程序底层使用 HAL 库的 IIC 初始化文件,所以包含如下头文件:

#include "bh1750_i2c_drv.h"
#include "i2c.h"

 根据上图,发送命令的函数如下:

/**
 * @brief    向BH1750发送一条指令
 * @param    cmd —— BH1750工作模式指令(在BH1750_MODE中枚举定义)
 * @retval    成功返回HAL_OK
*/
uint8_t    BH1750_Send_Cmd(BH1750_MODE cmd)
{
    return HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR_WRITE, (uint8_t*)&cmd, 1, 0xFFFF);
}

在bh1750_i2c_drv.h头文件中,要将上面的函数名写进去,进行声明

接收光照强度数据的函数如下:

/**
 * @brief    从BH1750接收一次光强数据
 * @param    dat —— 存储光照强度的地址(两个字节数组)
 * @retval    成功 —— 返回HAL_OK
*/
uint8_t BH1750_Read_Dat(uint8_t* dat)
{
    return HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR_READ, dat, 2, 0xFFFF);
}

在bh1750_i2c_drv.h头文件中,要将上面的函数名写进去,进行声明

e.数据转换函数

根据数据手册中给出的公式,编写将从BH1750读出的两个字节数据转换为对应强度值的函数:

/**
 * @brief    将BH1750的两个字节数据转换为光照强度值(0-65535)
 * @param    dat  —— 存储光照强度的地址(两个字节数组)
 * @retval    成功 —— 返回光照强度值
*/
uint16_t BH1750_Dat_To_Lux(uint8_t* dat)
{
    uint16_t lux = 0;
    lux = dat[0];
    lux <<= 8;
    lux += dat[1];
    lux = (int)(lux / 1.2);

    return lux;
}

在bh1750_i2c_drv.h头文件中,要将上面的函数名写进去,进行声明

f.main函数中驱动BH1750

int main(void)
{
    uint8_t dat[2] = {0};        //dat[0]是高字节,dat[1]是低字节

    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_USART1_UART_Init();

    while (1)
    {
        if(HAL_OK == BH1750_Send_Cmd(ONCE_H_MODE))
        {
            //printf("send ok\n");
        }
        else
        {
            //printf("send fail\n");
        }

        HAL_Delay(200);
        if(HAL_OK == BH1750_Read_Dat(dat))
        {
            //printf("recv ok\n");
            printf("current: %5d lux\n", BH1750_Dat_To_Lux(dat));

        }
        else
        {
            //printf("recv fail");
        }

        HAL_Delay(1000);
    }
}

最后打开串口助手,我们可以很清楚地看到关照强度的数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BearPi-IoT Std学习笔记9——使用I2C读取BH1750光强度传感器数据 的相关文章

  • 时钟抖动(Jitter)的基本概念 【转载】

    时钟抖动 Jitter 的基本概念 李倩 发表于 2018 03 13 10 21 08 电子说 随着通信系统中的时钟速率迈入GHz级 抖动这个在模拟设计中十分关键的因素 也开始在数字设计领域中日益得到人们的重视 在高速系统中 时钟或振荡器
  • AntDB-M数据库锁分析,不要错过!

    AntDB数据库始于2008年 在运营商的核心系统上 为全国24个省份的10亿多用户提供在线服务 具备高性能 弹性扩展 高可靠等产品特性 峰值每秒可处理百万笔通信核心交易 保障系统持续稳定运行近十年 并在通信 金融 交通 能源 物联网等行业
  • 华为7c手机怎么恢复出厂设置_华为荣耀畅玩7A/7C进recovery双清格机恢复出厂设置方法...

    华为荣耀畅玩7A 7C进recovery双清格机恢复出厂设置方法 双清操作虽然不是很复杂 但是有一部分华为荣耀畅玩7A 7C机友还是不太了解的 为了让华为荣耀畅玩7A 7C新手了解一下详细的操作方法 方便以后手机的日常使用 下面华为刷机网就

随机推荐

  • order by 用多个条件进行排序

    select from time order by location date 解读一下 只有在location 值相同的时候 才对第二个字段的数据进行排序 默认为asc 之后我又考虑 如果我们第一个字段希望是降序呢 测试一下 select
  • Kali - 靶系统 metasploitable2 初始化修改数据库

    原本都到了0202年了 该用3 或者更高的靶系统了 但是由于网络不通 所以找了2来凑合 常规的操作 下载系统 安装虚拟机软件 导入到虚拟机里面 修改虚拟机数据库配置文件 vi etc www mutillidae config inc 将
  • dubbo服务降级和服务容错

    什么是服务降级 当服务器压力剧增的情况下 根据实际业务情况及流量 对一些服务和页面有策略的不处理或换种简单的方式处理 从而释放服务器资源以保证核心交易正常运作或高效运作 可以通过服务降级功能临时屏蔽某个出错的非关键服务 并定义降级后的返回策
  • 把c++的函数导出为dll文件

    目录 什么是dll文件 把c 函数变为dll有什么好处 开始教程 打开Visual Studio 2022创建 调整编译器设置 创建头文件 DLL1 h 创建源文件编辑函数内容 DLL1 cpp 编译成dll文件 什么是dll文件 DLL
  • 模型训练损失,正确率绘制曲线图

    import matplotlib pyplot as plt from matplotlib pyplot import MultipleLocator 创建第一张画布 plt figure 0 绘制训练损失曲线 plt plot all
  • 快速了解链码是什么?

    链码是什么 链码也就是所谓的智能合约 智能合约是由事件驱动的 具有状态的存储和运行在区块链上的程序 它通过预置了一些条件和规则 在一定的事件下触发智能合约的执行 智能合约最终的目标是在区块上生成账本数据 也就是说所有对账本的操作都是由智能合
  • 【华为OD】

    目录 一 题目描述 二 输入描述 三 输出描述 四 题目解析 五 Java玩法 六 JavaScript玩法 一 题目描述 现在有 n 个容器服务 服务的启动可能有一定的依赖性 有些服务启动没有依赖 其 次服务自身启动加载会消耗一些时间 给
  • 编写shell脚本,判断输入的IP是否正确

    编写shell脚本 判断输入的IP是否正确 IP的规则是 n1 n2 n3 n4 其中1 bin bash checkip if echo 1 egrep q 0 9 1 3 0 9 1 3 0 9 1 3 0 9 1 3 then a e
  • 编程高手是如何炼成的?1024页Python学习教程

    有人说Python入门一个月足矣 但也仅仅是入门 要想精通甚至成为编程高手 一个月显然不够 网络上五花八门的Python教程让编程学习者挑花了眼 但大多都是强调入门和基础 无法满足更进一步的需求 要想加深自身竞争力和增加技能傍身 更高层次的
  • Python实验——tkinter 电子时钟

    实验说明 编写程序 实现如下图所示的电子时钟 要求 1 不显示标题栏 总是顶端显示 不被其他窗口覆盖 2 实时显示日期和时间 3 可以用鼠标左键按住拖动 在电子时钟上右击可以结束程序 4 拖动时透明度变大 鼠标左键抬起时恢复半透明状态 时钟
  • Linux设备驱动程序中常用的ioctl方法和read/write方法的异同点

    ioctl是iocontrol的缩写 就是IO控制 行为上 简单来说 如果你在写驱动程序时zhi候 碰到一些IO操作 在逻辑上不能归类到read 不能归类到write 那就可以认为是ioctl的部分 read和write应该是写入和读出数据
  • 05_1_Qt工程实践_Qt开发串口通讯软件中的数据转换问题:读取时QByteArray转str;发送时格式;int转16进制格式str;string中截取字符;16进制数加法;str转BytAr

    在利用Qt进行串口程序开发过程中 除了与串口通讯的功能实现以外 数据的转换也是比较麻烦的一件事 本篇主要介绍串口通讯中数据转换的问题 关于功能实现大家在网上搜索就能找到相关案例 在完成串口的初始化等功能之后 实现数据的读取转换 参考博文 Q
  • LightGBM学习笔记

    LightGBM简介 LightGBM是GBDT算法地实现框架之一 设计的初衷是并行 高效 特点是训练速度快 内存消耗小 可并行运算 支持类别变量 LightGBM优化点 直方图算法 不同于XGBoost的预排序 LightGBM将区间离散
  • 长时间使用 Python 会降低程序员的编程能力吗?

    在编程领域 Python 是一种流行的语言 它易于学习和使用 也有很多功能强大的库和框架 但是 有些人认为长时间使用 Python 会降低程序员的编程能力 首先 编程能力不是与语言相关的 编程能力是指能够设计和实现高质量的软件解决方案的能力
  • Activiti源码分析

    Activiti是业界很流行的java工作流引擎 关于Activiti与JBPM5的关系和如何选择不是本文要讨论的话题 相关内容可以baidu一下 Activiti从架构角度看是比较优秀的 是很面向对象的 是我所阅读过的代码结构很棒的开源软
  • Element ui table获取当前索引值 index

    使用 scope index来获取当前索引值
  • CSS/HTML静态购物网站项目源码解析(品优购)——该项目包含主页、注册页、列表页三个网页

    注 该项目所涉及的素材文件请QQ联系作者 Etui 3416252112 首先 上图 index html 主页 register html 注册页 list html 列表页 摘要 作为一个前端初学者 这是我学完html和css基础后做的
  • [Rpackage]R无法安装包的终极解决方法,附详细步骤

    作为R的新使用者 我曾经也经常碰上某些R包死活无法安装的问题 例如机器学习调参的caret包等 网上很多方法也都没法解决 除却少数个别包之外 大部分的包都支持最新的R版本 一 下载最新的R包 https cran r project org
  • Hooks API 在 Vue 中的实现分析

    作者 长峰 初次听到 React Hooks 是在其刚发布的那几天 网上铺天盖地的文章介绍它 看字面意思是 React 钩子 就想当然地理解应该是修改 React 组件的钩子吧 React 延伸的概念非常多 高阶组件 函数式 Render
  • BearPi-IoT Std学习笔记9——使用I2C读取BH1750光强度传感器数据

    1 BH1750模块 E53 SC1扩展板 BH1750FV1是两线式串行总线接口 IIC 的16位数字输出型环境光强度传感器 利用它的高分辨率可以探测较大范围内的光照强度变化 1lx 65535lx BH1750的原理图如下 2 配置 首