Skocz do zawartości

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


Pomocna odpowiedź

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

void loop()
{
  if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty
    digitalWrite(8, HIGH); //Włącz diodę
  } else { //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
    digitalWrite(8, LOW); //Wyłącz diodę
  }
}

Co źle?

 

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

Witam!

Zaczynam kolejny kurs i już po pierwszej lekcji. Przykłady przerobione, nawet samemu je coś modyfikowałem. Jednak ciekawi mnie jedna rzecz: Co by było gdyby wejście dla przycisku zadeklarować jako INPUT, zamiast INPUT_PULLUP? Podejrzewam, że w chwili wciśnięcia przycisku doszłoby do zwarcia i uszkodzenia przycisku albo i nawet Arduino. Potrzeba pewnie byłoby do obwodu dodać rezystor i kondensator dla bezpiecznego działania. Nie chciałbym tego samemu sprawdzać, dlatego byłbym wdzięczny za odpowiedź. Pozdrawiam.

11 godzin temu, Maciek_S napisał:

Podejrzewam, że w chwili wciśnięcia przycisku doszłoby do zwarcia i uszkodzenia przycisku albo i nawet Arduino.

@Maciek_S nie, nic się nie uszkodzi 🙂 Po prostu wyniki odczytywane z Arduino będą losowe, bo pin będzie odczytywał zakłócenia z otoczenia jako wciśnięcia przycisku. Wewnętrzny rezystor podciągający pozwala ustawić domyślny stan na wejściu. Analogicznie mógłbyś wykorzystać zewnętrzny rezystor pull-up lub rezystor pull-down.

  • Pomogłeś! 1
  • 4 tygodnie później...
  • 2 miesiące później...
(edytowany)

pytanie do zadania domowego 1.2

jak ma wyglądać program aby jedna dioda zapaliła się jako pierwsza na przez 2 sek, potem gasła na 2 sek. a w tym czasie druga dioda się pali gdy pierwsza zgasła ? (czyli diody świecą się na przemian), bo ten zapis tak nie działa:

void setup() {

pinMode(8, OUTPUT);



pinMode(7, OUTPUT);



}



void loop() {

  digitalWrite(8, HIGH);

  delay(2000);

  digitalWrite(8, LOW);

  delay(2000);



  digitalWrite(7, LOW);

  delay(2000);

  digitalWrite(7, HIGH);

  delay(2000);

}



😑

Edytowano przez flashback

@flashback to jest jedno z tych zadań, które pozornie jest proste, ale wcale takie nie jest. Musisz pamiętać, że mikrokontroler wykonuje kolejne instrukcje krok, po kroku. Jedna po drugiej. Nie da się w taki sposób łatwo zrealizować dwóch równoległych zadań (miganie jednej i drugiej diody). Da się to zrealizować inaczej, ale poczekaj jeszcze trochę, aż poznasz różne pętle - wtedy będzie można już coś wykombinować. Prawdziwie rozwiązanie tego problemu jest jednak możliwe dopiero po poznaniu funkcji millis, która została opisana w kontynuacji tego kursu.

@flashback jak wspomniał Trekker, instrukcje wykonywane są krok po kroku.
U Ciebie w tej chwili wygląda to tak:
Zapal diodę A.
Zaczekaj 2 sek.
Zgaś diodę A.
Zaczekaj 2 sek.
Zapal diodę B.
Zaczekaj 2 sek.
Zgaś diodę B.
Zaczekaj 2 sek.

Jak widzisz, masz dużo czekania, w tym pomiędzy zmianami stanu poszczególnych diod, dlatego gasząc jedną diodę masz przerwę przed zapaleniem się drugiej.
Aby na tym etapie migać diodami naprzemiennie, musisz zmianę stanu obu diod wykonać "jednocześnie".

Zapal diodę A.
Zgaś diodę B.
Czekaj 2 sek.
Zgaś diodę A.
Zapal diodę B.
Czekaj 2 sek.
 

  • Lubię! 2
  • 2 tygodnie później...
(edytowany)

Hej,

próbowałem zrobić taki myk z ćwiczeniem na symulacji świateł drogowych aby sekwencja zielone-żółte-czerwone itd. działała w pętli, a w momencie wciśnięcia i przytrzymania przycisku migało tylko żółte światło. Po zwolnieniu sekwencja powinna wrócić do normy. Nie mogę tego ogarnąć:) czy da się z zastosowaniem if-else i while zrobić taki program? Pozdrowionka

edit.

kod wygląda następująco:

void setup() {
  pinMode(6, OUTPUT); //pin 6 ZIELONE 
  pinMode(7, OUTPUT); //pin 7 żółte
  pinMode(8, OUTPUT); //pin 8 czerwone
  
  pinMode(10, INPUT_PULLUP); //pin 10 jako wejście
  
  digitalWrite(6, LOW); // zielona OFF
  digitalWrite(7, LOW); // żółta OFF
  digitalWrite(8, LOW); // czerwona OFF
}

void loop() 
{
  if (digitalRead(10) == LOW) {
  digitalWrite(6, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, HIGH);
  delay(500);
  digitalWrite(7, LOW);
  delay(500);
  }

 else {
  
 digitalWrite(6, HIGH); //Zielone ON
 digitalWrite(7, LOW); //Zółte OFF
 digitalWrite(8, LOW); //czerwone OFF
 
 delay(5000);
 
 digitalWrite(6, LOW); //Zielone OFF
 digitalWrite(7, HIGH); //Zółte ON
 digitalWrite(8, LOW); //czerwone OFF
 
delay(1000);

 digitalWrite(6, LOW); //Zielone OFF
 digitalWrite(7, LOW); //Zółte OFF
 digitalWrite(8, HIGH); //czerwone ON
 
 delay(5000);
 
 digitalWrite(6, LOW); //Zielone OFF
 digitalWrite(7, HIGH); //Zółte ON
 digitalWrite(8, HIGH); //czerwone ON
 
 delay(1000);
  }

}

program przechodzi w trym migającego żółtego na końcu całej pętli jeśli przycisk jest włączony, ale jak zrobić żeby przechodził w miganie za każdym razem jak tylko przycisk zostanie naciśnięty.

Edytowano przez wachman

@wachman witam na forum 🙂 Taka operacja nie jest możliwa w łatwy sposób na tym poziomie - później poznasz rozwiązania, które pozwolą to zrobić. Aktualnie program wykonuje się krok, po kroku, więc warunek jest sprawdzony dopiero po wykonaniu całej pętli.

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