Skocz do zawartości

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


Komentator

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?

 

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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

Link do komentarza
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!

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

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.