Skocz do zawartości

Kurs Arduino - #2 - podstawy programowania, porty I/O


Pomocna odpowiedź

(edytowany)

Cześć, powoli rozgryzam Arduino... W przykładzie "Przykład - Światła drogowe" kodujemy przycisk po czym on nie pojawia się w programie, choć w opisie jest 

Cytat

po wciśnięciu przycisku wyświetli

po czym jest 

Cytat

Teraz zapomnijmy o przełączniku

Dlaczego? Szkoda...

Druga kwestia - pętla kończy się na świeceniu zielonej diody.

 

Obie te kwestie rozwiązałam tak:

void setup() {
  pinMode(10, OUTPUT); //Dioda czerwona
  pinMode(9, OUTPUT); //Dioda żółta
  pinMode(8, OUTPUT); //Dioda zielona
 
  pinMode(7, INPUT_PULLUP); //Przycisk
 
  digitalWrite(10, LOW); //Wyłączenie diod
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
}
 
void loop()
{
  if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty

  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomarańczowa
  digitalWrite(8, HIGH); //Zielona
	
  delay(1000); //Czekamy 1 sekundę
	
  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, HIGH); //Pomarańczowa
  digitalWrite(8, LOW); //Zielona
	
  delay(1000); //Czekamy 1 sekundę
	
  digitalWrite(10, HIGH); //Czerwona
  digitalWrite(9, LOW); //Pomarańczowa
  digitalWrite(8, LOW); //Zielona
	
  delay(1000); //Czekamy 1 sekundę
	
  digitalWrite(10, HIGH); //Czerwona
  digitalWrite(9, HIGH); //Pomarańczowa
  digitalWrite(8, LOW); //Zielona
	
  delay(1000); //Czekamy 1 sekundę

  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomarańczowa
  digitalWrite(8, HIGH); //Zielona

  delay(1000); //Czekamy 1 sekundę

  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomarańczowa
  digitalWrite(8, LOW); //Zielona
}
}

 

Czy brak "else" to błąd? Zawsze jeśli pojawi się "if" musi/powinno pojawić się "else"? Program działa, debugger nie zwraca błędu.

Edytowano przez Soowa
1 godzinę temu, Soowa napisał:

Czy brak "else" to błąd? Zawsze jeśli pojawi się "if" musi/powinno pojawić się "else"?

Else jest rozszerzeniem funkcji if. Wykona się wówczas kiedy warunek dla if będzie niespełniony. Else deklarujesz w zależności od potrzeby. 

18 godzin temu, Soowa napisał:

Dlaczego? Szkoda...

Przycisk wykorzystywany jest w kolejnych przykładach, chodziło po prostu o to, aby za jednym razem dokonać wszystkich połączeń. 

18 godzin temu, Soowa napisał:

Czy brak "else" to błąd? Zawsze jeśli pojawi się "if" musi/powinno pojawić się "else"?

Nie, brak "else" to nie błąd. Można, ale nie trzeba go używać - wszystko zależy od tego, czy chcesz, aby jakiś kod wykonywał się, gdy warunek nie będzie spełniony.

Nie do końca rozumiem dlaczego wciśnięcie przycisku powoduje stan LOW, a nie HIGH. Czy zwarcie przycisku nie powinno powodować przepływu prądu i wysokiego stanu?

Aktualizacja:

digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomarańczowa
  digitalWrite(8, HIGH); //Zielona
	
  delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
  while (digitalRead(7) == HIGH) {} //Czekaj na wciśnięcie przycisku

Ten kawałek kodu nie do końca spełnia funkcję, jaka jest przedstawiona w opisie zadania. Oczywiście wszystko będzie działać, jeśli puszczę przycisk krótko po wciśnięciu, ale jeśli przytrzymam go dłużej niż trwa delay, to program pójdzie dalej.

Nie lepiej byłoby zamiast delay dać drugą pętlę while tym razem z warunkiem LOW? To nam gwarantuje, że jedno wciśnięcie przycisku, daje jedną zmianę świateł.

@LeoTCZ witam na forum 🙂

22 godziny temu, LeoTCZ napisał:

Nie do końca rozumiem dlaczego wciśnięcie przycisku powoduje stan LOW, a nie HIGH. Czy zwarcie przycisku nie powinno powodować przepływu prądu i wysokiego stanu?

Tutaj nie chodzi o przepływ lub brak przepływu prądu. Chodzi o sprawdzenie jaki stan logiczny (wysoki, czy niskie) znajduje się na danym wejściu. Wciśnięcie przycisku powoduje połączenie wyprowadzenia z masą, która jest uznawana za stan niski. Jeśli przycisk podłączony byłby do dodatniej szyny zasilania to wtedy na wejściu układu byłby widoczny stan wysoki (należy wtedy jednak pamiętać o dodaniu rezystora pull-down). Taka wersja jest jednak mniej popularna - w świecie mikrokontrolerów przyjęło się, że wciśniecie przycisku najczęściej łączy dane wejście z masą.

22 godziny temu, LeoTCZ napisał:

Nie lepiej byłoby zamiast delay dać drugą pętlę while tym razem z warunkiem LOW? To nam gwarantuje, że jedno wciśnięcie przycisku, daje jedną zmianę świateł.

Można rozwiązać to na wiele sposób, dodawanie kolejnych pętli lub zmiennych opisujących stan urządzenia (o czym w dalszych częściach kursu) to tylko przykładowe metody rozwiązania tego problemu. W związku z tym, że jest to początek kursu to przykłady były celowo mocno upraszczane.

  • Lubię! 1
  • 1 rok później...
(edytowany)

Po co na początku każdego kodu ustawiać piny (diody) na low?  Wydaje mi się ze jest tak z automatu. Po co w każdej linijce na początku robi się dwie spacje?

PS przepraszam za dwa komentarze, chciałem zedytować poprzedni ale przypadkowo wstawiłem kolejny

 

Edytowano przez Tetosio21

@Tetosio21 witam na forum 🙂 Kwestia ustawiania stanów wejść/wyjść na początku to coś w rodzaju dobrej praktyki. Nie zawsze jest potrzebne, ale warto to robić, bo przy niektórych projektach zapomnienie o odpowiedni ustawieniu stanów początkowych może być problematyczne.

7 godzin temu, Tetosio21 napisał:

Po co w każdej linijce na początku robi się dwie spacje?

Spacje lub tabulatory w programowaniu służą do tego, aby kod był bardziej przejrzysty - np. zawartość pętli lub warunku jest przesunięta bardziej w prawo, niż reszta programu. Przy większych programach znacznie poprawia to czytelność.

  • 1 miesiąc później...

Czy rezystory muszą mieć taki sam kolor i takie same oznaczenia bo w moim zestawie są w innym kolorze i z innymi oznaczeniami (tymi kolorami po bokach) i gdy robię układy na płytce stykowej nie działają dodam też że u mnie przyciski mają 4 wyprowadzenia a nie 2 tak jak w kursie wszystko złożyłem dobrze i nie wiem czy to moja wina czy części które mam 

@Stachu1 paski na rezystorach powinny mieć takie same kolory, jednak odcień lub kolor samych elementów może być inny. Jeśli chodzi o przyciski to występują one w dwóch wersjach - ta z 4 wyprowadzeniami jest dużo bardziej popularna. Jeśli układ nie działa to obróć przycisk o 90 stopni na płytce stykowej i sprawdź wtedy, czy wszystko zadziała.

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...