Skocz do zawartości
Gibcio2020

Problem z kodem menu na Arduino

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

Udostępnij ten post


Link to post
Share on other sites

@Gibcio2020 Przede wszystkim podaj ten kod za pomocą odpowiedniego narzędzia wstawiania kodu na forum, bez tego raczej nikt Ci nie pomoże 😉

  • Lubię! 1

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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!

Gość
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...