Skocz do zawartości

Problem z kodem menu na Arduino


Gibcio2020

Pomocna odpowiedź

Witam !

Do stworzenia menu posłużyła mi strona: https://starter-kit.nettigo.pl/2017/04/menu-wyswietlaczu-16x2/, dorobiłem funkcję żeby pokazywała mi odległość mierzoną z czujnika odległościowego, odległość się pokazuje lecz się nie zmienia, w tym całym kodzie menu znajduje się fragment który sprawia że menu na lcd nie odświerza się na bierząco i to to jest przyczyną. Jak zakomentuję ten fragment  kodu to z lcd nie da się nic zczytać, bo szybko mruga, jakby się zamazywał, może ktoś coś poradzić?

Z góry dziękuje

Link do komentarza
Share on other sites

(edytowany)
#include <LiquidCrystal.h>
  
#define TRIGGER 23 // Trigger Pin
#define ECHO A7 // Echo Pin

const int RS = 34, EN = 35, D4 = 30, D5 = 31, D6 = 32, D7 = 33;
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);

//---------------------------------------------- struktura menu -------------------------------------------------------//
typedef struct {
  String label;                 // Nazwa pozycji w menu, submenu
  int option;                   // Typ menu: 1 - action, 2 - Submenu
  int subMenuHandle;            // Wskaznik do submenu
  void (*handler)();            // Wskaznik do funkcji
} MENU;

MENU menu[1];

int menuPosition = 0;           // Aktualnie wybrana pozycja w menu
int menuSize;                   // Rozmiar menu
boolean menuLowerLevel = false; // Informuje czy menu glowne


typedef struct {
  String label;                 // Nazwa pozycji w submenu
  int option;                   // Typ podmenu
  int handle;                   // Wskaznik
  void (*handler)();            // Wskaznik do funkcji
} SUBMENU;

SUBMENU subMenu[0];         // Ilosc pozycji w menu

int subMenuPosition = 0;           // Aktualnie wybrana pozycja w sub menu
int subMenuSize;                   // Rozmiar sub menu
boolean subMenuLowerLevel = false; // Informuje czy sub menu glowne

boolean subMenuEnter = false;

int dystans;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  
  menu[0] = {"Robot", 1, 0, Odleglosc};
  
  menuSize = sizeof(menu) / sizeof(MENU);
  subMenuSize = sizeof(subMenu) / sizeof(SUBMENU);
}

void loop()
{
  int odczyt_key = analogRead(0);
  
  static int isPressedSince = 0;
  static unsigned long lastRead = 0;
  
  if(odczyt_key > 1000 && lastRead > 0)
  {
    isPressedSince = 0;
    return;
  }

  isPressedSince++;
  lastRead = millis();
  
  lcd.home();
  lcd.clear();

  if(menuLowerLevel == false)
  {
    lcd.print("Menu glowne: ");
    lcd.setCursor(0,1);
    
    if(menu[menuPosition].option != 1)
    {
      lcd.print("> ");
    }
    
    lcd.print(menu[menuPosition].label);
  }
  
  if(menuLowerLevel == true)
  {
    lcd.print(menu[menuPosition].label);
    lcd.setCursor(0,1);

    if(menu[menuPosition].option == 2)
    {
      if(menu[menuPosition].subMenuHandle == subMenu[subMenuPosition].handle)
      {
        lcd.home();
        lcd.clear();
        
        lcd.print(menu[menuPosition].label+": ");
        lcd.setCursor(0,1);
        lcd.print(subMenu[subMenuPosition].label);
      }
    }
  }

  // DOWN
  if(odczyt_key > 250 && odczyt_key < 450)
  {
    if(menuLowerLevel == true)
    {
      if(subMenuPosition < subMenuSize)
      {
        subMenuPosition = subMenuPosition + 1;
      }
      
      if(subMenuPosition == subMenuSize)
      {
        subMenuPosition = 0;
      }
    }

    if(menuLowerLevel == false)
    {
      if(menuPosition < menuSize)
      {
        menuPosition = menuPosition + 1;
      }

      if(menuPosition == menuSize)
      {
        menuPosition = 0;
      }
    }
  }

  // UP
  if(odczyt_key > 50 && odczyt_key < 250)
  {
    if(menuLowerLevel == true)
    {
      if(subMenuPosition > 0)
      {
        subMenuPosition = subMenuPosition - 1;
      }
      
      if(subMenuPosition == 0)
      {
        subMenuPosition = 0;
      }
    }

    if(menuLowerLevel == false)
    {
      if(menuPosition > 0)
      {
        menuPosition = menuPosition - 1;
      }

      if(menuPosition == 0)
      {
        menuPosition = 0;
      }
    }
  }
  
  // RIGHT
  if(odczyt_key < 50)
  {
    if(menu[menuPosition].option == 1)
    {
      menuLowerLevel = false;
    }

    if(menu[menuPosition].option == 2)
    {
      if(menu[menuPosition].subMenuHandle == subMenu[subMenuPosition].handle)
      {
        menuLowerLevel = true;
      }
    }
  }

  // LEFT
  if(odczyt_key > 450 && odczyt_key < 700)
  {
    if(menuLowerLevel == true)
    {
      menuLowerLevel = false;
    }

    if(menuLowerLevel == false)
    {
      menuLowerLevel = false;
    }
  }

  // SELECT
  if(odczyt_key > 700 && odczyt_key < 850)
  {
    lcd.home();
    lcd.clear();
    
    if(menuLowerLevel == true)
    {
       lcd.print(subMenu[subMenuPosition].label+": ");
       lcd.setCursor(0,1);
    }

    if(menuLowerLevel == false)
    {
      lcd.print(menu[menuPosition].label+": ");
      lcd.setCursor(0,1);
      
      if(menu[menuPosition].handler != NULL && menu[menuPosition].option == 1)
      {
        return(*(menu[menuPosition].handler))();
      }
    }
  }

  // NULL
  if(odczyt_key < 1000)
  {
    
  }
}

void Odleglosc()
{
  digitalWrite(TRIGGER, HIGH);
  digitalWrite(TRIGGER, LOW);
  
  int czas = pulseIn(ECHO, HIGH);
  dystans = czas / 58;
}

 

Edytowano przez Gibcio2020
  • Lubię! 1
Link do komentarza
Share on other sites

19 godzin temu, Gibcio2020 napisał:

Jak zakomentuję ten fragment  kodu to z lcd nie da się nic zczytać, bo szybko mruga, jakby się zamazywał, może ktoś coś poradzić?

Możliwe że na LCD jest coś pisane i od razu usuwane przez co coś widać ale szybko ucieka. Po zapisie powinna być przerwa dłuższa od tej po skasowaniu. Najwyraźniej fragment dot. czujnika powodował opóźnienie które to realizowało, ale lepiej jest żebyś dorzucił millis i nie musiał bazować na blokujących opóźnieniach. Szczegóły w kursie Arduino.

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.