1. 程式人生 > >【RT-Thread筆記】BH1750軟體包的使用

【RT-Thread筆記】BH1750軟體包的使用

## BH1750簡介 `BH1750`是一種用於兩線制序列匯流排介面的`16位`數字型光強度感測器積體電路。利用它的高解析度可以探測較大範圍的光強度變化。(`1lx~65535lx`)。 ![twfd76.png](https://s1.ax1x.com/2020/06/04/twfd76.png) ## 建立工程、驗證 在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軟體包 ![twfDhD.png](https://s1.ax1x.com/2020/06/04/twfDhD.png) ![twf0AK.png](https://s1.ax1x.com/2020/06/04/twf0AK.png) ![twfBtO.png](https://s1.ax1x.com/2020/06/04/twfBtO.png) ### 2、開啟i2c裝置驅動 ![twfa0x.png](https://s1.ax1x.com/2020/06/04/twfa0x.png) 目前只有軟體i2c驅動。儲存`RT-Thread Settings`檔案。編譯報錯: ![twfcjA.png](https://s1.ax1x.com/2020/06/04/twfcjA.png) 那是因為我們沒有開啟I2C相關的巨集,`drv_soft_i2c.c`中模擬了幾個i2c,我們要確認我們使用哪一個i2c與bh1750感測器相連。 ![twf2nI.png](https://s1.ax1x.com/2020/06/04/twf2nI.png) 這裡可以看到bh1750的示例的初始化函式中使用了i2c2,所以相應的我們需要在`board.h`中開啟i2c2相關的巨集,需要開啟、修改哪些巨集可以看相關注釋: ![twfo9g.png](https://s1.ax1x.com/2020/06/04/twfo9g.png) 這裡我們使用的是小熊派開發板,bh1750與MCU通過PB6、PB7引腳相連: ![twf6cd.png](https://s1.ax1x.com/2020/06/04/twf6cd.png) 雖然PB6、PB7可以配置為硬體i2功能,但是我們這裡使用的是軟體i2c,所以這裡的PB6、PB7是當做gpio來用的。然後我們根據註釋的說明把程式碼改為: ![twfy1H.png](https://s1.ax1x.com/2020/06/04/twfy1H.png) 然後編譯報錯,錯誤提示這幾個巨集有問題。反反覆覆檢查,好像沒什麼問題,為啥就會瘋狂報錯。隱約記得有些例程例程中表示引腳好像不是這麼表示的,而是類似這樣的: ![twfRBt.png](https://s1.ax1x.com/2020/06/04/twfRBt.png) 每個引腳都有一個新的代號,而這些引腳與代號的關係可以在`drv_gpio.c`中檢視: ![twfhAf.png](https://s1.ax1x.com/2020/06/04/twfhAf.png) 可以看到我們的PB6、PB7引腳的代號分別是22、23。然後嘗試著把上面的i2c巨集程式碼改為: ![twfWHP.png](https://s1.ax1x.com/2020/06/04/twfWHP.png) 編譯成功!然後試著讀取感測器資料,也成功了。所以,這大概是`RT-Thread Studio V1.1.0`的一個小bug,模板工程的`board.h`裡關於i2c的註釋有問題,嚴重誤導了我們。。 ### 3、下載、驗證 ![twf54S.png](https://s1.ax1x.com/2020/06/04/twf54S.png) 若執行`sensor read`命令無資料輸出時,需要開啟\components\drivers\sensors\sensor_cmd.c,在`sensor_show_data`函式後面自行增加環境光照強度列印程式碼: ```c 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)測試函式 ![twf4N8.png](https://s1.ax1x.com/2020/06/04/twf4N8.png) #### (2)顯示資料 ![twf7cj.png](https://s1.ax1x.com/2020/06/04/twf7cj.png) 除此之外還有其它幾個應用相關的函式。 我們也可以模仿sensor_cmd.c裡面的程式碼來寫我們自己的應用程式碼: ```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); ``` 執行結果: ![twfLBq.png](https://s1.ax1x.com/2020/06/04/twfLBq.png) 使用RT-Thread提供給我的I/O裝置管理介面rt_device_find、rt_device_open、rt_device_read、rt_device_close來編寫應用。相關框圖: ![twfT3Q.png](https://s1.ax1x.com/2020/06/04/twfT3Q.png) ![twfHjs.png](https://s1.ax1x.com/2020/06/04/twfHjs.png) ![twfqun.png](https://s1.ax1x.com/2020/06/04/twfqun.png) 關於RT-Thread的I/O裝置模型可檢視往期筆記:[【RT-Thread筆記】IO裝置模型](http://mp.weixin.qq.com/s?__biz=MzU5MzcyMjI4MA==&mid=100002350&idx=1&sn=2e2eb1add1055e71e914be572dd3b2a2&chksm=7e0d64e9497aedff2a8c1783f0526b62b084a726c3471c76c72a886c899388c9c038cf566b1a#rd) 以上就是本次的分享,如有錯誤,歡迎指出! ------ 我的個人部落格:https://www.lizhengnian.cn/ 我的微信公眾號:嵌入式大雜燴 我的CSDN部落格:https://blog.csdn.net/zhengnianli ![](https://s2.ax1x.com/2019/06/11/VcSFJJ