Ostatnio kontynuowaliśmy temat "rozmawiania" z Arduino (komunikacji z wykorzystaniem portu szeregowego), która jest nam o tyle potrzebna, że właśnie w ten sposób później będziemy rozmawiać z płytką wykorzystując komunikację bezprzewodową. Przypomnieliśmy sobie, że konieczne tutaj jest używanie obiektu Serial, który na samym początku działania programu trzeba włączyć metodą: Serial.begin(9600); TinkerCad robi to za nas. Dzięki temu później jeśli coś wyślemy do Arduino, procesor może to odczytać metodą: Serial.read(); W TinkerCadzie za odczytywanie odpowiada bloczek: ze względu na jego zaokrąglony kształt musimy go umieścić w innych bloczkach np. ze zmienną: lub jeśli chcemy sprawdzić jaki właśnie znak odczytujemy: najlepiej obie te metody połączyć i zrobić to tak:
49 nie jest tu przypadkową wartością. To zakodowany numer jakiegoś znaku. Wszystkie znaki jakie przesyłamy portem szeregowym są zakodowane tak zwanym kodem ASCII. Tabelę z kodami można sprawdzić np. na Wikipedii: https://pl.wikipedia.org/wiki/ascii lub w trochę bardziej czytelnej wersji np. tutaj: https://www.bryk.pl/wypracowania/pozostale/informatyka/15912-tabela-znakow-w-standardo wych-kodach-ascii.html Liczba 49 odpowiada cyfrze '1'. Zawsze kiedy wysyłamy '1', Arduino otrzymuje liczbę 49. Jeśli wyślemy dwie jedynki, bo chcemy wysłać liczbę '11' ona dostanie dwa razy liczbę 49. A napis "hej" to kolejno 168 165 170. Pytanie kontrolne*: Jaką liczbę Arduino dostanie, gdy wyślemy literę 'a', a jaką jeśli wyślemy 'A'? Niestety w TinkerCadzie chcąc się dogadać z płytką Arduino musimy sprawdzać jaki kod ASCII odpowiada poszczególnym znakom. Programując Arduino tekstowo możemy sobie sprawę ułatwić pisząc '1' (w apostrofach) zamiast 49. Przykładowo: if (zmienna == 1) { //tutaj sprawdzamy czy zmienna jest równa liczbie 1 digitalwrite(13, HIGH); //dioda zapali się, jeśli zmienna będzie równa 1 if (zmienna == '1') {//tutaj sprawdzamy czy zmienna jest równa kodowi ASCII znaku '1' digitalwrite(13, HIGH); //dioda zapali się, jeśli zmienna będzie równa 49 Zanim przejdziemy do programowania warto przypomnieć także, że zanim użyjemy bloczka " odczytaj z interfejsu szeregowego " albo metody Serial.read(); powinniśmy sprawdzić, czy Arduino w ogóle ma co odczytywać. Służy do tego metoda Serial.available() albo bloczek: Na ostatnich zajęciach tworzyliśmy program prostego "Menu", dzięki któremu mogliśmy za pomocą wysyłanych numerów sterować tym co robi płytka Arduino, na przykład: jeśli wysyłaliśmy '1' dioda się zapala, jeśli wysyłaliśmy '2' dioda miała się zgasić, jeśli wysłaliśmy '3' odczytaliśmy potencjometr itp. Każdy mógł stworzyć takie menu jakie chciał.
W Arduino wpisywaliśmy użytkownikowi menu używając jednej z funkcji: Serial.print( "wiadomość bez przejścia do nowej linii" ); Serial.println( "wiadomość z przejściem do nowej linii" ); W Tinkercadzie mogło to wyglądać np. tak: Jednak te funkcje dodane w funkcji loop() sprawiają, że nasze menu wypisuje się w nieskończoność non stop, co jest raczej uciążliwe. Dlatego na zajęciach zastanawialiśmy się jak sprawić, żeby Arduino wypisało menu jeden raz, a potem poczekać, aż użytkownik wyśle jakiś znak. Pomocny okazał się tutaj bloczek "Powtórz dopóki" czyli pętla while(){
która zablokowała działanie naszego programu (powtarza "nic nie robienie") tak długo, aż użytkownik czegoś nie wyśle. Po odebraniu znaku zapisujemy go w zmiennej i sprawdzamy, którą opcję odebraliśmy. Przykład takiego sprawdzenia: co gdybyśmy programowali testowo wygląda następująco: if (znak == 49) { Serial.println("1"); else { if (znak == 50) { Serial.println("2"); else { if (znak == 51) { Serial.println("3"); else { Serial.println("To ani 1, ani 2, ani 3 - spróbuj jeszcze raz!");
i przy dłuższym menu może okazać się niezbyt czytelne. Dlatego pokazaliśmy sobie, że przy programowaniu w Arduino IDE możemy użyć, zamiast if i else, switcha, który w praktyce prezentuje się następująco: switch(znak){ /*switch można przetłumaczyć jako "przełącznik" - tutaj przełącznikiem jest zmienna o nazwie znak*/ case 49: //case oznacza "przypadek" - jeśli zmienna znak jest równa 49 to: Serial.println("1"); /*break oznacza koniec wykonywania się instrukcji - sprawia, że "wychodzimy" ze switcha, a jeśli go nie ma, program sprawdzi również kolejną opcję*/ case 50:// jeśli zmienna znak jest równa 50 to: Serial.println("2"); case 51: Serial.println("3"); default: Serial.println("To ani 1, ani 2, ani 3 - spróbuj jeszcze raz!"); Oczywiście programując tekstowo możemy sobie jeszcze bardziej poprawić czytelność pisząc '1' zamiast 49 itp. Łącząc wyżej opisane informacje można wykonać dowolny program sterujący płytką Arduino zarówno wykorzystując port szeregowy komputera jak i np. telefon lub drugie Arduino (bluetooth/wifi).