「RT-Thread笔记」BH1750软件包的使用

「RT-Thread笔记」BH1750软件包的使用那是因为我们没有打开 I2C 相关的宏 drv soft i2c c 中模拟了几个 i2c 我们要确认我们使用哪一个 i2c 与 bh1750 传感器相连

欢迎大家来到IT世界,在知识的湖畔探索吧!

BH1750简介

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

「RT-Thread笔记」BH1750软件包的使用



欢迎大家来到IT世界,在知识的湖畔探索吧!

创建工程、验证

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

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

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

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

1、添加bh1750软件包

「RT-Thread笔记」BH1750软件包的使用

「RT-Thread笔记」BH1750软件包的使用

「RT-Thread笔记」BH1750软件包的使用

2、打开i2c设备驱动

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

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

3、下载、验证

「RT-Thread笔记」BH1750软件包的使用

若执行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;

欢迎大家来到IT世界,在知识的湖畔探索吧!

4、编写应用

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

(1)测试函数

「RT-Thread笔记」BH1750软件包的使用

(2)显示数据

「RT-Thread笔记」BH1750软件包的使用

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

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

欢迎大家来到IT世界,在知识的湖畔探索吧!/* 公号:嵌入式大杂烩 */ 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笔记」BH1750软件包的使用

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

「RT-Thread笔记」BH1750软件包的使用

「RT-Thread笔记」BH1750软件包的使用

「RT-Thread笔记」BH1750软件包的使用

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

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/122574.html

(0)
上一篇 1天前
下一篇 21小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信