[PROJEKT] Komunikacja między dwoma modułami Bluetooth HC-05
Teraz można przejść do pisania oprogramowania na płytki KAmduino UNO. Na początek omówię oprogramowanie płytki, do której podłączone są przyciski (moduł Bluetooth ustawiony jako Master).
Jeżeli zostanie naciśnięty przycisk pierwszy, moduł wyśle komendę „LED1_1”, zaś gdy zostanie on zwolniony wysłana zostanie komenda „LED1_0”. Naciśniecie przycisku drugiego spowoduje wysłanie polecenia do zapalania diody drugiej (LED2_1), w przypadku zwolnienia przycisku zostanie wysłana komenda „LED2_0”, która będzie powodowała zgaszenie diody.
Pierwszym krokiem jest deklaracja dwóch zmiennych które będą przechowywać stan przycisków. Wyjścia przycisków są podciągnięte pod napięcie zasilania (5V), wciśniecie powoduje więc pojawienie się stanu niskiego na wejściu płytki KAmduino UNO.
// Komunikacja między dwoma modułami bluetooth HC-05 - Master // Autor: Patryk Mądry // Mikrokontroler 2017 r. int przycisk_1 = 0; int przycisk_2 = 0;
Następnie w funkcji setup() ustawiana jest prędkość portu szeregowego (taka sama jak w modułach Bluetooth, czyli 9600) oraz ustawione zostają piny jako wejścia przycisków (piny 4 oraz 5).
void setup() { Serial.begin(9600); pinMode(4,INPUT); pinMode(5,INPUT); }
W pętli głównej programu do zmiennych przycisk_1 oraz przycisk_2 wpisywane są wartości pochodzące z przycisków. Następnie, jeżeli przycisk jest wciśnięty (stan niski), wysyłana jest komenda LEDX_1 (gdzie X to numer przycisku). W przeciwnym przypadku wysyłany jest komunikat LEDX_0.
void loop() { przycisk_1 = digitalRead(4); przycisk_2 = digitalRead(5); if (przycisk_1 == LOW) { Serial.println("LED1_1"); } else { Serial.println("LED1_0"); } if (przycisk_2 == LOW) { Serial.println("LED2_1"); } else { Serial.println("LED2_0"); } delay(500); }
Teraz należy oprogramować drugą płytkę KAmduino UNO (moduł Slave oraz diody LED).
Na początku zostały zadeklarowane zmienne potrzebne do odbioru danych:
char OdebraneDane[20]; byte indeks; char znak ="";
Funkcja setup() wygląda bardzo podobnie jak poprzednio. Tutaj również ustawiono prędkość portu szeregowego na wartość 9600, oraz zadeklarowano piny 2 i 3 jako wyjścia.
void setup() { Serial.begin(9600); pinMode(2,OUTPUT); pinMode(3,OUTPUT); }
W pętli głównej program najpierw sprawdza czy zostały odebrane jakiekolwiek dane z modułu Bluetooth. Jeżeli tak (Serial.available() > 0), program czeka 100 milisekund i przystępuje do zapisywania danych do tablicy OdebraneDane. Odbywa się to w pętli do … while. Kolejne znaki są zapisywane do tablicy OdebraneDane aż do momentu, gdy w odebranym buforze znajdzie się znak „\n”, który oznacza koniec linii.
void loop() { if (Serial.available() > 0 ) { delay(100); do{ znak = (char)Serial.read(); OdebraneDane[indeks] = znak; indeks++; } while(znak != '\n'); indeks=0; Analiza_danych(); } }
Wywoływana jest funkcja Analiza_danych(). W niej program sprawdza jakie komendy zostały otrzymane i którą diodę należy zapalić, a którą zgasić. Najpierw sprawdzany jest czwarty odebrany znak (w programie jest wartość 3, ponieważ indeksy tablicy OdebraneDane są numerowane od 0). Mówi on o tym, której diody dotyczy komunikat. Następnie sprawdzany jest 5 znak w tablicy. Jeżeli to 0, należy zgasić diodę, jeśli 1 – diodę należy zapalić.
void Analiza_danych() { if( OdebraneDane[3]=='1') { if( OdebraneDane[5]=='1') { digitalWrite(2,HIGH); } else { digitalWrite(2,LOW); } } if (OdebraneDane[3]=='2') { if( OdebraneDane[5]=='1') { digitalWrite(3,HIGH); } else { digitalWrite(3,LOW); } } }
Działanie komunikacji między dwoma modułami bluetooth HC-05 zostało pokazane na poniższym materiale wideo: