BH1750简介

BH1750是一种用于两线制串行总线接口的16位数字型光强度传感器集成电路。利用它的高分辨率可以探测较大范围的光强度变化。(1lx~65535lx)。

创建工程、验证

在RT-Thread中读取BH1750数据有两种方法:一种方法是借助bh1750软件包;另一种方法是直接使用i2c驱动框架读取BH1750数据。

关于直接使用i2c驱动框架读取BH1750数据的方法可以阅读Mculover666兄的这篇:

https://blog.csdn.net/Mculover666/article/details/104675712

本次实验我们借助bh1750软件包来读取BH1750传感器数据,使用RT-Thread Studio V1.1.0来创建工程。

1、添加bh1750软件包





2、打开i2c设备驱动

目前只有软件i2c驱动。保存RT-Thread Settings文件。编译报错:

那是因为我们没有打开I2C相关的宏,drv_soft_i2c.c中模拟了几个i2c,我们要确认我们使用哪一个i2c与bh1750传感器相连。

这里可以看到bh1750的示例的初始化函数中使用了i2c2,所以相应的我们需要在board.h中打开i2c2相关的宏,需要打开、修改哪些宏可以看相关注释:

这里我们使用的是小熊派开发板,bh1750与MCU通过PB6、PB7引脚相连:

虽然PB6、PB7可以配置为硬件i2功能,但是我们这里使用的是软件i2c,所以这里的PB6、PB7是当做gpio来用的。然后我们根据注释的说明把代码改为:

然后编译报错,错误提示这几个宏有问题。反反复复检查,好像没什么问题,为啥就会疯狂报错。隐约记得有些例程例程中表示引脚好像不是这么表示的,而是类似这样的:

每个引脚都有一个新的代号,而这些引脚与代号的关系可以在drv_gpio.c中查看:

可以看到我们的PB6、PB7引脚的代号分别是22、23。然后尝试着把上面的i2c宏代码改为:

编译成功!然后试着读取传感器数据,也成功了。所以,这大概是RT-Thread Studio V1.1.0的一个小bug,模板工程的board.h里关于i2c的注释有问题,严重误导了我们。。

3、下载、验证

若执行sensor read命令无数据输出时,需要打开\components\drivers\sensors\sensor_cmd.c,在sensor_show_data函数后面自行增加环境光照强度打印代码:

case RT_SENSOR_CLASS_LIGHT:
LOG_I("num:%3d, light:%4d.%d, timestamp:%5d", num, sensor_data->data.light / 10, sensor_data->data.light % 10, sensor_data->timestamp);
break;

4、编写应用

上面能输入那些命令对bh1750进行测试的前提是官方已经给我们写好了相关应用demo,在sensor_cmd.c中,如:

(1)测试函数

(2)显示数据

除此之外还有其它几个应用相关的函数。

我们也可以模仿sensor_cmd.c里面的代码来写我们自己的应用代码:

static void bh1750_thread_entry(void *parameter)
{
rt_device_t dev = RT_NULL;
struct rt_sensor_data data;
rt_size_t res; /* 查找bh1750传感器 */
dev = rt_device_find("li_bh1750");
if (dev == RT_NULL)
{
rt_kprintf("Can't find device:li_bh1750\n");
return;
} /* 以只读模式打开bh1750 */
if (rt_device_open(dev, RT_DEVICE_FLAG_RDONLY) != RT_EOK)
{
rt_kprintf("open device failed!");
return;
} while(1)
{
/* 从传感器读取一个数据 */
res = rt_device_read(dev, 0, &data, 1);
if (1 != res)
{
rt_kprintf("read data failed!size is %d", res);
}
else
{
rt_kprintf("light:%4d.%d lux\n", data.data.light / 10, data.data.light % 10);
}
rt_thread_mdelay(1000);
}
} int bh1750_example(void)
{
rt_thread_t tid; /* 线程句柄 */ tid = rt_thread_create("bh1750_thread",
bh1750_thread_entry,
RT_NULL,
1024,
20,
10);
if(tid != RT_NULL)
{
/* 线程创建成功,启动线程 */
rt_thread_startup(tid);
} return 0;
} /* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(bh1750_example, bh1750 example);

运行结果:

使用RT-Thread提供给我的I/O设备管理接口rt_device_find、rt_device_open、rt_device_read、rt_device_close来编写应用。相关框图:



关于RT-Thread的I/O设备模型可查看往期笔记:【RT-Thread笔记】IO设备模型

以上就是本次的分享,如有错误,欢迎指出!


我的个人博客:https://www.lizhengnian.cn/

我的微信公众号:嵌入式大杂烩

我的CSDN博客:https://blog.csdn.net/zhengnianli

【RT-Thread笔记】BH1750软件包的使用的更多相关文章

  1. Thread笔记

    Thread笔记 Thread——fork:https://www.cnblogs.com/noonjuan/diary/2019/08/03/11296217.html Thread——multip ...

  2. RT Thread 通过ENV来配置SFUD,操作SPI Flash

    本实验基于正点原子stm32f4探索者板子 请移步我的RT Thread论坛帖子. https://www.rt-thread.org/qa/forum.php?mod=viewthread& ...

  3. STM32 + RT Thread OS 学习笔记[二]

    串口通讯例程 通过上面的练习,对STM32项目开发有了一个直观印象,接下来尝试对串口RS232进行操作. 1.   目标需求: 开机打开串口1,侦听上位机(使用电脑串口测试软件)发送的信息,然后原样输 ...

  4. STM32 + RT Thread OS 学习笔记[三]

    RTGUI 据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块.如果要移植到其它OS,估计难度较大.目前还处于Alpha状态,最终将会包含 ...

  5. STM32 + RT Thread OS 学习笔记[四]

    1.  补注 a)      硬件,打通通讯通道 若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到. 从上面的示意图可见,M ...

  6. 【Python学习】Thread笔记(1)

    Python学习笔记 - Thread(1) 标签(空格分隔): python from threading import Thread num = 2000 id_list = [] def do_ ...

  7. STM32 + RT Thread OS 串口通讯

    1.   创建项目 a)   禁用Finsh和console b)   默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...

  8. linux笔记:软件包管理-软件包简介

    软件包分类: 1.源码包: 2.二进制包(在centos里就是RPM包.和源码包的区别在于已经经过编译.) 源码包的优点和缺点: RPM包的优点和缺点:

  9. python的线程thread笔记

    python的线程是用thread和threading来实现的.其中利用threading会更好,因为thread没有线程保护,当主线程退出了之后,子线程也会被强行退出.threading支持守护线程 ...

随机推荐

  1. LeetCode--LinkedList--21.Merge Two Sorted Lists (Easy)

    21. Merge Two Sorted Lists (Easy) Merge two sorted linked lists and return it as a new list. The new ...

  2. STM32 TIM1高级定时器配置快速入门

    layout: post tags: [STM32] comments: true 文章目录 layout: post tags: [STM32] comments: true 重点内容 时基单元 计 ...

  3. [hdu1533]二分图最大权匹配 || 最小费用最大流

    题意:给一个n*m的地图,'m'表示人,'H'表示房子,求所有人都回到房子所走的距离之和的最小值(距离为曼哈顿距离). 思路:比较明显的二分图最大权匹配模型,将每个人向房子连一条边,边权为曼哈顿距离的 ...

  4. Date工具遇到的一个坑

    private Date contractBeginDate(){ Calendar calendar = Calendar.getInstance(); calendar.setTime(new D ...

  5. 基于Nettty打造自己的MVC服务器

    最近开始折腾Netty,体验下NIO编程.既然学习了,就要做点东西出来,要不然不容易掌握学到的东西.在Netty的官方demo上都有各种case的sample,打造Http服务器的核心代码就是从Sam ...

  6. The Apache Tomcat Connector

    http://tomcat.apache.org/connectors-doc/generic_howto/quick.html 搭建最简单的tomcat connector 用到了apapche 的 ...

  7. Failed to start mongod.service: Unit not found

    其实自己用惯的是MYSQL,然后项目最后一步完善数据读写的部分,本来打算用mysql的,然而在centOS系统上发现安装总是出问题,后来查找一下资料,发现centOS系统上一般用的是Mariadb,这 ...

  8. Windows下搭建RabbitMQ环境

    1.下载安装Erlang 下载地址:https://www.erlang.org/downloads 下载之后,正常安装即可. 安装完毕之后,开始栏里会有个这图标: 2.下载安装RabbitMQ 下载 ...

  9. 【Java_SSM】(一)maven环境变量的配置

    这篇博文我们介绍一下配置一下maven环境变量的配置. 准备工作 在eclipse配置maven之前需要我们做好准备工作,如下: 1. 安装jdk 2. 已下载好 maven,将maven配置成功 , ...

  10. CentOS7搭建Java环境(JDK、MySQL和Tomcat)

    目录 安装jdk 准备 jdk环境配置流程 安装MySQL 5.6 准备 MySQL安装流程 安装Tomcat 7 准备 Tomcat安装流程 参考链接 安装jdk 准备 jdk的tar.gz包(本文 ...