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

AppInventor - 圖形化Android

【雙A計畫】Part6:Arduino 傳兩筆資料到 Android 手機

CAVEDU 阿吉 - 雜工📅 2015-04-05👁 84

大家久等了, 本篇文章告訴您如何在 Android 手機端接收兩筆 Arduino 的資料,這次是以 A0, A1 兩隻腳位來處理。本範例感謝嘉義高工張老師提供。 如果您要換成其他元件,例如數位感測器的話,做法是一樣的。請先看一下這個元件的資料範圍是多少。對於本範例的架構來說,最後就是透過藍牙傳一個陣列出去,因此重點在於您是否可先在 Serial Monitor 中看到正確的資料範圍。不過一般來說都會有讀值得範例程式,所以不用太擔心啦! 您可以擴充這個架構到 N 筆,但是筆數愈多,掉資料的機會也愈高。請自行斟酌喔!

雙A計畫文章總覽:

中文系列文章

English version

 

作者/攝影   曾吉弘
難度

★★★☆☆

材料表
   

請按照電路圖將電路接上,接了一個電位器(A0)與光敏電阻(A1)。當然啦,您也可以兩個腳位都用相同的元件,方便就好。為了不讓大家眼花,藍牙發射器另外獨立出來表示 (藍牙RX - Arduino D11, 藍牙TX - Arduino D10腳位)

[caption id="attachment_16217" align="aligncenter" width="501"]未命名 A0:電位計。A1:光敏電阻[/caption] [caption id="attachment_16070" align="aligncenter" width="550"]螢幕快照-2014-10-30-上午12.41.36 TX: Arduino D11, RX: Arduino D10[/caption]

 

 

App Inventor 端程式

由於連線斷線的做法都是差不多的,在此把連線相關指令整理如下圖。請注意Clock timer 一開始是關閉的,我們會在連線成功之後才會將其啟動來發送藍牙指令,否則會一直跳出錯誤訊息(因為還沒連線啊!)
 
在 Clock.timer 事件中,首先發送一個數字49給Arduino,代表"我要發資料囉!" Arduino 則是先用 BluetoothClient.ReceiveText 指令,如果讀到'a',就接續讀取後面兩筆資料,這就是 A0 腳位的數值。請注意在此之所以要判斷 text 變數之否小於0再加上 256,是由於Arduino 的 8 bit 整數範圍是 -127 ~ 128 的緣故。
 
 
反之如果App 收到字元 'b' 就是 A1 腳位。作法同上。
 
 
接著在Clock.timer 事件最後將這兩筆數值(value_A0value_A1) 顯示於 Textbox,並且用這兩筆數值來控制 Canvas 上面的小飛機移動,快點來玩雷電遊戲吧!
 
螢幕快照 2015-04-05 上午1.11.29
 
 
因為資料傳輸過程中難免會遺漏,因此我們都是先抓到火車頭(就是'a' 與 'b'),確定這是一筆新的資料開頭之後,再去讀取數值,否則可能會發生數值亂跳的情形。另一方面,App Inventor 在藍牙傳輸的延遲狀況較明顯,請注意喔!
 
Arduino 端程式如下,我們把 A0 腳位的資料用 'a' 作為標頭,由於資料長度大於 1 byte ( 2的8次方),因此需要用到 2 bytes 才能把 A0 的數值範圍 (0~1023) 涵蓋進去,因此 Data[1]~Data[2] 就代表A0 腳位的資料,Data[4]~Data[5] 就是A1 腳位的資料:(Data [0] = 'a', Data[3] = 'b' 這兩個火車頭別忘記囉~)
 

[pastacode lang="c" message="" highlight="" provider="manual" manual="%23include%20%3CSoftwareSerial.h%3E%0A%23include%20%3CWire.h%3E%0ASoftwareSerial%20I2CBT(10%2C11)%3B%20%2F%2F%20TX%3A10%2C%20RX%3A11%0Abyte%20serialA%3B%0A%0Avoid%20setup()%7B%C2%A0%0A%C2%A0%20Serial.begin(9600)%3B%0A%C2%A0%20I2CBT.begin(9600)%3B%0A%7D%0A%C2%A0%0Avoid%20loop%20()%7B%0A%C2%A0%20%C2%A0%20byte%20Data%5B6%5D%3B%0A%C2%A0%20%C2%A0%20byte%20cmmd%5B20%5D%3B%0A%C2%A0%20%C2%A0%20int%20insize%3B%0A%C2%A0%20%C2%A0%20int%20x%3DanalogRead(A0)%3B%2F%2Fread%20sensor%20value%0A%C2%A0%20%C2%A0%20int%20y%3DanalogRead(A1)%3B%2F%2Fread%20sensor%20value%0A%C2%A0%20%C2%A0%20serialA%3DI2CBT.read()%3B%0A%C2%A0%20%C2%A0%20Data%5B0%5D%3D'a'%3B%0A%C2%A0%20%C2%A0%20Data%5B1%5D%3Dx%2F256%3B%0A%C2%A0%20%C2%A0%20Data%5B2%5D%3Dx%25256%3B%0A%C2%A0%20%C2%A0%20Data%5B3%5D%3D'b'%3B%0A%C2%A0%20%C2%A0%20Data%5B4%5D%3Dy%2F256%3B%0A%C2%A0%20%C2%A0%20Data%5B5%5D%3Dy%25256%3B%0A%C2%A0%20%C2%A0%20%C2%A0Serial.print(x)%3B%0A%C2%A0%20%C2%A0%20%C2%A0Serial.print(%22%20%2C%20%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0Serial.println(y)%3B%0A%C2%A0%0A%C2%A0%20%C2%A0%20%C2%A0if%20(serialA%20%3D%3D%2049)%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0for(int%20j%3D0%3Bj%3C5%3Bj%2B%2B)%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0I2CBT.write(Data%5Bj%5D)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0serialA%3D0%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20%7D%0A%C2%A0%20delay(100)%3B%0A%7D"/]

 

相關文章 📎

留言 💬 (0)

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