【雙A計劃】Part7:Arduino超音波感測距離回傳數值給Android手機
雙A計畫不知不覺就來到第七篇了呢!這次我們將告訴您如何在 Android 手機端接收 Arduino端數位感測元件的數值,本範例使用的是超音波感測器讀取的距離數值。
雙A計畫文章總覽:
| 作者/攝影 | 袁又緣 |
| 難度 |
★★★☆☆ |
| 材料表 |
|
請先按照電路圖將電路接上,以下是超音波感測器與藍牙收發器接到Arduino的各個腳位
藍牙收發器:
GND → GND, VCC → 5V, TX → 11, RX → 10
超音波感測器:
GND → GND, VCC → 5V, Trig → 8, Echo → 9
App Inventor 端程式
| 區塊 | 元件名稱 | 功能 |
| 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端的程式設計
[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)
還沒有留言,來當第一個。