Styra tangentbord & mus w / Android app via Arduino (7 / 10 steg)
Steg 7: Android app
För nästa steg ska jag anta att du är bekväm med att skriva en Android app. Om inte, vänligen se över länkarna i steg 2. Källkoden är nedan.ANTECKNINGAR:
* Vara säker på att ändra värdet för DEVICE_ADDRESS. Detta kan hittas på klistermärket på din BlueSMiRF. Det finns också samtidigt överföringshastigheten i steg 4 (#9). Det är sträng med bokstäver och siffror efter "BTA", som är ett värde över "BAUDRT".
* Vara säker på att ändra paketet namn (första raden i MyRemote.java) för att matcha projektets katalogstruktur
MyRemote.java
paketet edu.mit.media.amarino.myremote;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import at.abraxas.amarino.Amarino;
allmän klass MyRemote sträcker sig aktiviteten {
offentliga TextView resultatet;
Public int a, b;
offentliga EditText inputField;
/ * ändra adressen till adressen för din Bluetooth-modul
* och kontrollera din enhet har lagts till Amarino * /
privata statisk slutlig String DEVICE_ADDRESS = "00:06:66:07:AD:FE";
slutliga int dröjsmål = 150;
/ ** Kallas när aktiviteten skapas. */
public void onCreate (bunt savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Amarino.connect (, DEVICE_ADDRESS);
slutliga knappen LKlicka = (knappen) findViewById(R.id.leftClick);
lClick.setOnClickListener (nya View.OnClickListener() {
public void VidKlickning (Visa v) {
Utföra åtgärden på klicka
onLeftClick();
}
});
slutliga knappen rClick = (knappen) findViewById(R.id.rightClick);
rClick.setOnClickListener (nya View.OnClickListener() {
public void VidKlickning (Visa v) {
Utföra åtgärden på klicka
onRightClick();
}
});
slutliga knappen plus = (knappen) findViewById(R.id.plusBtn);
plus.setOnClickListener (nya View.OnClickListener() {
public void VidKlickning (Visa v) {
Utföra åtgärden på klicka
onPlus();
}
});
slutliga knappen minus = (knappen) findViewById(R.id.minusBtn);
minus.setOnClickListener (nya View.OnClickListener() {
public void VidKlickning (Visa v) {
Utföra åtgärden på klicka
onMinus();
}
});
inputField = (EditText)findViewById(R.id.input);
TextWatcher fieldValidatorTextWatcher = ny TextWatcher() {
public void beforeTextChanged (CharSequence s, int start, int räkna, int efter) {
}
public void onTextChanged (CharSequence s, int start, int innan, int räkna) {
String str = inputField.getText().toString();
int längd = str.length();
char c;
backspaced
om (len < = start) {
onDelete();
}
Swyped
annars om (len > (start + 1)) {
Sträng temp = "";
för (int jag = start; jag < len; i ++) {
c = str.charAt(i);
Temp += Character.toString(c);
}
onSend(temp);
}
normalt har skrivit
annat {
c = str.charAt(len-1);
Str = Character.toString(c);
onSend(str);
}
}
public void afterTextChanged (redigerbara arg0) {
}
};
inputField.addTextChangedListener(fieldValidatorTextWatcher);
}
skyddade void onStart() {
super.onStart();
}
skyddade void onStop() {
super.onStop();
stoppa Amarinos bakgrund tjänsten, vi inte behöver det längre
Amarino.Disconnect (, DEVICE_ADDRESS);
}
offentliga boolean onTouchEvent (MotionEvent händelse) {
int x = (int)event.getX();
int y = (int)event.getY();
int diffX;
int diffY;
booleska isUp, isDown, isLeft, isRight;
Switch (event.getAction()) {
fall MotionEvent.ACTION_DOWN:
en = x;
b = y;
bryta;
fall MotionEvent.ACTION_MOVE:
ta reda på vänster eller höger
IF(a > x) {
isLeft = sant;
isRight = false;
} annat {
isRight = sant;
isLeft = false;
}
bestämma uppåt eller nedåt
IF(b > y) {
isUp = sant;
isDown = false;
} annat {
isDown = sant;
isUp = false;
}
beräkna skillnaden
diffX = en - x;
om (diffX < 0) diffX * = -1;
diffY = b - y;
om (diffY < 0) diffY * = -1;
fastställa större skillnad
om (isLeft & & isUp) {
IF(diffX > diffY) onLeft();
annat onUp();
}
annars om (isLeft & & isDown) {
IF(diffX > diffY) onLeft();
annat onDown();
}
annars om (isRight & & isDown) {
IF(diffX > diffY) onRight();
annat onDown();
}
annars om (isRight & & isUp) {
IF(diffX > diffY) onRight();
annat onUp();
}
bryta;
fall MotionEvent.ACTION_UP:
bryta;
}
returnera false;
}
privata void onUp() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, "~", "U");
}
privata void onLeft() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', "L");
}
privata void onRight() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', "R");
}
privata void onDown() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, "~", "D");
}
privata void onLeftClick() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', 'Z');
}
privata void onRightClick() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', "X");
}
privata void onPlus() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', "P");
}
privata void onMinus() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', "M");
}
privata void onSend (String str) {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ^', str);
}
privata void onDelete() {
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ''', 'B');
}
}
===============================
Main.XML
<? XML-version = "1.0" encoding = "utf-8"? >
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android: orientering = "vertikala"
Android: layout_width = "fill_parent" android: layout_height = "fill_parent" >
< LinearLayout android: layout_width = "400 pixlar" android: layout_height = "100px" android: layout_gravity = "center_horizontal"
Android: layout_marginTop = "20px" >
< knappen android: id = "
Android: text = "android: textstorlek ="32px"
Android: layout_width = "200px" android: layout_height = "100px" >< / knapp >
< knappen android: id = "
Android: text = "android: textstorlek ="32px"
Android: layout_width = "200px" android: layout_height = "100px" >< / knapp >
< / LinearLayout >
< LinearLayout android: layout_width = "200px" android: layout_height = "100px" android: layout_gravity = "center_horizontal"
Android: layout_marginTop = "20px" >
< knappen android: id = "
Android: text = "android: textstorlek ="48px"
Android: layout_width = "100px" android: layout_height = "100px" >< / knapp >
< knappen android: id = "
Android: text = "android: textstorlek ="48px"
Android: layout_width = "100px" android: layout_height = "100px" >< / knapp >
< / LinearLayout >
< LinearLayout android: layout_width = "450px" android: layout_height = "100px" android: layout_gravity = "center_horizontal"
Android: layout_marginTop = "20px" >
< EditText android: id = "android: textstorlek ="32px"
Android: layout_width = "fill_parent" android: layout_height = "100px" / >
< / LinearLayout >
< / LinearLayout >
===============================
Strings.XML
<? XML-version = "1.0" encoding = "utf-8"? >
< resurser >
< string namn = "programnamn" > MyRemote < / sträng >
< string namn = "clickLeft" > vänster klicka < / sträng >
< string namn = "clickRight" > högerklicka på < / sträng >
< string namn = "plus" > + < / sträng >
< string namn = "minus" > – < / sträng >
< string namn = "Skicka" > Skicka < / sträng >
< / resurser >
===============================
Jag skulle vilja säga några ord om flera funktioner längst ner på "MyRemote.java". De kallar samma metod med liknande parametrar:
Amarino.sendDataToArduino (detta, DEVICE_ADDRESS, ' ~', 'Z');
Denna metod gör det faktiska commucation med den BlueSMiRF wired till Arduino. Det vet vad enheten att skicka det till variabeln DEVICE_ADDRESS, som är en unik identifierare för BlueSMiRF. Ganska rakt fram. Men nästa att parametrar kan behöva lite mer förklaring, den ~ och Z. Den 3: e parametern (~) berättar bearbetning skissen, som vi ska skriva i nästa steg, vilket läge vi är i:
~ = musrörelse, mus-klicka och musens känslighet
^ = tangentbordsinmatning
' = Backsteg
Jag valde de slumpmässiga tecken purposefully för ett par skäl. Främst, behövde jag några reserverade tecken betecknar "läge" så jag valde de tecken som jag skulle aldrig använda medan du kör detta projekt. Detta kan verka förvirrande, men förhoppningsvis detta kommer att klara det upp: den fjärde parametern ("Z" i ovanstående kodutdrag) kan göra en sak om skicka det med en ~ eller det kan göra något helt annat om jag skickar det med en ^. Detta växer möjligheterna exponentiellt.
Observera användningen av dessa tecken på nästa steg, våra Processing skiss.