1.2 Kurs „Arduino łopatologicznie” Budowa programu, zmienne i ich typy, komunikacja z komputerem.

Na tej lekcji dowiemy się z czego składa się program, który wgrywamy na Arduino, jakie mamy typy zmiennych i do czego je wykorzystać. Przeprowadzimy też podstawowe operacje na zmiennych. Na koniec napiszemy pierwszy prosty program.

Zmienne i ich typy

Aby zacząć przygodę z programowaniem trzeba mieć świadomość, że istnieje takie coś jak zmienne i że posiadają one różne typy. Zmienne służą do przechowywania danych – możemy im nadawać dowolne nazwy jednak dobrą praktyką jest nazywanie ich w sposób jednoznacznie wskazujących na to co przechowują. Znacznie czytelniej wygląda kod jeśli zmienna przechowująca odczyt termometru nazywa się temp zamiast nowa1. W zależności jakiego zmienne są typu takie dane mogą przechować. Ich nazwy nie mogą zawierać spacji oraz polskich znaków. Najważniejsze z nich trzeba zapamiętać, a są to:

  • int – zmienna liczbowa, może przechować wartości od -32 768 do 32 768
  • float – zmienna przechowuje wartości po przecinku np. 27.6 przydaje się gdy chcemy wypisać lub zapisać temperaturę z dokładnością do paru miejsc po przecinku
  • boolean – przechowuje tylko wartość logiczną 0 lub 1 (fałsz lub prawda)
  • String – przechowuje tekst, przykładowo słowo „Tomek” , „gruszka” – konieczne jest umieszczenie tekstu w cudzysłowie.
  • char – używa się do zapisu znaków kodu ASCII przyjmuje wartość od -128 do 128, poszczególne liczby odpowiadają znakom z tablicy, np. 65 to litera A podgląd takiej tabli można znaleźć np. tutaj: https://pl.wikipedia.org/wiki/ASCII

Podsumowując tworząc jakąś zmienną trzeba określić jej typ, jeśli stworzymy zmienną int temperatura = 15,6 i przypiszemy jej wartość 15,6 a potem wypiszemy ją na ekranie pojawi się samo 15 bo zmienna int przechowuje tylko liczby całkowite, konieczne jest tutaj wykorzystanie zmiennej float, a więc poprawnie będzie float temperatura = 15,6

Jeśli chodzi o typ boolean zwraca on wartość logiczną z operacji. Możemy sprawdzić czy dane działanie jest prawdą. Przykładowo boolean malyKwadrat ( bokKwadratu<10) bokKwadratu = 5 jak w naszym przypadku, a jest to mniej niż 10 to zwrócona wartość logiczna będzie równa 1 czyli prawda.

Sekcja void setup() i void loop()

Po otworzeniu naszego środowiska do kodowania Arduino, otwierając nowy szkic ukazuje się naszym oczom takie okienko:

przestrzeń nad void setup – umieścimy tutaj „definicje” różnych zmiennych – po to aby w przyszłości mieć do nich łatwy dostęp – nazywamy je zmienny globalnymi. Dzięki temu jeśli zmienna będzie występowała kilka razy będzie można ją łatwo zmienić w jednym miejscu zamiast potem poprawiać przy każdym użyciu w kodzie. Przykładowo bokKwadratu = 5; Jeśli w naszym programie będziemy obliczać, pole kwadratu, sumę długości boków itp, to jeśli długość boku kwadratu ulegnie zmianie wystarczy, że zmienimy to w jednym miejscu. Inaczej trzeba by wyszukać każde miejsce gdzie podany był bok kwadratu jako wartość liczbowa 5 i zmieniać ja ręcznie.

void setup() – traktujemy jako przestrzeń do ustawień, których będziemy używać w dalszej części naszego programu.

To co znajduje się w przestrzeni setup() wykonane zostanie tylko raz!

void loop() – to przestrzeń gdzie wpisywać będziemy polecenia do wykonania przez mikrokontroler, loop oznacza pętle i dokładnie w taki sposób wszystko będzie się wykonywało w nieskończoność instrukcja po instrukcji – linijka po linijce. Nawiasy klamrowe wyznaczają początek i koniec tej przestrzeni.

To co znajduje się w przestrzeni loop() wykonywane jest w nieskończoność.

// – podwójny ukośnik oznacza komentarz, wszystko co znajduje się od ukośników do końca linijki nie jest brane pod uwagę w programie, jest to sposób na dodawanie notatek do kodu.

Operatory logiczne

Operatory logiczne są używane na każdym kroku, większość z nich każdy z nas zna ze szkoły, ale należy zwrócić szczególną uwagę na operator przypisania „=„, porównania”==” oraz nierówności „!=”

pozostałe operatory to <, > =<, => mniejszy od, większy od, mniejszy bądź równy i większy bądź równy.

Przykładowo jeśli mamy zmienną bokKwadratu = 5; oznacza to że przypisujemy jej wartość 5, od teraz wypisując bokKwadratu zobaczymy wartość 5.

Jeśli mamy zapis bokKwadratu == 5; oznacza to ze sprawdzamy czy bokKwadratu jest równy 5. Otrzymamy tutaj logiczną prawdę tylko jeśli 5==5

Możemy wykorzystując bokKwadratu != 6 też otrzymamy prawdę bo bok kwadratu nie jest równy 6, bo przecież przypisaliśmy mu wartość 5.

Przy okazji Arduino rozumie też operatory arytmetyczne takie jak +, -, / , * ,^ dla dodawania, odejmowania, dzielenia, mnożenia i potęgowania. Nasze środowisko wysyłając kod do arduino zadba aby mikrokontroler trzymał się kolejności wykonywania działań, więc zapisując:

int bokKwadratu = 5*5+2; otrzymamy wynik 27 co jest zgodne z zasadami najpierw mnożymy, dzielimy, dodajemy na koniec odejmujemy. Można również dla pewności i w bardziej skomplikowanych działaniach stosować nawiasy: int bokKwadratu = (5*5)+2;

Monitor portu szeregowego

W naszym środowisku do programowania mamy do dyspozycji monitor portu szeregowego. Jest to swoisty kanał komunikacyjny między Tobą a Arduino. Możesz tutaj wyświetlać wyniki wykonywania programu lub przekazywać dane do Mikrokontrolera.

Dostęp do niego możemy uzyskać klikając w Narzędzia -> Monitor Portu Szeregowego

monitor portu szeregowego

Aby nawiązać połączenie Arduino z komputerem i komunikować się z nim za pomocą okna Monitora Portu Szeregowego należy w programie dodać linijkę Serial.begin(9600); oznacza to tyle co rozpocznij komunikację z prędkością 9600 bitów na sekundę.

W przyszłości kopiując czyjeś kody możecie napotkać problem z wyświetlaniem się dziwnych krzaków ^%$##$%^&DFG zamiast faktycznych wartości. Zapewne jest to rozbieżność w szybkości komunikacji. Pamiętaj wartość z nawiasu w naszym przypadku 9600 musi odpowiadać wartości ustawionej w monitorze. Miejsce ustawienia pokazuje strzałka w poniższym screenie:

szybkość transmisji danych musi być identyczna

Funkcje wbudowane w środowisko Arduino.

W naszym szkicowniku mamy do dyspozycji zaszyte funkcje, dzięki nim możemy sterować naszym Arduino.

Wykorzystywane funkcje często wymagają aby podać im argumenty. Argumenty to dane jakie są wymagane do poprawnego działania funkcji. Teraz podam wam podstawowe funkcje wraz z możliwymi argumentami jakie trzeba poznać, na kolejnych lekcjach dowiesz się skąd wziąć spis funkcji jakie mamy do dyspozycji oraz jakie argumenty należy do nich przekazać.

Funkcja wygląda w ten sposób nazwaFunkcji ( ); 

Jeśli jest wymagane w nawiasie podajemy argumenty jeśli nie pozostawiamy nawias pusty.

Po wywołaniu funkcji oraz po deklaracji zmiennej dajemy ; (średnik) jest to znak w języku Arduino, że to koniec pojedynczego polecenia.

Funkcje, które musisz znać:

  • pinMode(numerPinu, OUTPUT lub INPUT) – ustawiamy czy dany pin w Arduino będzie w trybie wysyłania czy odczytywania danych. Przykładowo ustawiamy pin 13 gdzie podpięta jest wbudowana dioda na pracę w trybie wyjścia czyli bedziemy sami decydowali kiedy ustawiamy na nim napięcie, a kiedy nie. W przypadku ustawienia w tryb input, moglibyśmy tylko badać czy z zewnątrz przychodzi napięcie 5V czy 0V.
  • digitalWrite( numerPINU, HIGH lub LOW) – funkcja na wybranym pinie ustawia stan NISKI lub WYSOKI. Przykładowo digitalWrite(13, HIGH) poda napięcie 5V na pin Arduino 13. Do pinu 13 podpięta jest dioda więc zacznie ona świecić. Ustawiając stan na LOW napięcie na pinie ustawi się na 0V i dioda zgaśnie.
  • delay(wartość w milisekundach) – funkcja delay odpowiada za czekanie, pisząc delay(2000) – każemy Arduino poczekać 2000 milisekund co odpowiada 2 sekundom (1000ms – 1s)
  • Serial.println() – funkcja wypisuje wartość podaną w nawiasie w okienku serial monitora. Aby wypisać tekst należy podać go w cudzysłowie. Przykład: Serial.println(” Hello World! ” ) wypisze w oknie monitora portu szeregowego tekst: Hello World!

Piszemy nasz pierwszy program!

Teraz wykorzystajmy wiedzę zdobytą w tej lekcji i napiszmy nasz pierwszy program.

Program będzie się z nami witał wypisując w monitorze portu szeregowego tekst: Witaj! oraz mrugał diodą wbudowaną w Arduino, dioda powinna zaświecić się na 2 sekundy, potem zgasnąć na pół sekundy i tak w kółko.

Otwieramy szkicownik i przepisujemy poniższy kod:

void setup() {
Serial.begin(9600); //łączymy się z monitorem portu szeregowego
pinMode(13,OUTPUT); // ustawiamy pin13 na pracę w trybie wyjścia
}

void loop() {

Serial.println(" Witaj! "); // wypisujemy w okienku tekst
digitalWrite(13,HIGH); //podajemy napięcie na pin13 wbudowana dioda się zaświeca
delay(2000); // czekamy 2 sekundy (dioda pozostaje zaświecona)
digitalWrite(13,LOW);  // przestajemy podawać napięcie na pin13
delay(500); // czekamy 0,5 sekundy (dioda pozostaje wygaszona)


}

Klikamy Wgraj i okienku monitora powinno pokazać nam się wypisane Witaj! a dioda na arduino powinna migać. Program wykonuje się w nieskończonej pętli.

Program 2

W tym programie utworzymy sobie zmienną dlugoscBoku typu int i nadamy jej jakąś wartość, kolejno utworzymy zmienne sumaBokow, oraz poleKwadratu. Będziemy wyliczać sumę boków kwadartu oraz jego pole, a następnie wypiszemy to na ekranie.

int dlugoscBoku = 5;

void setup() {
Serial.begin(9600); //łączymy się z monitorem portu szeregowego
}

void loop() {

int sumaBokow = dlugoscBoku * 4;  //wykonujemy operację mnożenia długość boku x4
int poleKwadratu = dlugoscBoku * dlugoscBoku; // mnożymy długość boków aby obliczyć pole

//poniżej wypisujemy wartości zmiennych
Serial.println("Bok kwadratu ma długość: ");
Serial.println(dlugoscBoku);
Serial.println("Suma długości boków to: ");
Serial.println(sumaBokow);
Serial.println("Pole wynosi: ");
Serial.println(poleKwadratu);
delay(5000); //czekamy 5 sekund, przetestuj wersję kodu bez czekania 5 sekund i zobacz co się stanie!

}

Ten przykład pokazuje sens stosowania zmiennych globalnych. Teraz zmieniając wartość dlugoscBoku w całym programie zostanie ona uwzględniona i po ponownym załadowaniu szkicu do Arduino otrzymamy wyliczenia dla nowej wartości.

Podsumowanie

Po tej lekcji umiesz nawiązywać połączenie z monitorem portu szeregowego poleceniem Serial.begin(9600); potrafisz wypisać na ekranie tekst lub wartości zmiennych funkcją Serial.println();  znasz typy zmiennych i wiesz, że jeśli chcesz nadać zmiennej wartość używasz znaku równości = jeśli chcesz porównać dwie wartości robisz to operatorem porównania czyli podwójnym ==. Każde polecenie kończysz średnikiem ;

Zadanie domowe

  1. Jeśli jeszcze nie polubiłeś naszego Facebooka zrób to koniecznie żeby nie przegapić kolejnych lekcji: https://www.facebook.com/elektrowebpl/
  2. Napisz program, w którym stworzysz zmienną tempC = 15.7 , a następnie stwórz kolejne zmienne tempK dla temperatury w Kelwinach oraz tempF dla temperatury w Farnheitach. Każda zmienna powinna konwertować temperaturę 15.7 Wyniki działań wypisz w serial monitorze. To Twój pierwszy samodzielnie napisany użyteczny program – Gratulacje! Wyniki wpisz w komentarzu pod tą lekcją.

Zapraszam do zadawania pytań w komentarzach oraz zgłaszania ewentualnych uwag.

Pamiętaj przepisywanie kodu zamiast jego kopiowanie pozwoli lepiej utrwalić składnię!

rozwiązanie pracy domowej do pobrania tutaj -> KLIK

<—– Lekcja 1   Lekcja 3 —->

4 Comments

Zostaw komentarz

  1. krzysiek
    Odpowiedz

    Główny program przeniesiony do setup.
    Można by użyć delay w loop,ale zależało mi na tym aby program wykonał się tylko raz ,a nie powtarzał w nieskączoność.

    float tempC=15.7;//baza

    void setup() {
    Serial.begin(9600);//komunikacja
    float tempK =(tempC+273.15);//przeliczamy cencjusze na kelwiny
    float tempF =((tempC*1.8)+32);//przeliczamy cencjusze na fahrenheity
    Serial.println(„Stopnie Cencjusza”);
    Serial.println(tempC);
    Serial.println(„Stopnie Kelwina”);
    Serial.println(tempK);
    Serial.println(„Stopnie Fahrenheita”);
    Serial.println(tempF);
    }

    void loop() {

    }

    1. admin
      Odpowiedz

      Dzięki za komentarz – bardzo dobry czytelny kod. Powodzenia w dalszych etapach kursu!

      1. Robert
        Odpowiedz

        float tempC = 15.7; //Tu umieszczamy definicje roznych zmiennych
        float tempK = tempC + 273.15;
        float tempF = ( tempC * 1.8 ) + 32;

        void setup() { //Ta przestrzen jewt do ustawin i wykonywana jest tylko raz
        Serial.begin(9600); //Łączymy się z monitorem portu szeregowego
        }

        void loop() { //wpisujemy polecenia do wykonania i wykonywane sa w niskonczonosc

        //poniżej wypisujemy wartości zmiennych
        Serial.println(„Temp K: „);
        Serial.println(tempK);
        Serial.println(„Temp F: „);
        Serial.println(tempF);
        delay(5000);

        }

        1. admin
          Odpowiedz

          Dzięki za komentarz i życzymy powodzenia w dalszych rozdziałach!

Odpowiedz

Twój adres e-mail nie zostanie opublikowany