Micro:bit發送訊號給SU-03T

在上一篇中已介紹SU-03T被語音觸發後傳命令給Micro:bit,這一篇就做比較複雜一點點的,主要是Micro:bit和SU-03T之間傳來傳去的…而整個知識層面也比較完整

來回傳送訊息的範例

透過這個影片的範例,可以讓大家了解Micro:bit和SU-03T之間的資料互傳,一開始利用之前的「前進」語音觸發SU-03T回應,它會傳送「A」字元給Micro:bit,當Micro:bit收到A時又觸發函式取得超音波的障礙物距離並傳給SU-03T,SU-03T會判斷這個數值的大小做出不同的回答,且在距離短時再傳一個「B」回來給Micro:bit

另一個命令寫在Micro:bit的A鍵,同時送出二個數值(DHT11取得的溫溼度)給SU-03T而它會依溫度來判斷要不要建議開冷氣,而且一定回傳一個「C」給Micro:bit

先看看韌體的部份:從上一個簡單練習的韌體按查看可以藉此修改成下一版本(也就是你定義一個產品後可以不斷地修改繼承成為下一個Update的子版本)

因為要接收Micro:bit端傳來的命令,所以我們自己再新增二條行為(comm2和comm3),觸發方式則選「串口輸入」,有個地方我提醒一下,因為對象是Micro:bit所以BAUD最好設定115200比較好,否則有時會怪怪的

接下來先翻到「變量定義」頁籤,添加變量如下圖,類型都選unsigned就行了,它會自動型別,這三個變數主要用來接收並暫存距離、溫度和溼度

翻回「控制詳情」,我們要設定一下串口收到什麼才會觸發

添加觸發

如左圖,串口輸入、UART1_RX是必然的,注意它自己給的消息編號(流水號是很重要的)就是觸發點唷!

下方的輸入參數是依你的設計需要,有沒有要傳值進來,這個comm2我預定讓Micro:bit傳距離給它,所以我添加了一個參數a1(自己依變數通則取名),類型也選unsigned,測試值隨便打

傳多個參數

為了比較有測試價值,在comm3的觸發裡,我設定要接收二個值,把參數名稱定為a2和a3,準備來接收溫度和溼度,消息編號會自己跳2,這個你只要記得就可以

所以目前的狀態就是下圖

設定被觸發後要做什麼事,這可是重頭戲了,上圖中我點選comm2的「添加控制」先設定由變數s1接收參數a1的值

確定後繼續添加控制,選條件執行(這小小的晶片可以設定這麼多),我打算利用這個S1變數來寫判斷式

在s1小於等於10的時候,SU-03T播放語音,而內容可以用添加文本、添加變量來湊,這樣可以明白吧!

所以這條comm2設定完大概如下圖,我還加了一個判斷就是在s1小於等於10的時候除了會講「這樣的距離…」,還會串口輸出字元B(hex是42)給Micro:bit

對於comm3的設定應該就能理解了,只是傳二個參數可以用

以上這樣就差不多了,可以繼承成新的子版本並發布出新的韌體來用囉!

接下來講Micro:bit的部份,就看一下積木圖理解一下吧!

主要是那二個送資料出去的函數,有包含灰色的積木(沒得拉的),這個寫法我是跟對岸的工程師學的,目的是從Micro:bit中送16進位的值出去,運用開設Buffer的方法,十進位的170就是十六進位的AA,以「send_distance」這個函式來說就是從串口送出
「AA 55 01 距離值 55 AA」 的意思,AA 55....55 AA這種格式是SU-03T訂的,其中那個1送進去後會觸發消息編號1,下一個數字就是傳進去的第一個參數…

積木塊的生成方法

在Makecode中先切到Javascript頁,直接貼以下的程式碼再改成你要的
unction send_distance (num: number) {

    let buf = pins.createBuffer(6);

    buf[0] = 170

    buf[1] = 85

    buf[2] = 1

    buf[3] = num

    buf[4] = 85

    buf[5] = 170

    serial.writeBuffer(buf)

}


好了!我想就寫到這兒就好!其他的變化大家都可以自己想像…只有你知道自己想做出什麼效果,所以自己生成自己的韌體是必要的~不只是為了不同的喚醒詞及回應詞