Sterowanie diodami LED. Połączenie ArduinoUno, Androida i modułu HC-05. Część 2

 

Lekcja 2. Piszemy oprogramowanie dla Androida

Krok 1.
Naszą przygodę proponuje zacząć od instalacji Android Studio.
Ze strony https://developer.android.com/studio/index.html

Po instalacji przechodzimy do stworzenia nowego projektu uruchamiając program ANDROID STUDIO.

Krok 2.
Tworzenie początkowe naszej aplikacji.

 

Opis okna nr.1

Application Name: Nazwa naszej aplikacji – Możemy nazwać ją jak chcemy np. Ledowo
Company Domain: Nazwa domeny „naszej firmy” – to pozostawiamy bez zmian.

Project Location: lokalizacja naszego projektu – pozostawiamy bez zmian.

Naciskamy przycisk „Next” i przechodzimy do kolejnego okienka:

Opis okna nr.2
Tutaj wybieramy na jaką platformę będziemy tworzyć nasz program docelowo wybieramy

Phone and Tablet a następnie Minimum SDK, jako API 17 ( android 4.2).
( można wybrać inne API, moim założeniem jest aby aplikacja działała nawet na starszych platformach)

Naciskamy NEXT
Wybieramy Empty Activity i naciskamy NEXT

W tym oknie w miejscu:
Activity Name: wpisujemy nazwę rdzenia naszej aplikacji, miejsca gdzie będziemy pisać pierwszą część naszego programu. Najważniejsze jest, aby zaznaczona była opcja Generate Layout File. Która to z kolei utworzy nam layout – wygląd początkowy naszej aplikacji. Po wszystkim naciskamy Finish.

Krok 3.
Zaczniemy od wyglądu naszej aplikacji, czyli layoutu. Korzystajac z „drzewa” po lewej stronie interfejsu użytkownika wybieramy strzałkami res› layout› activity_lista_urzadzen i naciskamy dwukrotnie, aby otworzyłą się nam karta po prawej stronie. ( patrz rys. 5)

Naciskamy na Hello World i usuwamy. Z listy po lewej stronie z sekcji WIDGET wybieramy Large Text View. Następnie dodajemy ListView i Button. Kiedy wszystko już mamy dodane musimy nadać im nazwy, z których będziemy korzystać w programie. Na dole tego okna mamy Karty Design oraz Text. Aby uprościć procedurę kopiujemy listing nr 1 poniżej i wklejamy w miejsce naszego:

Listing activity_lista_urzadzen.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.dominik.ledowo.ListaUrzadzen">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Parowanie"
android:id="@+id/przycisk1"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="LISTA URZĄDZEŃ BLUETOOTH"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignEnd="@+id/przycisk1" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lista"
android:layout_below="@+id/textView"
android:layout_alignParentStart="true"
android:layout_above="@+id/przycisk1" />
</RelativeLayout>
activity_listaurzadzen.xml

Następnie po prawej stronie na naszym drzewku klikamy prawym przyciskiem myszy na layout. Wybieramy New > Layout resource file i wpisujemy kontrola, po czym naciskamy enter. W ten sposob utworzyliśmy wyglad dla naszego drugiego okna, w którym będziemy sterować naszymi ledami za pomocą przycisków. Analogicznie, klikamy dwukrotnie na napisie kontrola.xml i przechodzimy w zakładkę TEXT oraz wklejamy listing drugi

Listing kontrola.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 1 WŁĄCZ"
android:id="@+id/btn1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 1 WYŁĄCZ"
android:id="@+id/btn2"
android:layout_row="0"
android:layout_column="1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 2 WŁĄCZ"
android:id="@+id/btn3"
android:layout_row="1"
android:layout_column="0" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 2 WYŁĄCZ"
android:id="@+id/btn4"
android:layout_row="1"
android:layout_column="1" />
<Button
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text="FADE"
android:id="@+id/btn5"
android:layout_row="2"
android:layout_column="0" />
<Button
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text="POLICJA"
android:id="@+id/btn6"
android:layout_row="2"
android:layout_column="1" />
<ToggleButton
android:layout_width="108dp"
android:layout_height="wrap_content"
android:text="Włącz"
android:id="@+id/btnWL"
android:layout_row="3"
android:layout_column="0"
android:checked="false" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rozłącz"
android:id="@+id/btn7"
android:layout_row="25"
android:layout_column="0" />
</GridLayout>
kontrola.xml

Krok 4.
Po ustawieniu wyglądu naszego programu czas na napisanie kilku linijek kodu. Na naszym drzewku przechodzimy java>com.example(naszadomena).ledowo i wybieramy Lista_urzadzen.
Naszym oczom ukaże się trzon naszego programu.

Na samej górze musimy zaimportować rzeczy, które zostaną wykorzystane w naszym programie :

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import java.util.Set;
import java.util.ArrayList;
import android.widget.Toast;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.TextView;
import android.content.Intent;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;

I tu zaczynamy nasz program właściwy:

a) deklaracja rzeczy z których będziemy korzystać:

public class ListaUrzadzen extends AppCompatActivity {

//Deklarujemy rzeczy, z których będziemy korzystać w programie
Button Parowanie;
ListView ListaUrz;

//Deklarujemy moduł BT
private BluetoothAdapter mojBT = null;
private Set<BluetoothDevice> sparowaneUrzadzenia;
public static String EXTRA_ADDRESS = "device_address";

b) instrukcja co ma zrobić na początku nasz program – po Override ma utworzyć wygląd:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_urzadzen);

c) wczytanie i przypisanie naszych widgetów ( przyciski, text i listę urzadzen):

//Wczytanie widgetów z wyglądu i przypisanie
Parowanie = (Button)findViewById(R.id.przycisk1);
ListaUrz = (ListView)findViewById(R.id.lista);
//Sprawdz czy urządzenie ma moduł BT
mojBT = BluetoothAdapter.getDefaultAdapter();
d) instrukcje sprawdzenia modułu BT oraz próba sparowania z naszym HC-05:

if(mojBT == null) //Jezeli nie ma to:
{
//Pokaż informacje, że urzadzenie nie posiada modułu BT
Toast.makeText(getApplicationContext(), "Nie widzi urządzenia BT", Toast.LENGTH_LONG).show();
// i zakończ aplikację
finish();
}
else if(!mojBT.isEnabled()) // Jezeli ma
{
//Zapytaj użytkownia o włączenie modułu BT
Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnBTon,1);
}
// Parowanie urzadzen
Parowanie.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
ListaUrzadzenSparowanych(); // Odwolaj sie do instrukcji ListaUrzadzenSparowanych
}
});
}

d) Jeśli wszystko pójdzie ok ma wyświetlić nasze urządzenie na liście:

// Wyswietlenie urzadzen na liscie
private void ListaUrzadzenSparowanych()
{
sparowaneUrzadzenia = mojBT.getBondedDevices(); // Pokazuje wszystkie sparowane urzadzenia BT
ArrayList list = new ArrayList();
if (sparowaneUrzadzenia.size()>0)
{
for(BluetoothDevice bt : sparowaneUrzadzenia)
{
list.add(bt.getName() + "\n" + bt.getAddress()); //Nazwa i adres MAC urządzenia
}
}
else
{
Toast.makeText(getApplicationContext(), "Nieznaleziono sparowanych urzadzeń", Toast.LENGTH_LONG).show();
}
final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
ListaUrz.setAdapter(adapter);
ListaUrz.setOnItemClickListener(myListClickListener); //Wywołanie metody po nacisnieciu elementu na liście urzadzeń
}

e) co ma zrobić, jeżeli użytkownik naciśnie na listę

private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener()
{
public void onItemClick (AdapterView<?> av, View v, int arg2, long arg3)
{
// Pokaż MAC adres urządzenia z modułem BT
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
// Otworz nowe okno - KontrolaLED -> do kontrolowania urzadzen przez BT ( w tym wypadku LED)
Intent i = new Intent(ListaUrzadzen.this, KontrolaLED.class);
i.putExtra(EXTRA_ADDRESS, address); //Przekazanie informacji z adresem MAC modulu BT do okna KontrolaLED
startActivity(i);//Rozpoczyna dzialanie okna Kontrola LED
}
};
}

Krok 5.
Nasza aplikacja jest w stanie się już połączyć z BT i powinna wywalić błąd, ponieważ ostatnia instrukcja odwołuje się do programu kontroli którego jeszcze nie stworzyliśmy. A zatem w miejscu gdzie mamy nasza ListaUrzadzen.java musimy dodać nową klasę KontrolaLED.java.
Dodajemy ją analogicznie jak layout z tą zmianą że robimy to na pliku ListaUrzadzen prawym przyciskiem myszy – New > Java class i podajemy nazwę KontrolaLED i naciskamy ENTER.

Wchodzimy do tego pliku i tak jak wyżej importujemy, deklarujemy i dajemy instrukcje do wykonania:

a)impotujemy:

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask;
import android.widget.ToggleButton;
import java.io.IOException;
import java.util.UUID;

b) deklarujemy z czego będziemy korzystać

public class KontrolaLED extends ActionBarActivity {
Button btnOn, btnOff, btnDis,btnOn2, btnOff2,btnFade,btnPolicja;
ToggleButton btnWla;
String address = null;
private ProgressDialog progress;
BluetoothAdapter myBluetooth = null;
BluetoothSocket btSocket = null;
private boolean isBtConnected = false;
//SPP UUID. Look for it
static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

c) Tworzymy nasz wygląd w oparciu o kontrola.xml

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.kontrola);

d) otrzymnujemy adres naszego BT z poprzedniej części programu ( aby nadal wiedziałz czym jest połączony)

Intent newint = getIntent();
address = newint.getStringExtra(ListaUrzadzen.EXTRA_ADDRESS); //Otrzymanie adresu z Listy urzadzeń

e) wczytanie i przypisanie naszych widgetów ( przyciski, text i listę urzadzen):

//Wywołanie przycisków
btnOn = (Button)findViewById(R.id.btn1);
btnOff = (Button)findViewById(R.id.btn2);
btnOn2 = (Button)findViewById(R.id.btn3);
btnOff2 = (Button)findViewById(R.id.btn4);
btnFade = (Button)findViewById(R.id.btn5);
btnPolicja =(Button)findViewById(R.id.btn6);
btnDis = (Button)findViewById(R.id.btn7);
btnWla = (ToggleButton)findViewById(R.id.btnWL);
new ConnectBT().execute(); //Wywołanie klasy od połączenia

f) Instrukcje do wykonania po nacisnieciu przycisku:

//komendy które wysyłamy do BT
btnOn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
turnOnLed(); //Włączanie LED
}
});
btnOff.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
turnOffLed(); //Wyłączanie LED
}
});

g) Instrukcje zrozumiałem dla naszego arduino co ma zrobić po naciśnięciu danego przycisku
na przykładzie turnOnLed() – Program dostaje sygnał o wciśnięciu następnie wysyła do BT zapytanie o literkę a w arduino – co dla nas oznacza zaświecenia pierwszej diody led na pinie 10.

private void turnOnLed()
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("a".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}

h) a na samym końcu nasze połączenie z BT :

private class ConnectBT extends AsyncTask<Void, Void, Void> // wątek UI
{
private boolean ConnectSuccess = true; //kiedy już jest prawie polączony
@Override
protected void onPreExecute()
{
progress = ProgressDialog.show(KontrolaLED.this, "Łączenie...", "Proszę czekać!!!"); //pokaż motyw ładowania
}
@Override
protected Void doInBackground(Void... devices) //kiedy pokazuje łądowanie, w tle łączy się nasze BT
{
try
{
if (btSocket == null || !isBtConnected)
{
myBluetooth = BluetoothAdapter.getDefaultAdapter();// polacz z modulem BT
BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//Sprawdzenie adresu BT
btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//Tworzenie polaczenia po sprawdzeniu adresu UUID
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
btSocket.connect();//zaczyna polaczenie
}
}
catch (IOException e)
{
ConnectSuccess = false;//jezeli się nie połaczy wyświetli błąd
}
return null;
}
@Override
protected void onPostExecute(Void result) //sprawdza czy napewno jest polaczony
{
super.onPostExecute(result);
if (!ConnectSuccess)
{
msg("Błąd połączenia, spróbuj jeszcze raz...");
finish();
}
else
{
msg("Połączono.");
isBtConnected = true;
}
progress.dismiss();
}
}
}

Jeżeli wszystko napiszemy/ skopiujemy poprawnie mozemy nacisnac przycisk play na samej górze i odpalić nasz program na maszynie wirtualnej, urzadzeniu w sesji ADB lub Make app i skopiować go na nasze urządzenie z androidem i sprawdzić działanie.
Listingi po kolei w całości

Listing activity_lista_urzadzen.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.dominik.ledowo.ListaUrzadzen">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Parowanie"
android:id="@+id/przycisk1"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="LISTA URZĄDZEŃ BLUETOOTH"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignEnd="@+id/przycisk1" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/lista"
android:layout_below="@+id/textView"
android:layout_alignParentStart="true"
android:layout_above="@+id/przycisk1" />
</RelativeLayout>
activity_lista_urzadzen

Listing kontrola.xml

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 1 WŁĄCZ"
android:id="@+id/btn1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 1 WYŁĄCZ"
android:id="@+id/btn2"
android:layout_row="0"
android:layout_column="1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 2 WŁĄCZ"
android:id="@+id/btn3"
android:layout_row="1"
android:layout_column="0" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LED 2 WYŁĄCZ"
android:id="@+id/btn4"
android:layout_row="1"
android:layout_column="1" />
<Button
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text="FADE"
android:id="@+id/btn5"
android:layout_row="2"
android:layout_column="0" />
<Button
android:layout_width="110dp"
android:layout_height="wrap_content"
android:text="POLICJA"
android:id="@+id/btn6"
android:layout_row="2"
android:layout_column="1" />
<ToggleButton
android:layout_width="108dp"
android:layout_height="wrap_content"
android:text="Włącz"
android:id="@+id/btnWL"
android:layout_row="3"
android:layout_column="0"
android:checked="false" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rozłącz"
android:id="@+id/btn7"
android:layout_row="25"
android:layout_column="0" />
</GridLayout>
kontrola.xml

Listing ListaUrzadzen.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import java.util.Set;
import java.util.ArrayList;
import android.widget.Toast;
import android.widget.ArrayAdapter;
import android.widget.AdapterView;
import android.widget.TextView;
import android.content.Intent;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
public class ListaUrzadzen extends AppCompatActivity {
//Deklarujemy rzeczy, z których będziemy korzystać w programie
Button Parowanie;
ListView ListaUrz;
//Deklarujemy moduł BT
private BluetoothAdapter mojBT = null;
private Set<BluetoothDevice> sparowaneUrzadzenia;
public static String EXTRA_ADDRESS = "device_address";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_urzadzen);
//Wczytanie widgetów z wyglądu i przypisanie
Parowanie = (Button)findViewById(R.id.przycisk1);
ListaUrz = (ListView)findViewById(R.id.lista);
//Sprawdz czy urządzenie ma moduł BT
mojBT = BluetoothAdapter.getDefaultAdapter();
if(mojBT == null) //Jezeli nie ma to:
{
//Pokaż informacje, że urzadzenie nie posiada modułu BT
Toast.makeText(getApplicationContext(), "Nie widzi urządzenia BT", Toast.LENGTH_LONG).show();
// i zakończ aplikację
finish();
}
else if(!mojBT.isEnabled()) // Jezeli ma
{
//Zapytaj użytkownia o włączenie modułu BT
Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnBTon,1);
}
// Parowanie urzadzen
Parowanie.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
ListaUrzadzenSparowanych(); // Odwolaj sie do instrukcji ListaUrzadzenSparowanych
}
});
}
// Wyswietlenie urzadzen na liscie
private void ListaUrzadzenSparowanych()
{
sparowaneUrzadzenia = mojBT.getBondedDevices(); // Pokazuje wszystkie sparowane urzadzenia BT
ArrayList list = new ArrayList();
if (sparowaneUrzadzenia.size()>0)
{
for(BluetoothDevice bt : sparowaneUrzadzenia)
{
list.add(bt.getName() + "\n" + bt.getAddress()); //Nsazwa i adres MAC urzadzenia
}
}
else
{
Toast.makeText(getApplicationContext(), "Nieznaleziono sparowanych urzadzeń", Toast.LENGTH_LONG).show();
}
final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
ListaUrz.setAdapter(adapter);
ListaUrz.setOnItemClickListener(myListClickListener); //Wywołanie metody po nacisnieciu elementu na liście urzadzeń
}
private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener()
{
public void onItemClick (AdapterView<?> av, View v, int arg2, long arg3)
{
// Pokaż MAC adres urządzenia z modułem BT
String info = ((TextView) v).getText().toString();
String address = info.substring(info.length() - 17);
// Otworz nowe okno - KontrolaLED -> do kontrolowania urzadzen przez BT ( w tym wypadku LED)
Intent i = new Intent(ListaUrzadzen.this, KontrolaLED.class);
i.putExtra(EXTRA_ADDRESS, address); //Przekazanie informacji z adresem MAC modulu BT do okna KontrolaLED
startActivity(i);//Rozpoczyna dzialanie okna Kontrola LED
}
};
}
ListaUrzadzen.java

Listing KontrolaLED.java

package com.example.dominik.ledowo;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask;
import android.widget.ToggleButton;
import java.io.IOException;
import java.util.UUID;
public class KontrolaLED extends ActionBarActivity {
Button btnOn, btnOff, btnDis,btnOn2, btnOff2,btnFade,btnPolicja;
ToggleButton btnWla;
String address = null;
private ProgressDialog progress;
BluetoothAdapter myBluetooth = null;
BluetoothSocket btSocket = null;
private boolean isBtConnected = false;
//SPP UUID. Look for it
static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//widok wygladu KontrolaLED
setContentView(R.layout.kontrola);
Intent newint = getIntent();
address = newint.getStringExtra(ListaUrzadzen.EXTRA_ADDRESS); //Otrzymanie adresu z Listy urzadzeń
//Wywołanie przycisków
btnOn = (Button)findViewById(R.id.btn1);
btnOff = (Button)findViewById(R.id.btn2);
btnOn2 = (Button)findViewById(R.id.btn3);
btnOff2 = (Button)findViewById(R.id.btn4);
btnFade = (Button)findViewById(R.id.btn5);
btnPolicja =(Button)findViewById(R.id.btn6);
btnDis = (Button)findViewById(R.id.btn7);
btnWla = (ToggleButton)findViewById(R.id.btnWL);
new ConnectBT().execute(); //Wywołanie klasy od połączenia
ToggleButton toggle = (ToggleButton) findViewById(R.id.btnWL);
toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
turnOnLed();
} else {
turnOffLed();
}
}
});
//komendy które wysyłamy do BT
btnOn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
turnOnLed(); //Włączanie LED
}
});
btnOff.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
turnOffLed(); //Wyłączanie LED
}
});
btnOn2.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
turnOnLed2(); //włączanie LED
}
});
btnOff2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
turnOffLed2(); //Wyłączanie LED
}
});
btnOff2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
turnOffLed2(); //Wyłączanie LED
}
});
btnFade.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
fade(); // Przenikanie
}
});
btnPolicja.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
bagiety(); // sygnal
}
});
btnDis.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Disconnect(); //Rozłączenie
}
});
}
private void Disconnect()
{
if (btSocket!=null) //Jeżeli port jest zajęty
{
try
{
btSocket.close(); //zakmnij połączenie
}
catch (IOException e)
{ msg("Błąd");}
}
finish(); //Wróć do 1 okna - Lista Urzadzeń
}
private void turnOnLed()
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("a".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}
private void turnOffLed() // tu wklepujemy instrukcje jakie beda wywoływane w polaczeniu z arduino
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("b".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}
private void turnOnLed2()
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("c".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}
private void turnOffLed2()
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("d".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}
private void fade()
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("f".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}
private void bagiety()
{
if (btSocket!=null)
{
try
{
btSocket.getOutputStream().write("x".toString().getBytes());
}
catch (IOException e)
{
msg("Błąd");
}
}
}
private void msg(String s)
{
Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement

return super.onOptionsItemSelected(item);
}
private class ConnectBT extends AsyncTask<Void, Void, Void> // wątek UI
{
private boolean ConnectSuccess = true; //kiedy już jest prawie polączony
@Override
protected void onPreExecute()
{
progress = ProgressDialog.show(KontrolaLED.this, "Łączenie...", "Proszę czekać!!!"); //pokaż motyw ładowania
}
@Override
protected Void doInBackground(Void... devices) //kiedy pokazuje łądowanie, w tle łączy się nasze BT
{
try
{
if (btSocket == null || !isBtConnected)
{
myBluetooth = BluetoothAdapter.getDefaultAdapter();// polacz z modulem BT
BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//Sprawdzenie adresu BT
btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//Tworzenie polaczenia po sprawdzeniu adresu UUID
BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
btSocket.connect();//zaczyna polaczenie
}
}
catch (IOException e)
{
ConnectSuccess = false;//jezeli się nie połaczy wyświetli błąd
}
return null;
}
@Override
protected void onPostExecute(Void result) //sprawdza czy napewno jest polaczony
{
super.onPostExecute(result);
if (!ConnectSuccess)
{
msg("Błąd połączenia, spróbuj jeszcze raz...");
finish();
}
else
{
msg("Połączono.");
isBtConnected = true;
}
progress.dismiss();
}
}
}
KontrolaLED.java

I należy jeszcze dodać w pliku manifestu ( nasze drzewko) App>manifests> AndroidManifest.xml linijki o dostępie programu do modulu BT na naszym urzadzeniu:

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>

Listing AndroidManifest.xml

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ListaUrzadzen"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".KontrolaLED"
android:label="Panel kontrolny" >
</activity>
</application>
AndroidManifest.xml

 

Dla Learnduino Dominik Kulesza

 

Jeżeli masz trudności napisz w komentarzu lub zapraszam na FB na nasz fanpage. Learduino.

Dominik Kulesza

Create Account



Log In Your Account