• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Obsługa i wyświetlanie prostego MENU na LCD
#1
Dzień Dobry,

posiadam pewien kod który dostępny był w internecie, chodzi o proste i intuicyjne menu, gdzie posiadam dwie opcje do wyboru. Steruje góra dół za pomocą dwóch przycisków a trzeci przycisk służy jako "enter". Menu zostało napisane za pomocą switch (zmienna) case :

Nie umiem sobie poradzić z "akcją" która będzie się działa po wyborze jednej z dwóch opcji. 
W funkcji void action1() chcę abym na LCD widział moje interkacje z programem, tzn w innej częsci kod, program zlicza 
"ilość przejazdów" (kliknięcie w przycisk) aż do 5, za 5-tym kliknieciem urchomiony zostaje przekaznik a za 6-tym znowu wracamy do punktu wyjscia czyli 1. i znowu klikam 1-2-3-4-5>przekaznik.

To działanie ma trwać aż do momentu kiedy wcisnę przycisk czwarty: ESC. który wróci do menu.

Nie potrafię napisać kodu który po wejsciu w dany tryb dostępny w menu, będzie w niej tak długo aż wcisnę klawisz ESC(czwarty przycisk). W funkcji action coś tam napisałem, w miarę to działa ale na wyświetlaczu lcd widzę migotające napisy.. interakcja działa (tzn widzę jak zliczają się impulsy ale całość migota na lcd), nie wiem gdzie w tym kodzie umiejscowić funkcje wyświetlanie();. Aby na LCD nie migotała cała ta funkcja.

Byłbym wdzięczny za każdą pomoc. Tworzę projekt który w krótce chciałbym tu przedstawić.
Pozdrawiam


Cały kod poniżej:
Kod:
/////////////////////////////////////////////////////////////////////////
void loop()
  { 
    if(!digitalRead(downButton))
      {
        menu++;
        updateMenu();
        delay(100);
        while(!digitalRead(downButton));
      }
    if(!digitalRead(upButton))
      {
        menu--;
        updateMenu();
        delay(100);
        while(!digitalRead(upButton));
      }
    if(!digitalRead(selectButton))
      {
        selectAction();
        updateMenu();
        delay(100);
        while(!digitalRead(selectButton));
      }
  }
/////////////////////////////////////////////////////////////////////////
void updateMenu()
  {
      switch(menu)
        {
          case 0:
          menu = 1;
          break;

          case 1:
          lcd.clear();
          lcd.print(">Automat");
          lcd.setCursor(0,1);
          lcd.print(" Recznie");
          break;

          case 2:
          lcd.clear();
          lcd.print(" Automat");
          lcd.setCursor(0,1);
          lcd.print(">Recznie");
          break;

          case 3:
          menu = 2;
          break;
        }
  }
/////////////////////////////////////////////////////////////////////////
void selectAction()
  {
    switch(menu)
    {
      case 1:       
      action1();           
      break;
   
      case 2:
      action2();
      break;
    }   
  }
/////////////////////////////////////////////////////////////////////////
void action1()
  {           
    przejazdy = 1;
    if(digitalRead(backButton) == HIGH)
      {
       
        while((digitalRead(backButton)== HIGH))
        {
          sygnalizacja();
         
     
          if(przejazdy == wybrana_ilosc)
              {
                digitalWrite(przekaznik1,LOW);
              } 
          else if(przejazdy == wybrana_ilosc + 1)
              {
                przejazdy = 1;
              }
          else if(przejazdy <= 0)
              {
                przejazdy = 1;
              }
          else
              {
                digitalWrite(przekaznik1,HIGH);
              }       
              wyswietlanie();
        }
        while(digitalRead(backButton)== HIGH);             
      } 
  }

void wyswietlanie()
  {
    lcd.clear();
    lcd.setCursor(0, 0); //Ustawienie kursora
    lcd.print("Przejazd: "); //Wyświetlenie tekstu
    lcd.setCursor(10, 0); //Ustawienie kursora
    lcd.print(przejazdy); //Wyświetlenie tekstu
    lcd.setCursor(0, 1); //Ustawienie kursora
    lcd.print("Rytm: "); //Wyświetlenie tekstu
    lcd.setCursor(10, 1); //Ustawienie kursora
    lcd.print(wybrana_ilosc); //Wyświetlenie tekstu
  }
 
Odpowiedź
#2
Tu masz przykład menu: https://starter-kit.nettigo.pl/2017/04/m...aczu-16x2/.
Wywal delay z kodu, jak nie ogarniasz jak pisać kod bez stosowania delay, obsługiwać bez delay przycisków to porywasz się z motyką na słońce, bez uzupełnienia podstaw będzie tylko frustracja.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
To ja się będę czepiał na początek.

1) W niektórych miejscach kodu piszesz:
Kod:
if(!digitalRead(downButton))
w innych:
Kod:
if(digitalRead(backButton) == HIGH)
zdecyduj się na jedną wersję i tego się trzymaj - nie rób burdelu tylko dlatego, że coś skejasz z kilku gotowców. Jak będziesz chciał robić bardziej skomplikowane projektu to po prostu zginiesz z takim czymś.

2) Nie stosuj delay! To najgorsze, co można zrobić swojemu mikrokontrolerowi

3) Kolejny twór, którego osobiście bym nie zastosował:
Kod:
while(!digitalRead(downButton));
czyli program zapętla się w czasie trzymania przycisku i nic nie może zrobić innego

4) Tutaj jest dla mnie niejasne:
Kod:
    if(!digitalRead(selectButton))
      {
        selectAction();
        updateMenu();
        delay(100);
        while(!digitalRead(selectButton));
      }
skoro funkcja selectAction() nie zmienia wartości zmiennej menu to po kiego grzyba po niej jest updateMenu()?

5) I dalej w kodzie (moje komentarze):

Kod:
void action1()

  {           

    przejazdy = 1;

    if(digitalRead(backButton) == HIGH) // po co Ci ten if skoro dalej masz while sprawdzający ten sam warunek?

      {

        while((digitalRead(backButton)== HIGH))

        {

          sygnalizacja();

         
          if(przejazdy == wybrana_ilosc)

              {

                digitalWrite(przekaznik1,LOW);

              } 

          else if(przejazdy == wybrana_ilosc + 1)

              {

                przejazdy = 1;

              }

          else if(przejazdy <= 0)

              {

                przejazdy = 1;

              }

          else

              {

                digitalWrite(przekaznik1,HIGH);

              }       

              wyswietlanie(); // czy to miało omijać wszystkie ify i else?

        }

        while(digitalRead(backButton)== HIGH); // drugi raz ten sam while?         

      } 


Przeanalizuj przykłady dostępne w Arduino IDE: Przykłady > Digital > Debounce albo skorzystaj z gotowej biblioteki. W przypadku przycisków masz do czynienia z drganiami styków, które musisz wziąć pod uwagę. Dobrym pomysłem jest to, co pisze kolega kaczakat - zamiast wyważać otwarte drzwi zobacz jak to jest rozwiązane u innych.

Przede wszystkim postaraj się zrozumieć co robi kod, który napisałeś.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości