Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Cześć, też chciałbym podzielić się wynikami moich działań w ramach tej części kursu. Po wykonaniu części ze światłami drogowymi, dołożyłem jeszcze światła dla pieszych, które działały podobnie jak w rzeczywistości. Czerwone dla aut - zielone dla pieszych, zielone i pomarańczowe dla aut - czerwone dla pieszych. Postanowiłem się jednak chwile zabawić i przy wykorzystaniu funkcji warunkowej i dwóch pętli while dodałem opcję migania świateł dla pieszych przed zmianą świateł dla aut. Początek migania świateł dla pieszych i zmianę świateł dla aut inicjowane jest drugim przyciskiem. 

Są to moje pierwsze "Koty za płoty" z arduino i próba przypomnienia sobie podstaw programowania czy to z uczelni czy z własnych prób, więc w kodzie może być masa błędów i wymaga on z pewnością dużej dozy optymalizacji. 

 

void setup() {
  pinMode(7, OUTPUT); //Dioda czerwona jako wyjście
  pinMode(6, OUTPUT); //Dioda zolta jako wyjscie
  pinMode(5, OUTPUT); //dioda zielona jako wyjscie
  pinMode(9, OUTPUT); //Czerwone dla pieszych
  pinMode(8, OUTPUT); //Zielone na pieszych
  digitalWrite(7, LOW); //Wyłączenie diody czerwonej
  digitalWrite(6, LOW); // Wylaczenie diody zoltej
  digitalWrite(5, LOW); //Wylaczenie diody zielonej
  digitalWrite(8, LOW); //Wylaczenie zielonego dla pieszych
  digitalWrite(9, LOW); // Wylaczenie czerwonego dla pieszych
  digitalWrite(4, INPUT_PULLUP); //Przycisk jako wejscie, wlaczenie swiatel
  digitalWrite(3, INPUT_PULLUP); //przycisk migania pieszym
}
 
void loop()
{
  if (digitalRead(4) == LOW) { //Jeśli przycisk wciśnięty
    digitalWrite(7, HIGH); //Włącz diode czerwona
    digitalWrite(8, HIGH); //wlacz zielone na pieszych
    delay(4000);
       
    while (digitalRead(3) == HIGH)
    digitalWrite(7, HIGH); //Włącz diode czerwona
    digitalWrite(8, LOW); //Miganie zielonego
    delay(500);
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(8, LOW);
    delay(500);
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(8, LOW);
    delay(500);
    digitalWrite(8, HIGH);
    delay(500);
    digitalWrite(8, LOW);
    
    digitalWrite(7, HIGH);  //wlacz siwatlo czerwone 
    digitalWrite(6, HIGH); //Wlacz swiatlo zolte
    digitalWrite(9, HIGH); //zmiana czerwone dla pieszych
    delay(2000);
    
    digitalWrite(7, LOW); //Wylacz czerwone
    digitalWrite(6, LOW); //Wylacz zolte
    digitalWrite(5, HIGH); //Wlacz zielone
    digitalWrite(9, HIGH); //zmiana czerwone dla pieszych
    delay(5000);

    while (digitalRead(3) == HIGH)
    digitalWrite(5, HIGH); //Włącz diode czerwona
    digitalWrite(9, LOW); //Miganie czerwonego
    delay(500);
    digitalWrite(9, HIGH);
    delay(500);
    digitalWrite(9, LOW);
    delay(500);
    digitalWrite(9, HIGH);
    delay(500);
    digitalWrite(9, LOW);
    delay(500);
    digitalWrite(9, HIGH);
    
    
    digitalWrite(5, LOW); //wylacz zielone
    digitalWrite(6, HIGH); //wlacz zolte
    digitalWrite(9, HIGH); //Czerwone dla pieszych
    delay(1000);
    
    digitalWrite(6, LOW); //wylacz zolte
    digitalWrite(7, HIGH); //Wlacz czerwone
    digitalWrite(8, HIGH); //wlacz zielone dla pieszych
    digitalWrite(9, LOW); //wylacz czerowne dla pieszych
    delay(10000);
    
    digitalWrite(7, LOW); //Wyłączenie diody czerwonej
    digitalWrite(6, LOW); // Wylaczenie diody zoltej
    digitalWrite(5, LOW); //Wylaczenie diody zielonej
    digitalWrite(8, LOW); //Wylaczenie zielonego dla pieszych
    digitalWrite(9, LOW); //Wylaczenie czerownego dla piezych
  } 
  
}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Dnia 4.01.2020 o 14:20, BHBmacieg napisał:

Są to moje pierwsze "Koty za płoty" z arduino i próba przypomnienia sobie podstaw programowania czy to z uczelni czy z własnych prób, więc w kodzie może być masa błędów i wymaga on z pewnością dużej dozy optymalizacji. 

Super, bardzo fajny pomysł na rozbudowanie projektu! Powodzenia podczas dalszych eksperymentów 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam, napisałam program wejścia układu w praktyce i zbudowałam wszystko na płytce to dioda cały czas świeci. Nawet skopiowałam program i dalej to samo. Tylko nie za bardzo wiem jak podłączyć przycisk i jedną nogę podłączyłam do wprowadzenia nr. 7, a drugą do masy minusa. Liczę na szybką pomoc. 

Edytowano przez Szatanak

Udostępnij ten post


Link to post
Share on other sites

@Szatanak witam na forum!

11 godzin temu, Szatanak napisał:

a drugą do masy minusa.

Do linii na płytce stykowej czy do GND Arduino? Może spróbuj użyć inne przewody, czasami coś w nich wewnętrznie nie zwiera.

Jak nie zadziała to proszę podeślij zdjęcie to coś pomyślimy.

Udostępnij ten post


Link to post
Share on other sites
7 godzin temu, Gieneq napisał:

@Szatanak witam na forum!

Do linii na płytce stykowej czy do GND Arduino? Może spróbuj użyć inne przewody, czasami coś w nich wewnętrznie nie zwiera.

Jak nie zadziała to proszę podeślij zdjęcie to coś pomyślimy.

Po prostu podłączyłam do tej samej linii minus i wprowadzenie nr.7. Naprawiłam to i już skończyłam ten rozdział.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Chciałbym się upewnić, jak działa INPUT_PULLUP, bo w kursie jest pewna nieścisłość. W opisie tego trybu piszecie, że jest wymagany rezystor podciągający. Jest nawet odpowiedni schemat i wydaje się to logicze.

a1.png

Ale już w połączeniu praktycznym nie ma tego rezystora. To powinien być czy nie? Jeśli skonfiguruję wejście jako INPUT, to przy rozwartym styku będzie na nim stan niski, a z INPUT_PULLUP będzie wysoki? Czy jednak muszę te stany początkowe wymusić rezystorem do VCC albo do GND? Pytam, bo jeszcze nie mogę sam sprawdzić - na razie teoria i nie mam sprzętu.

Udostępnij ten post


Link to post
Share on other sites

@Jaroodd tak PULL-UP wymaga rezystora podciągającego do zasilania. Nie ma go na schemacie bo jest ustawiony w konfiguracji wyprowadzenia - w ten sposób wewnątrz mikrokontrolera następuje takie połączenie.

void setup() {
  pinMode(8, OUTPUT); //Dioda jako wyjście
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  digitalWrite(8, LOW); //Wyłączenie diody
}

Możesz też ustawić wejście jako samo INPUT, wtedy jest w stanie wysokiej impedancji i jeżeli mowa o przycisku to spowoduje to losowe odczyty. Żeby temu zapobiec trzeba dodać zewnętrzny rezystor podciągający do zasilania lub masy.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Hej. Mam wątpliwości czy mój układ z ostatniego ćwiczenia działa poprawnie. Czy światła mają zmieniać się (po kolei, wg pętli) tylko gdy swich jest wciśnięty? Tak to u mnie właśnie działa -czy tak ma być?

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Filipo Hej, pozwolę sobie zacytować:

Jak to działa?

  1. Uruchamiamy świecenie diodami zgodnie z pewną sekwencją,
  2. wchodzimy w pętlę while(), która jest tuż poniżej,
  3. pętla jest pusta, więc program cały czas kręci się w koło i...  nic nie robi,
  4. dopiero po wciśnięciu przycisku (niespełnienie warunku) program wychodzi z pętli,
  5. zapalana jest kolejne sekwencja i sytuacja się powtarza.
12 godzin temu, Filipo napisał:

Czy światła mają zmieniać się (po kolei, wg pętli) tylko gdy swich jest wciśnięty?

Tak 🙂 Autor kursu oczekiwał, że jak przycisk będzie wciskany to będą się zmieniać, ale jak na stałe go przytrzymasz to warunek wyjścia z pętli też zostanie spełniony, tak jakby tych pętli w ogóle nie było. Dzieje się tak gdyż warunek dotyczy stanu wyprowadzenia (przycisku), inaczej byłoby z wykrywaniem zmian stanu - przerwaniami.

Edytowano przez Gieneq

Udostępnij ten post


Link to post
Share on other sites

Moja wersja "świateł drogowych". Trochę uproszczona w porównaniu do rozwiązania @BHBmacieg. Nie ma świateł dla pieszych, jest tylko przycisk z przejścia i światła dla samochodów.

void setup() {
  pinMode(8, OUTPUT); // LED czerwona
  pinMode(9, OUTPUT); // LED zolta
  pinMode(10, OUTPUT); // LED zielona
  pinMode(2, INPUT_PULLUP); // Przycisk
  digitalWrite(8, LOW); // LED czerwona
  digitalWrite(9, LOW); // LED zolta
  digitalWrite(10, HIGH); // LED zielona
  }
 
void loop() {
  if ( digitalRead(2) == LOW){ // Przycisk
  digitalWrite(8, LOW); // LED czerwona
  digitalWrite(9, HIGH); // LED zolta
  digitalWrite(10, LOW); // LED zielona  
  }
  else {
    if ( digitalRead(9) == HIGH) { // czy zolta dioda swieci?
       delay(5000); // czas swiatla zoltego
       digitalWrite(8, HIGH); // LED czerwona
       digitalWrite(9, LOW); // LED zolta
       digitalWrite(10, LOW); // LED czerwona
       delay(15000); // czas swiatla czerwonego
       digitalWrite(9, HIGH); // LED zolta
       delay(5000); // czas swiatla czerwonego z zoltym
       digitalWrite(8, LOW); // LED czerwona
       digitalWrite(9, LOW); // LED zolta
       digitalWrite(10, HIGH); // LED zielona  
       } 
     }
}

Zadałem sobie pytanie, jak mogę sprawdzić stan wyjścia i to wykorzystać w programie. Sprawdziłem też przydatną cechę instrukcji IF, czyli możliwość ustawienia lub zresetowania jakiegoś bitu na stałe, wykorzystując do tego krótki impuls. W sumie rzeczy oczywiste, ale może nie dla każdego.

Udostępnij ten post


Link to post
Share on other sites

@Jaroodd fajnie że masz zacięcie do nauki, tak trzymaj.

8 godzin temu, Jaroodd napisał:

W sumie rzeczy oczywiste, ale może nie dla każdego.

Czasem nawet wynalezienie koła na nowo, choć mało odkrywcze, to może być bardzo pouczające. 🙂 

Udostępnij ten post


Link to post
Share on other sites

bardzo fajny projekt z światłami drogowymi tylko warto dodać wyłączenie świateł pod koniec 😃

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...