Arduino Polska Forum
Sterowanie przez IR problem z case - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: Sterowanie przez IR problem z case (/watek-sterowanie-przez-ir-problem-z-case)



Sterowanie przez IR problem z case - kataklysm - 31-08-2019

Witam, napisałem program oparty o pętle case, działa bez zarzutu ale teraz chciałbym dołożyć sterowanie menu przez ir. Problem w tym, że wszystkie przykłady z ir także posiadają case. Nie wiem jak to połączyć, próbowałem już różnych możliwości ale bez skutku. Czy da się jakoś odczytywać przesłane kody ir za pomocą if? Tak abym mógł w case który aktualnie działa wyzwolić if jeśli odbiornik odczyta jakiś sygnał ? Np if (sygnał przejdź w prawo) {digitalWrite(LED, HIGH);}


RE: Sterowanie przez IR problem z case - kaczakat - 01-09-2019

Case można zagnieżdżać, a by było bardziej czytelnie można wywołać funkcję, w której jest wywoływana funkcja, w której... itd., a w każdej może być case. Ifami można zrobić dokładnie to samo, case ma węższe zastosowanie.


RE: Sterowanie przez IR problem z case - kataklysm - 01-09-2019

(01-09-2019, 06:16)kaczakat napisał(a): Case można zagnieżdżać, a by było bardziej czytelnie można wywołać funkcję, w której jest wywoływana funkcja, w której... itd., a w każdej może być case. Ifami można zrobić dokładnie to samo, case ma węższe zastosowanie.

Kod:
  switch (control) {
    case 1:  
        //CD

        if (irrecv.decode(&results)) {

          if (results.value == 0xC1A2FA05) {

            digitalWrite(AUX, HIGH);
          }
        }


        lcd.setCursor(2, 0);
        lcd.print("AUDIO SYSTEM");
        lcd.setCursor(0, 1);
        lcd.print("SEL.INPUT: CD");


        if (digitalRead(BUTTON) == LOW) {
          digitalWrite(AUX, LOW);
          digitalWrite(LAMP, LOW);
          digitalWrite(CD, HIGH);

        }
        break;
     

Chodzi mi o taki fragment kodu:
Kod:
if (irrecv.decode(&results)) {

          if (results.value == 0xC1A2FA05) {

            digitalWrite(AUX, HIGH);
          }
        }

kiedy wstawię go do pętli void loop bezpośrednio to ten kod działa zuepłnie poprawnie. Natomiast kiedy jest w case tak jak wyżej to już nie działa. Proszę o pomoc


RE: Sterowanie przez IR problem z case - kaczakat - 01-09-2019

Zagnieżdżenie nie wpływa na logikę działania, ale czytelność jest taka sobie i łatwo o pomyłkę. Jak już to lepiej wrzucić kolejny switch case w procedurę i tylko ją wkleić do wyższego poziomu.
Żeby to  digitalWrite(AUX, HIGH)  zostało wykonane muszą równocześnie zaistnieć po kolei wszystkie warunki: control=1, musi być jakiś result i results.vaule=0xC1A2FA05.
Może po prostu opisz szerzej co zamierzasz w tym programie i czego oczekujesz. Może po prostu sterowanie powinno być równoległe, jeden case działa niezależnie używając przycisków, drugi niezależnie sterowanie IR. W obu przypadkach powinieneś też obsługiwać drgania styków, tak by jedno naciśnięcie przycisku czy to na pilocie IR czy na klawiaturze wywoływało dokładnie jedną akcję + ewentualnie serię powtórzeń po określonym czasie.


RE: Sterowanie przez IR problem z case - kataklysm - 01-09-2019

(01-09-2019, 20:30)kaczakat napisał(a): Zagnieżdżenie nie wpływa na logikę działania, ale czytelność jest taka sobie i łatwo o pomyłkę. Jak już to lepiej wrzucić kolejny switch case w procedurę i tylko ją wkleić do wyższego poziomu.
Żeby to  digitalWrite(AUX, HIGH)  zostało wykonane muszą równocześnie zaistnieć po kolei wszystkie warunki: control=1, musi być jakiś result i results.vaule=0xC1A2FA05.
Może po prostu opisz szerzej co zamierzasz w tym programie i czego oczekujesz. Może po prostu sterowanie powinno być równoległe, jeden case działa niezależnie używając przycisków, drugi niezależnie sterowanie IR. W obu przypadkach powinieneś też obsługiwać drgania styków, tak by jedno naciśnięcie przycisku czy to na pilocie IR czy na klawiaturze wywoływało dokładnie jedną akcję + ewentualnie serię powtórzeń po określonym czasie.
Dzięki za pomoc wszystko już działa. Sterowanie enkoderem w menu na osobnym switch case i sterowanie ir na osobnym. Dodałem jeszcze wygaszenie ekranu po 60s bezczynności oraz powrót podświetlenie po uruchomieniu enkoder bądź naciśnięciu przycisku na pilocie. Mimo, że zrobiłem to wcześniej to i tak dzięki za pomoc bo nie wiedziałem, że switch case można umieszczać jeden w drugim.