Ten post chciałbym poświęcić na przygotowanie aplikacji po bluetooth służącej do uruchamiania przekaźników na urządzeniu. Komunikacja będzie odbywać się z układem HC-05, który będzie podłączony do płytki Arduino.
Komunikacja odbywa się poprzez wspomniany układ HC-05. Zapewnia on dwustronną komunikację z urządzeniem. Jego zaletą jest protokół UART jaki jest wykorzystany do przesyłania danych z mikrokontrolerem.
W wersji V1.0 do poprawy zostało mi odbieranie danych, które puki co działa jeszcze słabo, dane co prawda są odbierane, natomiast muszę odpowiednio przygotować funkcję obrabiającą odebraną ramkę. Drugim elementem do dodania jest kod dla ustawień czasowych dla Arduino. Dane odnośnie czasów załączania oraz wyłączania poszczególnych przekaźników zostały już zapisane w pamięci EEPROM, natomiast muszę dołożyć jeszcze część kodu odpowiadająca za ich ustawianie.
Całą aplikacja prezentuje się następująco:
Poniżej przedstawię plik XAML z przygotowanym wyglądem graficznym dla aplikacji na Androida:
Cała aplikacja składa się z dwóch sekcji. Jedna pozwala na ustawienie czasu załączania na poszczególnych przekaźnikach. Druga natomiast pozwala na włączenie lub wyłączenie określonego wyprowadzenia. W celu sprawdzenia aktualnych ustawień należy uruchomić przycisk odczytu informacji. Wyświetli on w polach na ekranie aktualne stany wszystkich ustawień.
Proste włączanie oraz wyłączanie odbywa się przez kliknięcie na przycisk. Natomiast ustawienie czasu jest wykonywane dla przekaźnika którego checkbox zostanie zaznaczony. Pod przyciskiem Connect znajduje się przycisk Read Data From Device.
W celu stworzenia całej aplikacji należy przekopiować pliki MainActivity oraz Main.axml.
W tej części posta przedstawię program na Androida odpowiedzialny za ustawianie odpowiednich przekaźników oraz wysyłania czasu jego załączenia do urządzenia.
Funkcja uruchamiana w głównej pętli która odpowiada za nawiązanie połączeniu Bluetooth:
Najpierw tworzony jest nowy adapter Bluetooth. Dalej sprawdzane jest czy układ jest podłączony. W przypadku błędu zwracana jest informacja informująca o problemach z połączeniem.
Aby utworzyć połączenie aplikacji z układem należy kliknąć przycisk Connect, który wywoła następującą funkcje:
Najpierw sprawdzany jest czy przycisk jest kliknięty to wywoływana jest funkcja wykonująca połączenie. Gdy przycisk zostanie ponownie kliknięty to połączenie z układem Bluetooth zostanie przerwane.
Główna funkcja wykonująca połączenie wygląda następująco:
Najpierw rozpoczyna się wykonanie połączenia z układem o podanym adresie. Następnie wyłączamy widoczność urządzenia w sieci. Następnie wykonywane jest połączenie z podanym numerm UUID.
W przypadku błędu następuje próba zamknięcia połączenia.
Cztery przyciski odpowiadają za osobne włączenia oraz wyłączanie przekaźników. Po kliknięciu wysyłana jest odpowiednia ramka danych do układu. Przykładowy kod do uruchomienia przekaźnika pierwszego:
Powyżej w zależności od aktualnego tekstu na ekranie wysyłana jest komenda uruchamiająca bądź wyłączająca przekaźnik.
W celu przesłania danych do układu Bluetooth wykorzystuje się następującą funkcje:
Funkcja powyżej otwiera strumień. W przypadku błędu zwracana jest kod błędu. Następnie wiadomość do przesłania zapisywana jest do zmiennej message, która jest w formacie Java.Lang.String. Dalej wartość jest konwertowana na tablice bajtów, która zostaje wysłana do modułu HC-05.
Do odbierania danych wykorzystywany będzie układ HC-05 podłączony do Arduino Uno. Tutaj obsługiwana jest przesyłana przez układ ramka danych.
W celu komunikacji z układem wykorzystuje jeden systemowy UART oraz jeden sprzętowy, który służy do wyświetlenia odebranych danych. Dodatkowo do zapisu stanu wykorzystywany jest wbudowany EEPROM.
Dane w pamięci zapisane są w następujących miejscach.
Konfiguracja pinów wygląda następująco:
Funkcja odpowiedzialna za uruchomienie poszczególnych komponentów:
Powyżej ustawiane są przekaźniki oraz uruchamiane dwa UARTy. Jeden do komunikacji z układem Bluetooth, drugi natomiast do wyświetlania danych na ekranie.
Pętla:
W pętli głównej następuje odbieranie danych od UART'a oraz sprawdzanie otrzymanej ramki.
Pozostałe funkcje będą znajdować się plikach od projektu.
Cały projekt można pobrać z dysku Google pod tym linkiem w folderze Csharp - Xamarin.
[Źrodlo: https://en.wikipedia.org/wiki/Xamarin]
Komunikacja odbywa się poprzez wspomniany układ HC-05. Zapewnia on dwustronną komunikację z urządzeniem. Jego zaletą jest protokół UART jaki jest wykorzystany do przesyłania danych z mikrokontrolerem.
W wersji V1.0 do poprawy zostało mi odbieranie danych, które puki co działa jeszcze słabo, dane co prawda są odbierane, natomiast muszę odpowiednio przygotować funkcję obrabiającą odebraną ramkę. Drugim elementem do dodania jest kod dla ustawień czasowych dla Arduino. Dane odnośnie czasów załączania oraz wyłączania poszczególnych przekaźników zostały już zapisane w pamięci EEPROM, natomiast muszę dołożyć jeszcze część kodu odpowiadająca za ich ustawianie.
Wygląd aplikacji XAML:
Całą aplikacja prezentuje się następująco:
Poniżej przedstawię plik XAML z przygotowanym wyglądem graficznym dla aplikacji na Androida:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#FFB404">
- <Space
- android:layout_width="match_parent"
- android:layout_height="10dp"
- android:id="@+id/space1" />
- <TextView
- android:text="1DOF"
- android:layout_width="125dp"
- android:layout_height="match_parent"
- android:id="@+id/textView1" />
- <ToggleButton
- android:text="Connect"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/toggleButton1"
- android:layout_marginLeft="50dp"
- android:layout_marginRight="50dp"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:textOn="Connected"
- android:textOff="Connect"
- android:paddingBottom="10dp"
- android:paddingEnd="10dp"
- android:paddingLeft="10dp"
- android:paddingRight="10dp"
- android:paddingStart="10dp"
- android:paddingTop="10dp" />
- <Space
- android:layout_width="match_parent"
- android:layout_height="10dp"
- android:id="@+id/space2" />
- <ToggleButton
- android:text="READ DATA FROM DEVICE"
- android:id="@+id/toggleButton2"
- android:layout_marginLeft="50dp"
- android:layout_marginRight="50dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:textOff="READ DATA FROM DEVICE"
- android:textOn="WRITE DATA TO DEVICE" />
- <Space
- android:layout_width="match_parent"
- android:layout_height="10dp"
- android:id="@+id/space3" />
- <TableLayout
- android:minWidth="25px"
- android:minHeight="25px"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:stretchColumns="*"
- android:id="@+id/tableLayout1">
- <TableRow
- android:id="@+id/tableRow1"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:orientation="vertical"
- android:layout_marginTop="2dp"
- android:weightSum="2"
- android:layout_marginRight="2dp">
- <CheckBox
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="Relay 1"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="0"
- android:id="@+id/checkBox1"
- android:textAlignment="center" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="1"
- android:id="@+id/editText1"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp"
- android:textAlignment="center"
- android:layout_marginTop="1.5dp" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="13:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="2"
- android:id="@+id/editText2"
- android:textAlignment="center" />
- </TableRow>
- <TableRow
- android:id="@+id/tableRow2"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:orientation="vertical"
- android:layout_marginTop="2dp"
- android:weightSum="2">
- <CheckBox
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="Relay 2"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="0"
- android:id="@+id/checkBox2" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="1"
- android:id="@+id/editText3"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="2"
- android:id="@+id/editText4" />
- </TableRow>
- <TableRow
- android:id="@+id/tableRow3"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:orientation="vertical"
- android:layout_marginTop="2dp"
- android:weightSum="2">
- <CheckBox
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="Relay 3"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="0"
- android:id="@+id/checkBox3" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="1"
- android:id="@+id/editText5"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="2"
- android:id="@+id/editText6" />
- </TableRow>
- <TableRow
- android:id="@+id/tableRow4"
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:orientation="vertical"
- android:layout_marginTop="2dp"
- android:weightSum="2">
- <CheckBox
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="Relay 4"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="0"
- android:id="@+id/checkBox4" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="1"
- android:id="@+id/editText7"
- android:layout_marginLeft="2dp"
- android:layout_marginRight="2dp" />
- <EditText
- android:layout_width="0dp"
- android:layout_height="40dp"
- android:layout_marginTop="1.5dp"
- android:layout_weight="0"
- android:gravity="center"
- android:padding="5dp"
- android:text="12:00"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:layout_column="2"
- android:id="@+id/editText8" />
- </TableRow>
- </TableLayout>
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/linearLayout1">
- <Space
- android:layout_width="match_parent"
- android:layout_height="2dp"
- android:id="@+id/space3" />
- <Space
- android:layout_width="match_parent"
- android:layout_height="2dp"
- android:id="@+id/space3" />
- <ToggleButton
- android:text="Relay1 On"
- android:id="@+id/toggleButton3"
- android:layout_marginLeft="50dp"
- android:layout_marginRight="50dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:textOff="RELAY1 ON"
- android:textOn="RELAY1 OFF" />
- <Space
- android:layout_width="match_parent"
- android:layout_height="2dp"
- android:id="@+id/space3" />
- <ToggleButton
- android:text="Relay2 On"
- android:id="@+id/toggleButton4"
- android:layout_marginLeft="50dp"
- android:layout_marginRight="50dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:textOff="RELAY2 ON"
- android:textOn="RELAY2 OFF" />
- <Space
- android:layout_width="match_parent"
- android:layout_height="2dp"
- android:id="@+id/space3" />
- <ToggleButton
- android:text="Relay3 On"
- android:id="@+id/toggleButton5"
- android:layout_marginLeft="50dp"
- android:layout_marginRight="50dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:textOff="RELAY3 ON"
- android:textOn="RELAY3 OFF" />
- <Space
- android:layout_width="match_parent"
- android:layout_height="2dp"
- android:id="@+id/space3" />
- <ToggleButton
- android:text="Relay4 On"
- android:id="@+id/toggleButton6"
- android:layout_marginLeft="50dp"
- android:layout_marginRight="50dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFF"
- android:background="#ed8404"
- android:textOff="RELAY4 ON"
- android:textOn="RELAY4 OFF" />
- </LinearLayout>
- </LinearLayout>
Cała aplikacja składa się z dwóch sekcji. Jedna pozwala na ustawienie czasu załączania na poszczególnych przekaźnikach. Druga natomiast pozwala na włączenie lub wyłączenie określonego wyprowadzenia. W celu sprawdzenia aktualnych ustawień należy uruchomić przycisk odczytu informacji. Wyświetli on w polach na ekranie aktualne stany wszystkich ustawień.
Proste włączanie oraz wyłączanie odbywa się przez kliknięcie na przycisk. Natomiast ustawienie czasu jest wykonywane dla przekaźnika którego checkbox zostanie zaznaczony. Pod przyciskiem Connect znajduje się przycisk Read Data From Device.
W celu stworzenia całej aplikacji należy przekopiować pliki MainActivity oraz Main.axml.
Program Xamarin:
W tej części posta przedstawię program na Androida odpowiedzialny za ustawianie odpowiednich przekaźników oraz wysyłania czasu jego załączenia do urządzenia.
Funkcja uruchamiana w głównej pętli która odpowiada za nawiązanie połączeniu Bluetooth:
- /* Bluetooth veryfication, check if it enable */
- private void connectToBtDevice()
- {
- /* Write bluetooth device with what there will be communication */
- mBluetoothAdapter = BluetoothAdapter.DefaultAdapter;
- //Check if device is enabled
- if (!mBluetoothAdapter.Enable())
- {
- Toast.MakeText(this, "OK: Bluetooth Disconnected", ToastLength.Short).Show();
- }
- else
- {
- Toast.MakeText(this, "OK: Bluetooth Connected", ToastLength.Short).Show();
- }
- //check if data was write into device
- if (mBluetoothAdapter == null)
- {
- Toast.MakeText(this,
- "ERROR: Bluetooth don't exist or it is busy", ToastLength.Short)
- .Show();
- }
- }
Najpierw tworzony jest nowy adapter Bluetooth. Dalej sprawdzane jest czy układ jest podłączony. W przypadku błędu zwracana jest informacja informująca o problemach z połączeniem.
Aby utworzyć połączenie aplikacji z układem należy kliknąć przycisk Connect, który wywoła następującą funkcje:
- /* Event for change btn for establish/disable connection */
- void TgConnect_HandleCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
- {
- if (e.IsChecked)
- {
- /* After btn connect inicialize is connect method */
- try
- {
- connectBlt();
- Toast.MakeText(this, "Device Connected", ToastLength.Short).Show();
- }
- catch (System.Exception ex)
- {
- Toast.MakeText(this, "Connect Error: " + ex, ToastLength.Short).Show();
- }
- }
- else
- {
- /* After disable btn clicked then disconnect */
- if (btSocket.IsConnected)
- {
- try
- {
- btSocket.Close();
- Toast.MakeText(this, "Connection Closed", ToastLength.Short).Show();
- }
- catch (System.Exception ex)
- {
- Toast.MakeText(this, "Close Error" + ex, ToastLength.Short).Show();
- }
- }
- }
- }
Najpierw sprawdzany jest czy przycisk jest kliknięty to wywoływana jest funkcja wykonująca połączenie. Gdy przycisk zostanie ponownie kliknięty to połączenie z układem Bluetooth zostanie przerwane.
Główna funkcja wykonująca połączenie wygląda następująco:
- public void connectBlt()
- {
- BluetoothDevice device = mBluetoothAdapter.GetRemoteDevice(BLT_ADDRESS); /* Start connection with HC-05 */
- /* Tell adapter that he is not visible */
- mBluetoothAdapter.CancelDiscovery();
- try
- {
- /* Initialize communication socket with device */
- btSocket = device.CreateRfcommSocketToServiceRecord(UUID_VAR);
- /* Socket Connect */
- btSocket.Connect();
- }
- catch (System.Exception e)
- {
- /* When error occure then close socket */
- try
- {
- btSocket.Close();
- }
- catch (System.Exception) { }
- }
- /* After establish connection with blt device we will call method that generate thread
- for receiving information */
- BeginListenForData();
- }
Najpierw rozpoczyna się wykonanie połączenia z układem o podanym adresie. Następnie wyłączamy widoczność urządzenia w sieci. Następnie wykonywane jest połączenie z podanym numerm UUID.
W przypadku błędu następuje próba zamknięcia połączenia.
Cztery przyciski odpowiadają za osobne włączenia oraz wyłączanie przekaźników. Po kliknięciu wysyłana jest odpowiednia ramka danych do układu. Przykładowy kod do uruchomienia przekaźnika pierwszego:
- void Relay1OnOffBtn_HandleCheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
- {
- if(relay1OnOffBtn.Text == "RELAY1 ON")
- {
- dataToSend = new Java.Lang.String("b" + "R1On" + "xx" + "\n");
- WriteData(dataToSend);
- }
- else if(relay1OnOffBtn.Text == "RELAY1 OFF")
- {
- dataToSend = new Java.Lang.String("b" + "R1Off" + "xx" + "\n");
- WriteData(dataToSend);
- }
- }
Powyżej w zależności od aktualnego tekstu na ekranie wysyłana jest komenda uruchamiająca bądź wyłączająca przekaźnik.
W celu przesłania danych do układu Bluetooth wykorzystuje się następującą funkcje:
- /* Method use for sending data to BLT device */
- private void WriteData(Java.Lang.String data)
- {
- /* Extract output stream */
- try
- {
- outStream = btSocket.OutputStream;
- }
- catch (System.Exception e)
- {
- Toast.MakeText(this, "Sending error: " + e.Message, ToastLength.Short).Show();
- }
- /* Create string to send */
- Java.Lang.String message = data;
- /* Convert it into bytes */
- byte[] msgBuffer = message.GetBytes();
- try
- {
- /* write the arrangement that we just generated in the buffer */
- outStream.Write(msgBuffer, 0, msgBuffer.Length);
- }
- catch (System.Exception e)
- {
- Toast.MakeText(this, "Sending error" + e.Message, ToastLength.Short).Show();
- }
- }
Funkcja powyżej otwiera strumień. W przypadku błędu zwracana jest kod błędu. Następnie wiadomość do przesłania zapisywana jest do zmiennej message, która jest w formacie Java.Lang.String. Dalej wartość jest konwertowana na tablice bajtów, która zostaje wysłana do modułu HC-05.
Program Arduino:
Do odbierania danych wykorzystywany będzie układ HC-05 podłączony do Arduino Uno. Tutaj obsługiwana jest przesyłana przez układ ramka danych.
W celu komunikacji z układem wykorzystuje jeden systemowy UART oraz jeden sprzętowy, który służy do wyświetlenia odebranych danych. Dodatkowo do zapisu stanu wykorzystywany jest wbudowany EEPROM.
Dane w pamięci zapisane są w następujących miejscach.
- #define EEPROM_R1_STATE 0
- #define EEPROM_R2_STATE 1
- #define EEPROM_R3_STATE 2
- #define EEPROM_R4_STATE 3
- #define EEPROM_R1_TIME_STATE 4
- #define EEPROM_R1_TIME_ON_H 5
- #define EEPROM_R1_TIME_ON_M 6
- #define EEPROM_R1_TIME_OFF_H 7
- #define EEPROM_R1_TIME_OFF_M 8
- #define EEPROM_R2_TIME_STATE 9
- #define EEPROM_R2_TIME_ON_H 10
- #define EEPROM_R2_TIME_ON_M 11
- #define EEPROM_R2_TIME_OFF_H 12
- #define EEPROM_R2_TIME_OFF_M 13
- #define EEPROM_R3_TIME_STATE 14
- #define EEPROM_R3_TIME_ON_H 15
- #define EEPROM_R3_TIME_ON_M 16
- #define EEPROM_R3_TIME_OFF_H 17
- #define EEPROM_R3_TIME_OFF_M 18
- #define EEPROM_R4_TIME_STATE 19
- #define EEPROM_R4_TIME_ON_H 20
- #define EEPROM_R4_TIME_ON_M 21
- #define EEPROM_R4_TIME_OFF_H 22
- #define EEPROM_R4_TIME_OFF_M 23
- #define EEPROM_LAST_WRITED_ADDR 23
Konfiguracja pinów wygląda następująco:
- #define SOFT_UART_RX 11
- #define SOFT_UART_TX 10
- #define RELAY1_PIN 2
- #define RELAY2_PIN 3
- #define RELAY3_PIN 4
- #define RELAY4_PIN 5
Funkcja odpowiedzialna za uruchomienie poszczególnych komponentów:
- void setup()
- {
- Serial.begin(9600);
- I2CBT.begin(9600);
- Serial.println("Uart Enabled");
- pinMode(RELAY1_PIN, OUTPUT);
- pinMode(RELAY2_PIN, OUTPUT);
- pinMode(RELAY3_PIN, OUTPUT);
- pinMode(RELAY4_PIN, OUTPUT);
- digitalWrite(RELAY1_PIN, OFF_STATE);
- digitalWrite(RELAY2_PIN, OFF_STATE);
- digitalWrite(RELAY3_PIN, OFF_STATE);
- digitalWrite(RELAY4_PIN, OFF_STATE);
- Serial.println("Pinout Setted");
- setRelayStateBaseOnEEPROMData();
- }
Powyżej ustawiane są przekaźniki oraz uruchamiane dwa UARTy. Jeden do komunikacji z układem Bluetooth, drugi natomiast do wyświetlania danych na ekranie.
Pętla:
- void loop()
- {
- char recSingleData;
- int insize = 0;
- char character;
- if ((insize=(I2CBT.available())) > 0)
- {
- Serial.write(recSingleData=char(I2CBT.read()));
- recData[dataLoop] = recSingleData;
- dataLoop++;
- }
- if(checkReceiveData(recSingleData))
- {
- dataLoop = 0;
- setDataByBuffer(recData);
- }
- }
W pętli głównej następuje odbieranie danych od UART'a oraz sprawdzanie otrzymanej ramki.
Pozostałe funkcje będą znajdować się plikach od projektu.
Cały projekt można pobrać z dysku Google pod tym linkiem w folderze Csharp - Xamarin.