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

AppInventor - 圖形化Android

【雙A計劃】 Part3:Android 手機透過藍牙接收 Arduino 類比腳位狀態

徐 豐智📅 2014-01-02👁 650
本篇將教導大家如何使用手機讀取Arduino上類比腳位的數值,在此我們接上的是旋鈕式可變電阻。實際上可連接的元件不只可變電阻,所有的類比式感測器例如光敏電阻、熱敏電阻等都可以這樣使用!

雙A計畫文章總覽:

中文系列文章

English version
 
作者/攝影   偉和
難度

★★★☆☆

材料表 【推薦套件】自學者的天堂|Arduino 入門到雲端基本套件包
下載 範例程式請點我下載(App Inventor中文學習網檔案庫)  App Inventor 2檔名:ReceiveDatafromArduino.aia

範例影片如下:

https://www.youtube.com/watch?v=Xlk_2cYytFI&feature=youtu.be 先由下圖將藍牙及可變電阻接上Arduino (藍牙RX - Arduino D11, 藍牙TX - Arduino D10腳位)

App Inventor 編寫藍牙訊息接收程式

畫面元件很簡單,點選 BT List 之後,會顯示藍牙配對裝置清單,點選您已經配對好的藍牙裝置之後,Arduino的類比腳位資訊就會顯示在畫面中央的 TextBox 上。 這邊要注意的地方是要將Clock1的TimerInterval更改成10,也就是每 0.01秒更新一次。這麼一來才比較不會發生漏抓Arduino 發出來的訊息 螢幕快照 2014-04-02 下午11.35.50      4

程式說明:

本段程式重點在於手機在讀取Arduino訊號時,並不是直接向Arduino取得資料,而是採用間接的手法。先讓手機丟出一個訊號(本範例為發送49)。Arduino在等待接收到此訊號後,才會將感應器的數值以封包的形式傳送給手機。在第二個if後就是手機解讀Arduino所傳送過來的封包,並顯示到手機上。 請注意在程式初始化時我們把 Timer 關掉了,不然還沒有藍牙連線成功之前就發送藍牙訊息的話,會一直顯示錯誤畫面。 text 文字變數是用來接收 Arduino 送來的標頭,如果是'a' 就代表這是一串封包的第一個,可以開始讀取了。 螢幕快照 2015-06-05 下午1.04.24   在 Clock.Timer事件中,會先送出一個49的數字作為確認碼,Arduino 接收到這筆資料之後就知道要開始傳送資料了。由於 Arduino A0 腳位的數值範圍是 0~ 1023,但是封包卻是以 8 bit (一位元組)為單位,因此要把數值以 8位元為單位來組合,並存入 number 變數中,就能順利將數字還原了。最後將 number 變數值顯示於 TextBox 中。   在斷線時,關閉計時器與藍牙連線,並讓畫面恢復到初始狀態 螢幕快照 2015-06-05 下午1.04.29

Arduino 程式碼

[pastacode lang="c" message="App Inventor receive Arduino analog status" highlight="" provider="manual" manual="%23include%20%3CSoftwareSerial.h%3E%0A%23include%20%3CWire.h%3E%0ASoftwareSerial%20I2CBT(10%2C11)%3B%0Abyte%20serialA%3B%0Avoid%20setup()%7B%0A%0A%20%20Serial.begin(9600)%3B%0A%20%20I2CBT.begin(9600)%3B%0A%7D%0A%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2Fmain%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%0A%0Avoid%20loop%20()%7B%0A%20%20%20%20byte%20Data%5B3%5D%3B%0A%20%20%20%20byte%20cmmd%5B20%5D%3B%0A%20%20%20%20int%20insize%3B%0A%20%20%20%20char%20str%5B256%5D%3B%0A%20%20%20%20int%20i%3DanalogRead(A0)%3B%2F%2Fread%20sensor%20value%0A%20%20%20%20serialA%3DI2CBT.read()%3B%0A%20%20%20%20Data%5B0%5D%3D'a'%3B%0A%20%20%20%20Data%5B1%5D%3Di%2F256%3B%0A%20%20%20%20Data%5B2%5D%3Di%25256%3B%0A%20%20%20%20sprintf(str%2C%22i%3A%20%25d%200%3A%20%25d%201%3A%20%25d%202%3A%20%25d%22%2Ci%2CData%5B0%5D%2CData%5B1%5D%2CData%5B2%5D)%3B%0A%20%20%20%20%20Serial.println(str)%3B%0A%20%20%20%20%20if%20(serialA%20%3D%3D%2049)%7B%0A%20%20%20%20%20%20%20%20%20for(int%20j%3D0%3Bj%3C3%3Bj%2B%2B)%0A%20%20%20%20%20%20%20%20%20I2CBT.write(Data%5Bj%5D)%3B%0A%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20serialA%3D0%3B%0A%20%20%20%20%20%20%7D%20%0A%20%20%2F%2Fdelay(100)%3B%20%20%20%20%0A%7D"/]    

相關文章 📎

留言 💬 (0)

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