1.3 Kurs „Arduino Łopatologicznie” instrukcje warunkowe, przekazywanie zmiennych przez Monitor Portu Szeregowego

Do tej pory komunikacja z naszym Arduino była dość ograniczona to bardziej on do nas przemawiał poprzez Monitor Portu Szeregowego niż słuchał naszych poleceń. W tej lekcji to zmienimy – nauczymy się przekazywać wartości zmiennych do mikrokontrolera. Nauczymy się też pisać instrukcje warunkowe, dzięki nim będziemy lepiej kontrolować kolejność wykonywania kodu.

Od teraz Monitor Portu Szeregowego będę nazywał Serial Monitorem, będzie prościej i zwięźlej.

Wracając do naszej komunikacji Arduino <-> Komputer to jest ona realizowana przez interfejs UART, nie będziemy się wgłębiać w technikalia ale pojęcie UART przewija się często w poradnikach i warto wiedzieć z czym to się je – jest to układ służący do komunikacji przez port szeregowy. Ponieważ kurs nazywa się Arduino Łopatologicznie to przyjmiemy w dużym uproszczeniu, że w komunikacji pośredniczy Bufor i ma on określoną pojemność 128 bajtów, jest to dużo i mało jednocześnie.

komunikacja UART

Bufor działa jak pojemnik na dane, które czekają na swoją kolej żeby zostać z niego wyjęte – zapamiętajmy, że kod programu w mikrokontrolerze wykonuje się niezależnie od tego czy dane tam są czy nie – znikną dopiero jak zostaną przez mikrokontroler odczytane.

Wyobraźmy sobie, że aktualizujemy nasz program do obliczania pola kwadratu i teraz będziemy podawać długość boku poprzez wpisanie go w Serial Monitorze zamiast na nowo kompilować kod za każdym razem.

Ponieważ spodziewamy się, że użytkownik poda nam wartość liczbową musimy wykorzystać funkcję Serial.parseInt(); powoduje ona odczytanie i opróżnienie bufora, ale UWAGA potrafi oczytać jedynie typ int czyli wartości liczbowe z danego zakresu, jeśli wprowadzimy litery funkcja nie poradzi sobie z tym i zignoruje odczytane znaki.

Kod programu gdzie będziemy wpisywać samodzielnie wymiar boku będzie wyglądał następująco:

int dlugoscBoku; //tworzymy zmienną typu int

void setup() {

Serial.begin(9600); //łączymy się z Serial Monitorem

}

void loop() {
  
Serial.println("Wpisz długość boku kwadratu aby wyliczyć pole: ");

delay(3000); //czekamy chwilę, żeby użytkownik zdążył wysłać dane do bufora

dlugoscBoku = Serial.parseInt(); //przypisujemy zmiennej wartość odczytaną z Serial Monitora

int poleKwadratu = dlugoscBoku * dlugoscBoku; //tworzymy zmienną 

int przechowującą wynik z mnożenia

Serial.println("Pole kwadratu jest równe: "); 

Serial.println(poleKwadratu); //wypisujemy zawartość zmiennej z polem

delay(5000); //czekamy 5 sekund i program wykona się od nowa

}

Teraz pokażę jak prawidłowo przekazać tekst do naszego programu. Przypominam tylko, że tekst przechowujemy w zmiennej typu String a jej wartość podajemy w cudzysłowie, czyli String mojeImie = „Piotr”;

Aby odczytać tekst wprowadzony przez Serial Monitor wykorzystamy funkcję Serial.readString(); i analogicznie do poprzedniego przykładu przypisujemy odczyt z bufora do naszej nowej zmiennej mojeImie. Kod programy możemy napisać tak:

String mojeImie; // deklarujemy zminną typu String

void setup() {

Serial.begin(9600);

}

void loop() {

Serial.println("Wpisz swoje imie!");

delay(5000);

mojeImie = Serial.readString(); //przypisujemy odczyt z bufora do zmiennej

Serial.print("Witaj, miło Cię poznać ");

Serial.println(mojeImie); //wypisujemy zmienną mojeImie

delay(5000); //czekamy 5 sekund i program wykona się od nowa

}

Od teraz umiesz wysyłać i odbierać dane od naszego Arduino zarówno liczbowe jak i tekstowe.

Instrukcje warunkowe

Instrukcje warunkowe to ważne narzędzie w każdym języku programowania, pozwalają one sterować wykonywaniem kodu w zależności od ustalonych wcześniej warunków.

Żeby zaprezentować to na przykładzie zmodyfikujmy nasz program liczący pole kwadratu o funkcję sprawdzania czy podana liczba nie jest ujemna.

Instrukcja warunkowa wygląda następująco: if ( warunek) { } else { }

tłumacząc to najprościej:

if (5>1){  //jeśli (wyrażenie w nawiasie jest prawdziwe
// wykonaj kod znajdujący się między nawiasami klamrowymi
} else // w przeciwnym wypadku wykonaj kod za else
{// jeśli warunek nie będzie spełniony wykona się kod w nawiasach po else  }

Stosując to w praktyce można napisać program wyświetlający komunikat czy osoba jest pełnoletnia po tym jak wpisze swój wiek:


void setup() {

Serial.begin(9600);

}

void loop() {

Serial.println("Wpisz swój wiek");

delay(5000);

int mojWiek = Serial.parseInt(); //przypisujemy odczyt wieku do zmiennej

if (mojWiek >=18) //sprawdzamy warunek czy wiek większy lub równy 18 jeśli tak wykonujemy kod w nawiasach klamrowych
{
Serial.println("Jesteś pełnoletni");
} else
{
Serial.println("nie ukończyłeś jeszcze 18 lat!");
}
delay(5000); //czekamy 5 sekund i program wykona się od nowa

}

Program zapyta o wiek jeśli wpisana liczba jest równa bądź większa od 18 co oznacza, że warunek został spełniony program wykona polecenia w nawiasach klamrowych po warunku, jeśli nie – wykona kod w nawiasach klamrowych po else.

Można też tworzyć złożone warunki ich struktura przedstawia się następująco:

if (warunek1){ //jeślil warunek spełniony zrób instrukcje w klamrach, jeśli nie sprawdź kolejny warunek
} else if (warunek2) { //jeśli warunek spełniony zrób instrukcje w klamrach, jeśli nie sprawdź kolejny warunek
} else if (warunek3){

} itd...

tutaj pokazano jak można sprawdzić kilka warunków pod rząd.

Aby ułatwić nam zadanie i mniej komplikować kod możemy pisać bardziej złożone warunki, a pomogą nam w tym operatory oraz lub.

operator logiczny  i – zapisujemy && , zwraca logiczną prawdę tylko jeśli wyrażenia po obu jego stronach są prawdziwe, w przeciwnym wypadku zwróci fałsz.

operator logiczny lub – zapisujemy || i zwraca logiczną prawdę gdy jedno z wyrażeń po jego stronie jest prawdziwe. Gdy oba są niepoprawne zwróci fałsz. (|| to u mnie klawisz \ 2 razy naciśnięty z shiftem)

Demonstrując na przykładzie:

  • if ( 5>2 && 4<10 ) – zwróci prawdę bo 5 jest większe od 2  i 4 jest mniejsze od 10
  • if ( 5>2 || 10<5 ) – również zwróci prawdę bo wystarczy, że jedno lub drugie założenie jest spełnione, w tym wypadku 5>2 to prawda.

Podsumowując dzisiejszą lekcję: wiesz jak wykorzystać w kodzie zmienne, do których potrafisz przypisać wartości wpisane w Serial Monitorze na swoim komputerze. Wiesz, że odczytując wartość liczbową należy użyć funkcji Serial.parseInt() a odczytując tekst należy wykorzystać funkcję Serial.readString(). Potrafisz pisać instrukcje warunkowe wykorzystując operatory if oraz else oraz wiesz, że instrukcje te mogą być wielokrotnie złożone. Zapamiętasz operatory logiczne && – i oraz || – lub by móc sprawdzić za jednym razem więcej niż jeden warunek tym samym upraszczając i skracając kod.

W kolejnej lekcji będziesz miał okazję wykazać się dotychczas zdobytą wiedzą i napiszesz SAMODZIELNIE pierwszą grę!

Nie zapomnij polubić naszego facebooka -> znajdziesz tam informację o kolejnych lekcjach kursu „Arduino Łopatologicznie”

KLIKNIJ ABY PRZEJŚĆ NA NASZEGO FACEBOOKA

Praca domowa:

  • 1. napisz program sprawdzający wpisany wiek i wyświetlający napis do jakiej placówki oświaty powinno się uczęszczać, uwzględnij przedszkole, szkołę podstawową, liceum/technikum, studia.
  • 2. DODATKOWE: napisz program obliczający BMI (body mass index) wzór znajdziesz w internecie, program powinien zapisać do zmiennych wzrost oraz wagę, kolejno powinien wypisać w Serial Monitorze wynik z obliczeń BMI a następnie wyświetlić komunikat jaki jest stan pacjenta w oparciu o poniższy rysunek:
skala BMI

Dajcie znać w komentarzach komu udało się uporać z dwoma zadaniami. Przykładowy kod dla obu zadań pojawi się na naszym Facebooku.

Czekam również na wasze opinie i pytania w komentarzach pod tą lekcją, do zobaczenia!

<—- Lekcja 2

5 Comments

Zostaw komentarz

  1. krzysiek
    Odpowiedz

    dopiero zaczynam swoja przygode z arduino i
    nie dokonca jestem pewien czy tak to powinno wygladac.to to co udalo mi sie stworzyc.
    zadanie 1.
    int podajwiek=0;
    void setup() {
    Serial.begin(9600);
    }

    void loop() {
    podajwiek=Serial.parseInt();
    Serial.println(„podaj swój wiek”);
    delay(3000);
    if(podajwiek>3&&podajwiek6&&podajwiek15&&podajwiek19&&podajwiek25){
    Serial.println(„jeżeli wszystko poszło zgodnie z planem,powinieneś juz pracować”);
    }
    delay(3000);
    }

    zadanie 2.

    float masa=0;
    float wzrost=0;

    void setup() {
    Serial.begin(9600);
    }
    void loop() {
    Serial.println(„podaj swoją wage”);
    delay(3000);
    masa=Serial.parseInt();
    Serial.println(masa);
    delay(3000);
    Serial.println(„podaj swój wzrost”);
    delay(3000);
    wzrost=Serial.parseInt();
    Serial.println(wzrost);

    Serial.println(„twoje BMI”);
    float metr = wzrost*0.01;//przeliczamy cenytmetry na metry potrzebne do właściwych obliczen
    float BMI = masa/(metr*metr);
    Serial.println(BMI);
    if(BMI=16&&BMI=17&&BMI=18.5&&BMI=25&&BMI=30&&BMI=35&&BMI=40){
    Serial.println(„OTYŁOŚĆ 3 ST.”);
    }
    }

    dalej niepodoba mi sie to ,ze program powtarza sie w kółko.
    spróbuje pogrzebac w sieci i znaleść jakieś rozwiazanie.

    1. admin
      Odpowiedz

      Jeśli chodzi o warunek należy go uprościć i wykorzystać przedziały: if( BMI >= 25 && BMI <= 29.99) Serial.println(„Nadwaga”); Co do powtarzających się fragmentów kodu często wykorzystuje się pętle, Pętle i funkcje są przewidziane w nastepnych lekcjach.

    2. pablo
      Odpowiedz

      Co w tym kodzie jest nie tak ? zawsze wychodzi „wychudzenie ” co bym nie wstawił ?
      float wzrost;
      float waga;
      float bmi;
      void setup()
      {
      Serial.begin(9600);
      }

      void loop()
      {
      Serial.println(„Podaj swój wzrost w cm:”);
      delay(5000);
      wzrost = Serial.parseInt();
      //Serial.println(„Twój wzrost wynosi :”);

      Serial.println(„Podaj swoją wagę w kg:”);
      delay(5000);
      waga = Serial.parseInt();
      //Serial.println(„Twój waga wynosi :”);

      Serial.println(„Twoja waga i wzrost to :”);
      Serial.println(waga);
      Serial.println(wzrost);

      float cmTOm = wzrost/100;
      bmi = waga / (cmTOm * cmTOm) ;
      delay(2000);
      Serial.println(„BMI wynosi:”);
      Serial.println(bmi);

      if ( bmi=16&&bmi=17&&bmi=18,5&&bmi=25&&bmi=30&&bmi=35&&bmi=40) Serial.println(„Otylość III stopnia „);

      delay(5000);
      }

      1. admin
        Odpowiedz

        Cześć, na pierwszy rzut oka widać, że warunek nie jest prawidłowo zapisany:
        if ( bmi=16&&bmi=17&&bmi=18,5&&bmi=25&&bmi=30&&bmi=35&&bmi=40)
        wszędzie masz znaki równości, a badasz zakresy, powinno to wyglądać tak, że jeśli bmi>=35 && bmi<=40 to podaj jakąś wartość. Skrócić i przemyśleć warunek i zacznie działać.

  2. krzysiek
    Odpowiedz

    zad.2

    float masa=0;
    float wzrost=0;

    void setup() {
    Serial.begin(9600);
    }
    void loop() {
    Serial.println(„podaj swoją wage”);
    delay(3000);
    masa=Serial.parseInt();
    Serial.println(masa);
    delay(3000);
    Serial.println(„podaj swój wzrost”);
    delay(3000);
    wzrost=Serial.parseInt();
    Serial.println(wzrost);

    Serial.println(„twoje BMI”);
    float metr = wzrost*0.01;
    float BMI = masa/(metr*metr);
    Serial.println(BMI);
    if(BMI=16&&BMI=17&&BMI=18.5&&BMI=25&&BMI=30&&BMI=35&&BMI=40){
    Serial.println(„OTYŁOŚĆ 3 ST.”);
    }
    }

Odpowiedz

Twój adres e-mail nie zostanie opublikowany