Skocz do zawartości

Prośba o wytłumaczenie kodu z książki


Pomocna odpowiedź

Napisano

Witam, zakupiłem książkę "Arduino w akcji" licząc na to że bez większej wiedzy o programowaniu będę w stanie czegoś się nauczyć, jednak nie mogą zrozumieć kilku kwestii w jednym z początkowych programów

volatile int state = LOW;  // deklaracja i inicjalizacja zmiennej z atrybutem volatile 
int ledArray[] = { 8, 9, 10, 11, 12 };
int count = 0;
int timer = 75;
int pause = 500;

void setup() {
  for (count = 0; count < 5; count++) {
     pinMode(ledArray[count], OUTPUT);
  }
  attachInterrupt(0, ledOnOff, RISING);  // inicjalizacja przerwania 
}

void loop() {
  if (state) {
     for (count = 0; count < 5; count++) {
        digitalWrite(ledArray[count], HIGH);
        delay(timer);
     }
     delay(pause);  // opóźnienie wykonywania kodu 

     for (count = 0; count < 5; count++) {
        digitalWrite(ledArray[count], LOW);
        delay(timer);
     }
     delay(pause);
  }
}

void ledOnOff() {
  static unsigned long lastMillis = 0;  // użycie zmiennej statycznej 
  unsigned long newMillis = millis();
  if (newMillis - lastMillis < 50) {  // zapobieganie odbijaniu styków 
  } else {
     state = !state;
     lastMillis = newMillis;
  }
}

Pierwsze pytanie: volatile int state = LOW; - czemu zmiennej int przypisujemy LOW? Czy chodzi o to że kompilator przeczyta to jakby tam było 0?

Drugie pytanie: if (state) - nie rozumiem tego warunku, co ma się stać z tą zmienną żeby wykonała się ta instrukcja?

Z góry dziękuję za odpowiedzi i przepraszam za ignorancje, jeżeli te pytania nie mają sensu i takie rzeczy powinno się wiedzieć 😉

Pierwsze pytanie: volatile int state = LOW; - czemu zmiennej int przypisujemy LOW? Czy chodzi o to że kompilator przeczyta to jakby tam było 0?

Do tego się to sprowadza, bo LOW to po prostu stała (a dokładniej, makro preprocesora) predefiniowane w środowisku Arduino.

Drugie pytanie: if (state) - nie rozumiem tego warunku, co ma się stać z tą zmienną żeby wykonała się ta instrukcja?

Warunek wykona się, gdy wartość będzie różna od zera.

Co do pierwszego pytania to zobacz sobie plik Arduino.h w folderze Arduino/hardware/arduino/avr/cores/arduino.

W linii 40 i 41 masz:

#define HIGH 0x1
#define LOW  0x0

Zaczynając od zera, kiedy już obejrzałeś kilka arduinowych programów i mniej więcej wiesz jak to wygląda, trochę nie ma sensu (i szkoda czasu) iść po omacku. Moim zdaniem bardzo przyda Ci się teraz jakaś książka o samym języku C. Nawet kanoniczna i w pewnym sensie kultowa pozycja Kernighan/Ritchie:

http://helion.pl/ksiazki/jezyk-ansi-c-programowanie-wydanie-ii-brian-w-kernighan-dennis-m-ritchie,jansic.htm

będzie bardzo pomocna. Bardzo ładnie i miękko wprowadza w język, jego składnię a przede wszystkim w ideę C, budowanie kodu i korzystanie z instrukcji i funkcji. Mimo że nie ma tam nic o obiektach, metodach, szablonach, funkcjach lambda, przeciążaniu itp elementach nowoczesnego C++ to jednak jest to uznana "biblia" języka i każdy powinien ją mieć na półce - stanowi dobre odniesienie i rozwiewa wiele wątpliwości, szczególnie w początkowych fazach nauki. Czyta się ją jak dobrą powieść a po czymś takim będziesz połykał programiki Arduino jak ciepłe bułeczki będąc w stanie samemu tworzyć coś o niebo bardziej skomplikowanego.

Dzięki za odpowiedzi, rozjaśniły mi działanie tego programu 😉

@marek1707 Kurczę, liczyłem na to że ta książka będzie dobrym podręcznikiem do nauki programowania Arduino, a tutaj jednak programy są wytłumaczone dosyć powierzchownie (przynajmniej według mnie), może rzeczywiście trzeba będzie się zaopatrzyć w inną książkę

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...