工程筆記本 / AppInventor - 圖形化Android

AppInventor - 圖形化Android

【雙A計劃】Part7:Arduino超音波感測距離回傳數值給Android手機

CAVEDU 阿吉 - 雜工📅 2015-06-06👁 48

雙A計畫不知不覺就來到第七篇了呢!這次我們將告訴您如何在 Android 手機端接收 Arduino端數位感測元件的數值,本範例使用的是超音波感測器讀取的距離數值。

雙A計畫文章總覽:

中文系列文章

English version

 

作者/攝影   袁又緣
難度

★★★☆☆

材料表
   

 

請先按照電路圖將電路接上,以下是超音波感測器與藍牙收發器接到Arduino的各個腳位

藍牙收發器:

GND → GND,  VCC → 5V,  TX → 11,  RX → 10

超音波感測器:

GND → GND,  VCC → 5V,  Trig → 8,  Echo → 9

Screen Shot 2015-06-06 at 9.00.05 PM  

 

App Inventor 端程式

本範例使用的App使用者介面如下:
 
 
Screen Shot 2015-06-06 at 11.43.32 AM
 
記得要將Clock元件的TimeInterval設定設短一點,每隔一段時間手機會去接收來自藍牙的訊息,為了避免漏接的情形,我們可以把這個間個時間改短一點,本範例使用100毫秒。
 
Screen Shot 2015-06-06 at 11.45.15 AM
 
接下來是 Blocks 頁面,全部程式碼如下圖,大致上可區分成四個區塊:
 
Screen Shot 2015-06-06 at 11.52.21 AM
 
區塊 元件名稱 功能
1.藍牙列表的設定 when List_BT.BeforePicking 在藍牙連線到裝置前,先將之前配對好的藍芽裝置匯入到準備連接的列表中
2.藍牙連線到裝置 when List_BT.AfterPicking 選好要連接的藍牙裝置後,將藍牙列表關閉、啟動計時器開始每隔一段時間讀值,並把斷線的按鈕設定為可執行
3.藍牙通訊(發送key與接收資料) when Clock1.Timer 計時器啟動後,每隔一段時間(100ms)就會啟動一次,一開始我們會先發送一個key(=97)給Arduino,如果Arduino確任無誤的話也會發送一個key(=97)給手機,手機確認無誤後,會開始收兩個byte(1byte = 8 bits)的數值,因為Arduino端送出的數值是採用8bits的封包,所以在這邊要將它還原回來必須將它從8bits(2^8 = 256)轉回10進制,最後在除上100將單位轉成cm
4.斷線按鈕的設定 when Btn_Disconnect.Click 按下斷線後就會斷開藍牙通訊,並把按鈕配置回到一開始的狀態
 
 

Arduino端的程式設計

接下來我們看到Arduino的程式碼,藉由計算超音波打到物體的收發時間間隔,再搭配上音速的計算公式,就可以算出距離,注意到本程式碼為了保留小數兩位,所以先乘上100,並化成整數再轉成兩個bytes的封包,Arduino在發送訊息之前,也會先確認是否收到手機端送來的key,確認無誤之後,就會將資料送出去,資料的前頭也會附上Arduino傳給手機端的key,一方面讓手機知道可以接收資料了,一方面也比較不會有封包漏接的情況,因為手機端每次收資料,都會將以收到的key開始做基準收兩個bytes。
 
程式碼如下:
 

[pastacode lang="c" message="Arduino_Android_UltrasonicSensor" highlight="" provider="manual" manual="%23include%20%3CSoftwareSerial.h%3E%20%2F%2FArduino%20I2C%20library%0A%0Aconst%20int%20trig%20%3D%20%208%3B%20%2F%2Fdefine%20Arduino%20pin%0Aconst%20int%20echo%20%3D%20%209%3B%0Aconst%20int%20TX%20%20%20%3D%2010%3B%0Aconst%20int%20RX%20%20%20%3D%2011%3B%0A%0Aconst%20int%20delay_time%20%3D%201000%3B%20%2F%2Fdelay%201000%20ms%20for%20every%20measurment%0A%0ASoftwareSerial%20BT(RX%2C%20TX)%3B%20%0A%2F%2Fset%20Bluetooth%20RX%20(-%3E%20pin%20TX%20of%20Bluetooth%20Module)%2C%20TX%20(-%3E%20pin%20RX%20of%20Bluetooth%20Module)%0A%0Avoid%20setup()%20%7B%0A%09Serial.begin(9600)%3B%20%2F%2Fset%20baud%20rate%20of%20Serial%20Monitor%0A%09BT.begin(9600)%3B%20%2F%2Fset%20baud%20rate%20of%20Bluetooth%0A%09pinMode(trig%2C%20OUTPUT)%3B%20%2F%2Fset%20trigger%20pin%20to%20OUTPUT%20(-%3E%20pin%20trig%20of%20Ultrasonic%20Sensor)%0A%09pinMode(echo%2C%20INPUT)%3B%20%2F%2Fset%20echo%20pin%20to%20INPUT%20(-%3E%20pin%20echo%20of%20Ultrasonic%20Sensor)%0A%09Serial.println(%22Start!!!%22)%3B%0A%7D%0A%0Avoid%20loop()%20%7B%0A%09float%20duration%3B%20%2F%2Fduration%20to%20record%20the%20time%20of%20every%20back%20and%20forth%20%0A%09float%20distance%3B%20%0A%09digitalWrite(trig%2C%20HIGH)%3B%20%2F%2Ftrigger%20sona%20for%201%20ms%0A%09delayMicroseconds(1000)%3B%20%0A%09digitalWrite(trig%2C%20LOW)%3B%0A%09duration%20%3D%20pulseIn(echo%2C%20HIGH)%3B%20%0A%09%2F%2Fuse%20pulseIn()%20function%20to%20get%20the%20time%20of%20pin%20echo%20from%20HIGH%20to%20LOW%2C%20unit%3Dmicroseconds%0A%09distance%20%3D%20(duration%20%2F%202)%20*%200.034%3B%0A%09%2F%2Fdistance%20%3D%20(%20half%20of%20time%20of%20back%20and%20forth%20)x(%20wave%20velocity(use%200.034%20cm%20per%20microsecond)%20)%0A%09%0A%09Serial.print(%22Distance%20%3D%22)%3B%20%2F%2Fshow%20result%20on%20Serial%20Monitor%0A%09Serial.print(distance)%3B%0A%09Serial.println(%22cm%22)%3B%0A%09delay(delay_time)%3B%0A%0A%09int%20sendData%20%3D%20(int)%20(distance%20*%20100)%3B%20%2F%2Ftimes%20100%20and%20convert%20disance%20to%20integer%20%0A%09byte%20packet%5B3%5D%3B%20%0A%09packet%5B0%5D%20%3D%2097%3B%20%2F%2Fkey%20send%20to%20phone%0A%09packet%5B1%5D%20%3D%20sendData%20%2F%20256%3B%20%2F%2Fdivides%20sendData%20to%20two%201%20byte%20packets%0A%09packet%5B2%5D%20%3D%20sendData%20%25%20256%3B%0A%09%0A%0A%09%0A%09if(BT.available()%20%3E%200)%20%2F%2Fcheck%20BT%20is%20succeed%0A%09%09if(BT.read()%20%3D%3D%2097)%20%2F%2Fcheck%20recieve%20key%20from%20phone%0A%09%09%7B%0A%09%09%09Serial.println(%22succeed!%22)%3B%0A%09%09%09for(int%20i%20%3D%200%3B%20i%20%3C%203%3B%20i%2B%2B)%20%0A%09%09%09%09BT.write(packet%5Bi%5D)%3B%20%2F%2Fsend%20packet%20to%20phone%0A%09%09%7D%0A%0A%0A%7D%0A%0A%0A"/]

相關文章 📎

留言 💬 (0)

還沒有留言,來當第一個。