【RT-Thread筆記】BH1750軟件包的使用
點(diǎn)擊上方「嵌入式大雜燴」,選擇「置頂公眾號(hào)」第一時(shí)間查看嵌入式筆記!
BH1750簡介
BH1750
是一種用于兩線制串行總線接口的16位
數(shù)字型光強(qiáng)度傳感器集成電路。利用它的高分辨率可以探測較大范圍的光強(qiáng)度變化。(1lx~65535lx
)。
創(chuàng)建工程、驗(yàn)證
在RT-Thread中讀取BH1750
數(shù)據(jù)有兩種方法:一種方法是借助bh1750軟件包
;另一種方法是直接使用i2c驅(qū)動(dòng)框架
讀取BH1750
數(shù)據(jù)。
關(guān)于直接使用i2c驅(qū)動(dòng)框架
讀取BH1750
數(shù)據(jù)的方法可以閱讀Mculover666兄的這篇:
https://blog.csdn.net/Mculover666/article/details/104675712
本次實(shí)驗(yàn)我們借助bh1750軟件包來讀取BH1750
傳感器數(shù)據(jù),使用RT-Thread Studio V1.1.0
來創(chuàng)建工程。
1、添加bh1750軟件包
2、打開i2c設(shè)備驅(qū)動(dòng)
目前只有軟件i2c驅(qū)動(dòng)。保存RT-Thread Settings
文件。編譯報(bào)錯(cuò):
那是因?yàn)槲覀儧]有打開I2C相關(guān)的宏,drv_soft_i2c.c
中模擬了幾個(gè)i2c,我們要確認(rèn)我們使用哪一個(gè)i2c與bh1750傳感器相連。
這里可以看到bh1750的示例的初始化函數(shù)中使用了i2c2,所以相應(yīng)的我們需要在board.h
中打開i2c2相關(guān)的宏,需要打開、修改哪些宏可以看相關(guān)注釋:
這里我們使用的是小熊派開發(fā)板,bh1750與MCU通過PB6、PB7引腳相連:
雖然PB6、PB7可以配置為硬件i2功能,但是我們這里使用的是軟件i2c,所以這里的PB6、PB7是當(dāng)做gpio來用的。然后我們根據(jù)注釋的說明把代碼改為:
然后編譯報(bào)錯(cuò),錯(cuò)誤提示這幾個(gè)宏有問題。反反復(fù)復(fù)檢查,好像沒什么問題,為啥就會(huì)瘋狂報(bào)錯(cuò)。隱約記得有些例程例程中表示引腳好像不是這么表示的,而是類似這樣的:
每個(gè)引腳都有一個(gè)新的代號(hào),而這些引腳與代號(hào)的關(guān)系可以在drv_gpio.c
中查看:
可以看到我們的PB6、PB7引腳的代號(hào)分別是22、23。然后嘗試著把上面的i2c宏代碼改為:
編譯成功!然后試著讀取傳感器數(shù)據(jù),也成功了。所以,這大概是RT-Thread Studio V1.1.0
的一個(gè)小bug,模板工程的board.h
里關(guān)于i2c的注釋有問題,嚴(yán)重誤導(dǎo)了我們。。
3、下載、驗(yàn)證
若執(zhí)行sensor read
命令無數(shù)據(jù)輸出時(shí),需要打開\components\drivers\sensors\sensor_cmd.c,在sensor_show_data
函數(shù)后面自行增加環(huán)境光照強(qiáng)度打印代碼:
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、編寫應(yīng)用
上面能輸入那些命令對bh1750進(jìn)行測試的前提是官方已經(jīng)給我們寫好了相關(guān)應(yīng)用demo,在sensor_cmd.c中,如:
(1)測試函數(shù)
(2)顯示數(shù)據(jù)
除此之外還有其它幾個(gè)應(yīng)用相關(guān)的函數(shù)。
我們也可以模仿sensor_cmd.c里面的代碼來寫我們自己的應(yīng)用代碼:
左右滑動(dòng)查看全部代碼>>>
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)
{
/* 從傳感器讀取一個(gè)數(shù)據(jù) */
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)
{
/* 線程創(chuàng)建成功,啟動(dòng)線程 */
rt_thread_startup(tid);
}
return 0;
}
/* 導(dǎo)出到 msh 命令列表中 */
MSH_CMD_EXPORT(bh1750_example, bh1750 example);
運(yùn)行結(jié)果:
使用RT-Thread提供給我的I/O設(shè)備管理接口rt_device_find、rt_device_open、rt_device_read、rt_device_close來編寫應(yīng)用。相關(guān)框圖:
關(guān)于RT-Thread的I/O設(shè)備框架的介紹可閱讀往期筆記:【RT-Thread筆記】IO設(shè)備模型及PIN設(shè)備
最后
以上就是本次的分享,如有錯(cuò)誤,歡迎指出!
原創(chuàng)不易,期待您的在看、轉(zhuǎn)發(fā)。感謝支持!
猜你喜歡:
C語言、嵌入式重點(diǎn)知識(shí):回調(diào)函數(shù)
【Linux筆記】通俗易懂的Linux驅(qū)動(dòng)基礎(chǔ)
【Linux筆記】pc機(jī)_開發(fā)板_ubuntu互ping實(shí)驗(yàn)
學(xué)習(xí)STM32的一些經(jīng)驗(yàn)分享
基于LiteOS的智慧農(nóng)業(yè)案例實(shí)驗(yàn)分享
后臺(tái)回復(fù):加群。添加ZhengN微信,加入交流群
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請聯(lián)系我們,謝謝!