Skocz do zawartości

Sterowanie przyciskami w Arduino


paradis313

Pomocna odpowiedź

Cześć. Na początku chciałbym z góry przeprosić za prawdopodobnie banalny temat ale mam z nim problem. Otóż chciałbym stworzyć program, w którym będę obsługiwał dwie diody za pomocą dwóch przycisków. Do tego muszę dołożyć (zadanie na studia) taki zapis, że jeżeli dioda 1 się świeci to włączając diodę 2 ta pierwsza gaśnie i na odwrót.  Jak można takie coś rozwiązać? Byłbym wdzięczny za podpowiedzi.

 

P.S Arduino używałem dwa lata temu i praktycznie wszystkiego zapomniałem. Wczoraj prowadzący zajęcia wymyślił sobie, że warto zrobić takie ćwiczenie jednakże praktycznie nic w tym temacie nie wytłumaczył.

Oto kod:

boolean buttonState1 = true; // aktualny stan zaświecenia diody
int buttonPin1 = 10; //pin do odczytu stanu przycisku
int led1 = 7;   //pin do obsługi diody

boolean buttonState2 = true; // aktualny stan zaświecenia diody
int buttonPin2 = 9; //pin do odczytu stanu przycisku
int led2 = 8;   //pin do obsługi diody

void setup() {

pinMode(led1, OUTPUT); //Dioda jako wyjście
pinMode(buttonPin1, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(led1, HIGH); //Wyłączenie diody
  
pinMode(led2, OUTPUT); //Dioda jako wyjście
pinMode(buttonPin2, INPUT_PULLUP); //Przycisk jako wejście
digitalWrite(led2, HIGH); //Wyłączenie diody
}

void loop() 
{
  przycisk1();
  przycisk2();

 
}

void przycisk1 ()
{
  if (digitalRead(buttonPin1) == LOW) {
     delay(20); //20ms na obsługę drgań styków
     buttonState1 = !buttonState1; //ustawienie przeciwnego stanu diody
     if (buttonState1 == true){
       digitalWrite(led1, buttonState1);
     }  else {
       digitalWrite(led1, buttonState1);
     }
     while (digitalRead(buttonPin1) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków
     }
}

void przycisk2 ()
{
  if (digitalRead(buttonPin2) == LOW) {
     delay(20); //20ms na obsługę drgań styków
     buttonState2 = !buttonState2; //ustawienie przeciwnego stanu diody
     if (buttonState2 == true){
       digitalWrite(led2, buttonState2);
     }  else {
       digitalWrite(led2, buttonState2);
     }
     while (digitalRead(buttonPin2) == LOW); //czekamy tak długo, jak długo wciśnięty jest przycisk
     delay(20); //20ms na obsługę drgań styków
     }
}

 

Link do komentarza
Share on other sites

@paradis313 witam na forum! Skoro to zadanie na studia to nie będziemy robić za Ciebie - daj znać na czym dokładnie utknąłeś to chętnie doradzimy 🙂 Jak działa w praktyce Twój aktualny program i czego mu brakuje, aby działał poprawnie?

Link do komentarza
Share on other sites

@Treker oczywiście, nie chodzi mi o to żeby zrobić coś za mnie. Aktualnie program działa w ten sposób, że po wciśnięciu przycisku 1 włącza się / gaśnie dioda 1. Analogicznie przycisk 2 / dioda 2. Problem w tym, że nie mam bladego pojęcia jak zrealizować warunek, że jeżeli dioda 1 jest włączona to przy włączeniu diody 2, dioda 1 gaśnie. Jeżeli dioda 2 jest włączona, to przy włączeniu diody 1, dioda 2 gaśnie.

Jeżeli ten zapis, który podałem oczywiście jest poprawny. 

Dorzucę może jeszcze screen z TinkerCADa:

image.thumb.png.cfa2bf8e607bbab4ad9fb12390b277fc.png

Jedyne co mi teraz przychodzi na myśl, to w kodzie przy załączeniu diody 1 dopisać wyłączenie diody 2. Analogicznie przy załączeniu diody 2 dopisać wyłączenie diody 1. Czy to jest dobre podejście?

Link do komentarza
Share on other sites

const int BT1 = 10; // Pin przycisku 1
const int BT2 = 11; // Pin przycisku 2
const int LED1 = 8; // Pin diody 1
const int LED2 = 9; // Pin diody 2
bool BT1_State = LOW; // zmienna odczytu przycisku 1
bool BT2_State = LOW; // zmienna odczytu przycisku 2
bool LED1_State = LOW; // zmienna odczytu diody 1
bool LED2_State = LOW; // zmienna odczytu diody 2
void setup() {
pinMode(LED1, OUTPUT); //Dioda 1 jako wyjscie
pinMode(LED2, OUTPUT); // Dioda 2 jako wyjscie
pinMode(BT1, INPUT_PULLUP); // Przycisk 1 jako wejscie
pinMode(BT2, INPUT_PULLUP); // Przycisk 2 jako wejscie
}
void loop() {
// odczytywanie stanow przyciskow 1 i 2
BT1_State = digitalRead(BT1);
BT2_State = digitalRead(BT2);
// Warunek sprawdzajacy czy przycisk 1 jest wcisniety, jesli tak stan jest LOW
if (BT1_State == LOW && LED1_State == LOW) {
LED1_State = HIGH;
LED2_State = LOW;
}
//Analogicznie przycisk 2
if (BT2_State == LOW && LED2_State == LOW) {
LED2_State = HIGH;
LED1_State = LOW;
}
digitalWrite(LED1, LED1_State); // wlacz / wylacz diode 1
digitalWrite(LED2, LED2_State); // wlacz / wylacz diode 2
}

Tutaj podaje rozwiązanie problemu. Temat można zamknąć.

  • Lubię! 1
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

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.