
本文轉自:DFRobot創客社區
原文鏈接:
[Mind+]使用圖形化編程實現主控板與手機藍牙通訊-Mind+論壇-DF創客社區?mc.dfrobot.com.cn
本帖最后由 Forgotten 于 2019-3-25 12:58 編輯
做項目時我們經常會遇到藍牙的問題,例如使用appinventor制作一個app控制板子,或者將板子的數據通過藍牙傳到手機上。
遂決定研究一下手機與主控板的藍牙通訊。
材料選擇:
1、我們選擇的是藍牙通訊,藍牙通訊的好處是可以很方便的跟手機進行通訊,缺點是點對點通訊(最新的藍牙會支持多點通訊,不在我們討論范圍內),傳輸速度比較低(無法傳視頻圖像等)。
2、藍牙有不同的代數,有不同的功能(類比最開始手機都是大哥大,后面有2G、3G、4G、5G等等),我們當前最常見的是藍牙2.0(bluetooth)和低功耗藍牙4.0(BLE,Bluetooth Low Energy),但是兩者都可以實現通訊功能。
4、由于BLE無需密碼配對,兩個設備靠近就可以,安卓和蘋果都支持,因此我選擇兼容性更好也是更方便的BLE進行操作。一般我們常見的HC-05,HC-06是藍牙2.0,使用方法略有不同(appinventor界面的程序不同),本教程我們選擇DFRobot出品的BLE-Link藍牙模塊作為樣例,同時為了接線方便兼容各種不同的主控板,我們需要一個轉接模塊。
鏈接:BLE-Link藍牙模塊xbee io擴展板


本篇我們首先了解一下基礎知識。
BLE-Link通訊的接口是串口,因此只要是支持串口的主控板均支持,不管是Arduino還是microbit又或是掌控,同樣的板或者不同的板之間,只要支持串口,板子連接一個BLE-Link就可以實現通訊,因此在本教程中不區分板子,以使用最為廣泛的arduino uno板進行通訊為例。
(注:盡管microbit、esp32等板子自帶了藍牙,但是由于占用空間大,或是使用不穩定,因此外接一個藍牙模塊也是一個不錯的選擇)
示意圖:

接下來我們進入實操環節:
實現效果:手機app發送一個消息給主控板,主控板收到消息后把這個消息返回給手機app顯示。
1、手機app準備:
我使用appinventor制作了一個手機app方便進行調試,可以直接下載附件apk文件在安卓手機上進行安裝,也可以在appinventor里面打開我的aia文件進行修改編輯。
app inventor 2:mit開發的安卓手機端圖形化編程軟件,目前國內已經有中文服務器了,可以在線編程,手機直接掃描二維碼或者使用ai伴侶即可運行,比較方便,推薦兩個網址任選:廣州電教館服務器,17coding,基本使用功能可以參考17coding的教程。
appinventor的aia文件點擊下載
安卓端app軟件點擊下載
編程界面:

手機app界面:

2、BLE-Link準備:
首先需要將BLE-Link設置為從機,這樣手機才能搜索到,還可以改個名字方便識別。
使用usb線連接BLE-Link上的usb口,打開Mind+上傳模式,選擇BLE-Link對應的端口,波特率選擇115200,打開串口監視器,如下圖:


選擇“沒有結束符”,輸入+++ 發送,此時會顯示 Enter AT Mode,極為進入了BLE-Link設置模式

接下來將“沒有結束符”切換成“回車加換行”,依次發送以下三條命令:
AT+SETTING=DEFAULT
AT+NAME=BLE-Link1
AT+RESTART

注:第一條是恢復出廠設置成從機,第二條是將此模塊名字設置為BLE-Link1,第三條是重啟模塊使設置生效。更多AT命令見wiki。
接下來我們將BLE-Link插到io擴展板上,并使用四根杜邦線引出5V RX TX GND

3、對主控板進行編程:
我們要實現將手機app發送的消息返回給手機app,因此就是從串口把收到的數據再通過串口輸出即可,程序如下圖:

程序上傳到uno之后,連接BLE-Link與Uno板(BLE-Link的TX接uno的D0,RX接uno的D1,5V接VCC,GND接GND),手機app搜素連接BLE-Link,Link燈亮,發送hello,情況如下:


發現返回了5個數字,為什么會這樣呢?我們就看一下ASCII字符編碼表,發現這5個數字對應的是5個字符的十進制編碼,因為數據在收發的過程中都是以101010形式的二進制傳輸的,接收到的時候如果不做轉換就是數字了。

因此我們如果要顯示字符的形式,那么我們就進行一下轉換,Mind+的“運算符”中有對應的模塊轉成ASCII字符,修改程序如下:

再次上傳,注意因為BLE-Link占用的串口和上傳程序是一個串口,因此在每次上傳的時候需要拔下D0上的線,否則會報錯。


再次發送hello,這次正常顯示了數據,至于為什么換行了,就是程序發送的情況了,串口發送是每次一個字符的,所以執行下來就換行了5次。


未完待續。。。