超簡單做出低功耗藍牙温度計(nRF52840 Dongle + TMP102 + MircoPython)

 MicroPython支援nRF52840 Dongle (pca10059), 這支在Mouser上只要台幣343左右就可以買到。買來後要燒錄MicroPython的firmware, 寫作時, MicroPython出到1.20.0版。燒錄方法, 可以參考燒錄Micropython 1.12至nRF52840 Dongle。這連結有更新, 文章下方有增加1.20.0版的燒錄方式, 不用擔心, 現在的燒錄方法是可以還原的, 以後仍可燒回其他firmware。

有了可跑MicroPython的nRF52840 Dongle後, 可以直接寫Python程式來實作低功耗藍牙温度計。其實不用傷腦筋如何寫, MicroPython官網就有一個範例程式, 直接拿來用就可以有這個功能了! 這麼好, 當然了, 這不就是MicroPython給我們的承諾嗎? 簡單好用! 連結在此: ubluepy_temp.py

註: 這個程式和MicroPython 1.20.0在nRF52840上, 會有RTC被用掉的問題, 要改一下! 如下圖, 1改成2就可以了。


改好, 直接跑, 然後用手機上的nRF Connect App (或其他BLE App), 找micr_temp這個裝置, 連接上去, 注意連接上去後, Dongle的LED燈會亮起來。找Environmental Sensing服務下的Temperature特徵值, 按下通知啟用, 並修改Data parser為符號整數。查看log部份, 就可以看到每5秒左右會更新一次温度值。如下圖:


如上圖, 第2點所圈起處, 看到2800, 這表示為28度C。如果沒有修改Data parser, 預設會是看到16進位數值, 如上圖第3點所圈起處0xF00A, 這個格式我們人類看不懂!

大家都注意到了吧! 現在温度都出現2700, 2800, 2900之類的, 後面那2個0都不會出現其他數字, 這是因為現在這個範例程式是存取nRF52840內建的温度感測器, 而這個温度感測器基本是查看MCU的温度用的, 而且目前firmware的實作也沒有取得小數點部份, 可能覺得沒必要! 而且, MCU通常會發熱, 比實際上的環境温度要高一些。

因此, 以下使用TMP102這顆TI的温度感測器來取得較為接近實際環境的温度。修改部份也很簡單, 只要加入TMP102的驅動, 再改一下上面這個範例程式就好。

但首先要處理一下硬體接線:


其實也很簡單, I2C的連線, 只要連接4條線就可以, VCC, GND, SDA, SCL。
TMP102         nRF52840 Dongle
VCC                VDD OUT
GND               GND
SDA                0.29
SCL                0.31

TMP102的驅動, 請參考再論TI TMP102這篇文章的最下方, 驅動的程式名字取為tmp102.py。請先將之存入Dongle。接著對原本的範例程式ubluepy_temp.py做以下修改即可:



這樣就好了, 改好存檔後, soft reset, 再跑, 然後用手機的nRF Connect App連入, 查看:


(記得改一下Data parser格式)就可以看到如上圖2475代表24.75度C的結果了, 這個温度值就比較接近實際環境的温度值了, 而且可以出現小數點以下, 較為精確的數值。

因為nRF52840 Dongle預設是用來接USB埠的, 所以我們可以拿一個手機充電器(有USB接頭的), 直接插進去, 這樣只要有電源插頭的地方就可以放我們的低功耗藍牙温度計了! 如下圖:


再修改一下boot.py, 加入一開機就跑我們改好的範例程式就大功告成。

留言

這個網誌中的熱門文章

D-BUS學習筆記

關於藍牙裝置找尋(inquiry, scan)兩三事

Cisco Switch學習筆記: EtherChannel