lcd menu submenu probleem

algemene C code
Berichten: 4
Geregistreerd: 14 Jan 2017, 19:35

lcd menu submenu probleem

Berichtdoor sjoerd rosier » 19 Apr 2017, 16:36

Hallo allemaal,

de laatste tijd ben ik bezig met een lcd code voor een 20x4 lcd menu code, of 16x2.

ik ben tegen een probleem aangelopen, ik heb namelijk 2 submenu's gemaakt. de eerste opent hij en voert hem goed uit, maar de andere opent hem en gaat meteen weer terug. Misschien is hier iemand die mij daar mee kan helpen?

Dit is de code:
Code: Alles selecteren
/*
  de code bevat alleen nog maar een hoofdmenu en een sub menu, als dat werkt is het Contor c+V doen en een paar dingen veranderen en de rest doet het ook.
  gemaakt door Sjoerd Rosier
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //lcd 20x4 instellen

#define encoder_a 2 //rotary encoder instellen
#define encoder_b 3
#define button 4
#define MOVECURSOR 1
#define MOVELIST 2

int total_rows = 4; //lcd kolommen en regels
int total_cols = 20;

int top_item_displayed = 0;  //bovenste items op lcd
int top_item_displayed_1 = 0;
int top_item_displayed_2 = 0;
int cursor_position = 0; //cursor positie

int i = 0;

int total_menu_items = 0; //aantal menu items
int total_sub_menu_1_items = 0;
int total_sub_menu_2_items = 0;
int total_sub_menu_3_items = 0;
int total_sub_menu_4_items = 0;
int total_sub_menu_5_items = 0;
int total_sub_menu_6_items = 0;
int total_sub_menu_7_items = 0;

int PAGE = 0;  //pagina

int aState;  //rotary encoder laatste status gelezen
int aLastState;

long lastDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 250;    // the debounce time; anders vlieg je door de menu's als je iets selecteerd en erheen wil gaan en op een knoppie drukt

int bezig = false;

char* menu_items[] = { //alle chars zijn de menu items die op de lcd komen
  "menu 1",
  "menu 2",
  "menu 3",
  "menu 4",
  "menu 5",
  "menu 6",
  "menu 7",
  "",
};

char * sub_menu_1[] = {
  "sub 1",
  "sub 2",
  "sub 3",
  "sub 4",
  "sub 5",
  "back",
  "",
};

char * sub_menu_2[] = {
  "sub 6",
  "sub 7",
  "sub 8",
  "sub 9",
  "sub 10",
  "back",
  "",
};

char * sub_menu_3[] = {
  "sub 11",
  "sub 12",
  "sub 13",
  "sub 14",
  "sub 15",
  "back",
  "",
};

char * sub_menu_4[] = {
  "sub 16",
  "sub 17",
  "sub 18",
  "sub 19",
  "sub 20",
  "back",
  "",
};

char * sub_menu_5[] = {
  "sub 21",
  "sub 22",
  "sub 23",
  "sub 24",
  "sub 25",
  "back",
  "",
};

char * sub_menu_6[] = {
  "sub 26",
  "sub 27",
  "sub 28",
  "sub 29",
  "sub 30",
  "back",
  "",
};

char * sub_menu_7[] = {
  "sub 31",
  "sub 32",
  "sub 33",
  "sub 34",
  "sub 35",
  "back",
  "",
};


void setup() {
  pinMode (encoder_a, INPUT);
  pinMode (encoder_b, INPUT);
  pinMode (button, OUTPUT);
  digitalWrite(button, HIGH);

  lcd.begin(20, 4);
  lcd.clear();
  lcd.backlight();

  Serial.begin (9600);
  // Reads the initial state of the outputA
  aLastState = digitalRead(encoder_a);
  basic_menu();
  move_home_list();
  move_home_cursor();
}


void loop() {
  if (PAGE != 2) {
    basic_menu();
  }

  if (PAGE != 1 && PAGE == 2) {
    Sub_Menu_1();
  }

  while (menu_items[total_menu_items] != "") { //aantal menu items optellen
    total_menu_items++;
  }
  total_menu_items--;

  while (sub_menu_1[total_sub_menu_1_items] != "") {
    total_sub_menu_1_items++;
  }
  total_sub_menu_1_items--;

  while (sub_menu_2[total_sub_menu_2_items] != "") {
    total_sub_menu_2_items++;
  }
  total_sub_menu_2_items--;

  while (sub_menu_3[total_sub_menu_3_items] != "") {
    total_sub_menu_3_items++;
  }
  total_sub_menu_3_items--;

  while (sub_menu_4[total_sub_menu_4_items] != "") {
    total_sub_menu_4_items++;
  }
  total_sub_menu_4_items--;

  while (sub_menu_5[total_sub_menu_5_items] != "") {
    total_sub_menu_5_items++;
  }
  total_sub_menu_5_items--;

  while (sub_menu_6[total_sub_menu_6_items] != "") {
    total_sub_menu_6_items++;
  }
  total_sub_menu_6_items--;

  while (sub_menu_7[total_sub_menu_7_items] != "") {
    total_sub_menu_7_items++;
  }
  total_sub_menu_7_items--;
}


void basic_menu() {
  switch (read_encoder_button()) { //informatie van de rotary encoder krijgen

    case 1: //encoder naar links gedraaid, naar boven in menu
      if (cursor_position == 0 && top_item_displayed > 0) { //cursor positie 0(helemaal bovenaan) en bovenste item groter dan 0, en naar rechts gedraaid, dan wordt het bovenste item verhoogd, waardoor alle items geselecteerd kunnen worden
        top_item_displayed--; //bovenste item wordt verlaagt
        move_home_list(); //functie om de lijst te tekenen
        move_home_cursor(); //functie om de cursor te tekenen
      }
      if (cursor_position > 0) {  //cursor positie groter dan 0, en encoder naar links, kunnen er een paar vanaf
        cursor_position--; //cursor positie verlaagt, cursor komt hoger op lcd gezien van voren
        move_home_cursor(); //functie om de cursor te tekenen
      }

      break;

    case 2: //rotary encoder naar rechts gedraaid, naar beneden in menu
      if ((top_item_displayed + (total_rows - 1)) < total_menu_items && cursor_position == (total_rows - 1)) { //als cursor positie 4 is(onder aan lcd)wordt het bovenste item verhoogt, waardoor er alsnog nieuwe items geselecteerd kunnen worden
        top_item_displayed++; //bovenste item wordt verhoogt
        move_home_list();  //functie om de lijst op de lcd te vernieuwen
        move_home_cursor(); //functie om de cursor te printen op de lcd
      }
      if (cursor_position < (total_rows - 1)) { //naar rechts gedraaid en cursor positie kleiner dan de totale rijen -1, dan wordt de cursor positie verhoogt
        cursor_position++; //cursorpositie verhogen, op lcd gaat de cursor dan naar beneden van boven gezien
        move_home_cursor(); //functie om de cursor te printen op de lcd
      }
      break;
  }
  know_needed_menu(); //functie om te kijken als er gedrukt is op een menu item, welke functies moet worden opgestart om weer nieuwe dingen op de lcd te zetten
}


int read_encoder_button() { //info uit de encoder halen
  int returndata = 0;
  aState = digitalRead(encoder_a); // Reads the "current" state of the outputA

  if (aState != aLastState) {
    if (digitalRead(encoder_b) != aState) { //encoder naar rechts gedraaid
      returndata = returndata + 2;
      PAGE = 1;
      //Serial.println(returndata);
    }
    else { //encoder naar links gedraaid
      returndata = returndata + 1;
      PAGE = 1;
      //Serial.println(returndata);
    }

    aLastState = aState;
  }
  return returndata; //de returndata terugsturen  zodat er mee gewerkt kan worden
}



void move_home_list() { //de lijst opnieuw tekenen
  lcd.clear(); //lcd leegmaken, zodat er nieuwe dingen opkunnen
  if (total_menu_items > ((total_rows - 1))) {  //kijken hoeveel menu items er zijn en of ze er mogelijk opkunnen
    for (i = 0; i < (total_rows); i++) {  //ervoor zorgen dat alles eropkan wat er op moet
      lcd.setCursor(1, i); //cursor neerzetten voor het menu
      lcd.print(menu_items[top_item_displayed + i]); //menu printen op lcd
    }
  }

  else {
    for (i = 0; i < total_menu_items + 1; i++) {  //ervoor zorgen dat alles eropkan wat er op moet
      lcd.setCursor(1, i); //cursor neerzetten voor het menu
      lcd.print(menu_items[top_item_displayed + i]); //menu printen op lcd
    }
  }
}


void move_home_cursor() { //de cursor opnieuw tekenen
  lcd.clear(); //lcd leegmaken zodat er nieuwe dingen opkunnen
  move_home_list(); //functie om de lijst te tekenen, anders het je alleen een cursor

  lcd.setCursor(0, cursor_position); //cursor neerzetten op de juiste positie zodat het juiste item geselecteerd is, deze voor voor
  lcd.print(">"); //cursor teken vooraan
  lcd.setCursor((total_cols - 1), cursor_position); //cursor teken achter zetten
  lcd.print("<"); //cursor teken achteraan
  //Serial.println(cursor_position);
}



void know_needed_menu() {
  Serial.println(top_item_displayed + cursor_position); //test
  if ( (millis() - lastDebounceTime) > debounceDelay) { //timer zodat niet als je knop indrukt meerdere lees resultaten komen en allemaal andere dingen laat doen
    switch (top_item_displayed + cursor_position) {//kijken wat het menu_item is

      case 0:
        if (!digitalRead(button)) {
          top_item_displayed_1 = 0; //menu item is menu 1
          cursor_position = 0; //cursor weer op 0 zetten
          Sub_Menu_1(); //functies voor het runnen van sub menu 1
          sub_list_1();
          sub_cursor_1();
          //lcd.clear();  //lcd leegmaken voor nieuwe items op de lcd
          PAGE = 2; //pagina naar 2 zetten
          lastDebounceTime = millis(); //set the current time
          Serial.println("sub 1");
          break;

        case 1:
          if (!digitalRead(button)) {
            top_item_displayed_2 = 0; //menu item is menu 1
            cursor_position = 0; //cursor weer op 0 zetten
            Sub_Menu_2();  //functies voor het runnen van sub menu 2
            sub_list_2();
            sub_cursor_2();
            //lcd.clear();  //lcd leegmaken voor nieuwe items op de lcd
            PAGE = 3; //pagina naar 3 zetten
            lastDebounceTime = millis(); //set the current time
            Serial.println("sub 2");
            break;

          case 2:

            break;

          case 3:

            break;

          case 4:

            break;

          case 5:

            break;

          case 6:
            break;
          }
        }
    }
  }
}

void Sub_Menu_1() { //dit is het sub menu dat bij menu 1 hoort
  switch (read_encoder_1()) { //informatie van de encoder krijgen

    case 1: //naar boven in het menu, encoder linksom gedraaid
      if (cursor_position == 0 && top_item_displayed_1 > 0) { //cursor positie 0(helemaal bovenaan) en bovenste item groter dan 0, en naar rechts gedraaid, dan wordt het bovenste item verhoogd, waardoor alle items geselecteerd kunnen worden
        top_item_displayed_1--;  //bovenste item wordt verlaagt
        sub_list_1();  //functie om de lijst te tekenen
        sub_cursor_1(); //functie om de cursor te tekenen
      }
      if (cursor_position > 0) { //cursor positie groter dan 0, en encoder naar links, kunnen er een paar vanaf
        cursor_position--; //cursor positie verlaagt, cursor komt hoger op lcd gezien van voren
        sub_cursor_1(); //functie om de cursor te tekenen
      }
      break;

    case 2: //naar beneden in het menu, encoder rechtsom gedraaid
      if ((top_item_displayed_1 + (total_rows - 1)) < total_sub_menu_1_items && cursor_position == (total_rows - 1)) { //als cursor positie 4 is(onder aan lcd)wordt het bovenste item verhoogt, waardoor er alsnog nieuwe items geselecteerd kunnen worden
        top_item_displayed_1++; //bovenste item wordt verhoogt
        sub_list_1(); //functie om de lijst op de lcd te vernieuwen
        sub_cursor_1(); //functie om de cursor te printen op de lcd
      }
      if (cursor_position < (total_rows - 1)) { //naar rechts gedraaid en cursor positie kleiner dan de totale rijen -1, dan wordt de cursor positie verhoogt
        cursor_position++;  //cursorpositie verhogen, op lcd gaat de cursor dan naar beneden van boven gezien
        sub_cursor_1(); //functie om de cursor te printen op de lcd
      }
      break;
  }
  know_sub_item_1(); //kijken welk sub item geselecteerd is
}


int read_encoder_1() { //encoder lezen
  int returndata = 0;
  aState = digitalRead(encoder_a); // Reads the "current" state of the outputA

  if (aState != aLastState) {
    if (digitalRead(encoder_b) != aState) { //encoder naar rechts gedraaid
      returndata = returndata + 2;
      //Serial.println(returndata);
    }
    else { //encoder naar links gedraaid
      returndata = returndata + 1;
      //Serial.println(returndata);
    }
    aLastState = aState;
  }
  return returndata;
}


void sub_list_1() { //de lijst opnieuw tekenen
  lcd.clear(); //lcd leegmaken, zodat er nieuwe dingen opkunnen
  if (total_sub_menu_1_items > ((total_rows - 1))) { //kijken hoeveel menu items er zijn en of ze er mogelijk opkunnen
    for (i = 0; i < (total_rows); i++) { //ervoor zorgen dat alles eropkan wat er op moet
      lcd.setCursor(1, i);  //cursor neerzetten voor het menu
      lcd.print(sub_menu_1[top_item_displayed_1 + i]); //menu printen op lcd
    }
  }

  else {
    for (i = 0; i < total_sub_menu_1_items + 1; i++) { //ervoor zorgen dat alles eropkan wat er op moet
      lcd.setCursor(1, i); //cursor neerzetten voor het menu
      lcd.print(sub_menu_1[top_item_displayed_1 + i]); //menu printen op lcd
    }
  }
}


void sub_cursor_1() { //sub cursor tekenen
  lcd.clear(); //lcd leegmaken zodat er nieuwe dingen opkunnen
  sub_list_1(); //functie om de lijst te tekenen, anders het je alleen een cursor

  lcd.setCursor(0, cursor_position); //cursor neerzetten op de juiste positie zodat het juiste item geselecteerd is, deze voor voor
  lcd.print(">"); //cursor teken vooraan
  lcd.setCursor((total_cols  - 1), cursor_position); //cursor teken achter zetten
  lcd.print("<");  //cursor teken achteraan
  //Serial.println(cursor_position);
}

void know_sub_item_1() {
  if (PAGE == 2) {
    switch (top_item_displayed_1 + cursor_position) {//kijken welk sub item geselecteerd is

      case 0:

        break;

      case 1:

        break;

      case 2:

        break;

      case 3:

        break;

      case 4:

        break;

      case 5://back is geselecteerd, als de knop ingedrukt is, gaat hij terug naar het hoofdmenu
        if ( (millis() - lastDebounceTime) > debounceDelay) { //timer zodat niet als je knop indrukt meerdere lees resultaten komen en allemaal andere dingen laat doen
          if (!digitalRead(button)) { //als de knop is ingedrukt, kijken welk sub menu geopend moet worden
            top_item_displayed = 0; //bovenste item op 0 zetten
            cursor_position = 0; //cursor positie op 0 zetten, zodat het geselecteerde item item 1 is
            basic_menu(); //functies voor het runnen van het hoofdmenu
            move_home_list();
            move_home_cursor();
            PAGE = 1; //pagina op 1 zetten
            lastDebounceTime = millis(); //set the current time
            Serial.println("case 5"); //test
            break;
          }
        }
    }
  }
}


void Sub_Menu_2() {//dit is het sub menu dat bij menu 1 hoort
  switch (read_encoder_2()) { //informatie ontvangen van de encoder

    case 1: //naar boven in het menu, encoder linksom gedraaid
      if (cursor_position == 0 && top_item_displayed_2 > 0) { //cursor positie 0(helemaal bovenaan) en bovenste item groter dan 0, en naar rechts gedraaid, dan wordt het bovenste item verhoogd, waardoor alle items geselecteerd kunnen worden
        top_item_displayed_2++;  //bovenste item wordt verhoogt
        sub_list_2(); //functie om de lijst op de lcd te vernieuwen
        sub_cursor_2(); //functie om de cursor te printen op de lcd
      }
      if (cursor_position > 0) {
        cursor_position--; cursor_position--; //cursor positie verlaagt, cursor komt hoger op lcd gezien van voren
        sub_cursor_2();  //functie om de cursor te printen op de lcd
      }
      break;

    case 2: //naar beneden in het menu, encoder rechtsom gedraaid
      if ((top_item_displayed_2 + (total_rows - 1)) < total_sub_menu_2_items && cursor_position == (total_rows - 1)) { //als cursor positie 4 is(onder aan lcd)wordt het bovenste item verhoogd, waardoor er alsnog nieuwe items geselecteerd kunnen worden
        top_item_displayed_2++;  //bovenste item wordt verhoogt
        sub_list_2(); //functie om de lijst op de lcd te vernieuwen
        sub_cursor_2(); //functie om de cursor te printen op de lcd
      }
      if (cursor_position < (total_rows - 1)) {  //naar rechts gedraaid en cursor positie kleiner dan de totale rijen -1, dan wordt de cursor positie verhoogt
        cursor_position++; //cursorpositie verhogen, op lcd gaat de cursor dan naar beneden van boven gezien
        sub_cursor_2(); //functie om de cursor te printen op de lcd
      }
      break;
  }
  //know_sub_item_2(); //kijken welk sub item geselecteerd is
}


int read_encoder_2() { //encoder lezen
  int returndata = 0;
  aState = digitalRead(encoder_a); // Reads the "current" state of the outputA

  if (aState != aLastState) {
    if (digitalRead(encoder_b) != aState) { //encoder naar rechts gedraaid
      returndata = returndata + 2;
      //Serial.println(returndata);
    }
    else { //encoder naar links gedraaid
      returndata = returndata + 1;
      //Serial.println(returndata);
    }
    aLastState = aState;
  }
  return returndata;
}


void sub_list_2() { //sub lijst tekenen
  lcd.clear(); //lcd leegmaken, zodat er nieuwe dingen opkunnen
  if (total_sub_menu_2_items > ((total_rows - 1))) { //kijken hoeveel menu items er zijn en of ze er mogelijk opkunnen
    for (i = 0; i < (total_rows); i++) { //ervoor zorgen dat alles eropkan wat er op moet
      lcd.setCursor(1, i); //cursor neerzetten voor het menu
      lcd.print(sub_menu_2[top_item_displayed_2 + i]); //menu printen op lcd
    }
  }

  else {
    for (i = 0; i < total_sub_menu_2_items + 1; i++) { //ervoor zorgen dat alles eropkan wat er op moet
      lcd.setCursor(1, i); //cursor neerzetten voor het menu
      lcd.print(sub_menu_2[top_item_displayed_2 + i]);  //menu printen op lcd
    }
  }
}


void sub_cursor_2() { //sub cursor tekenen
  lcd.clear(); //lcd leegmaken zodat er nieuwe dingen
  sub_list_2(); //functie om de lijst te tekenen, anders het je alleen een cursor

  lcd.setCursor(0, cursor_position); //cursor neerzetten op de juiste positie zodat het juiste item geselecteerd is, deze voor voor
  lcd.print(">"); //cursor teken vooraan
  lcd.setCursor((total_cols - 1), cursor_position); //cursor teken achter zetten
  lcd.print("<"); //cursor teken achteraan
  //Serial.println(cursor_position);
}

void know_sub_item_2() {
  switch (top_item_displayed_2 + cursor_position) {//kijken welk sub item geselecteerd is

    case 0:

      break;

    case 1:

      break;

    case 2:

      break;

    case 3:

      break;

    case 4:

      break;

    case 5://back is geselecteerd, als de knop ingedrukt is, gaat hij terug naar het hoofdmenu
      if ( (millis() - lastDebounceTime) > debounceDelay) {  //timer zodat niet als je knop indrukt meerdere lees resultaten komen en allemaal andere dingen laat doen
        if (!digitalRead(button)) { //als de knop is ingedrukt, kijken welk sub menu geopend moet worden
          top_item_displayed = 0; //zet het bovenste item op 0
          cursor_position = 1;   //cursor positie op 1 zetten, zodat het geselecteerde item menu 2 is
          basic_menu(); //funcities voor het runnen van het hoofdmenu
          move_home_list();
          move_home_cursor();
          PAGE = 1; //pagina op 1 zetten
          lastDebounceTime = millis(); //set the current time
          Serial.println("case 5");  //test
          break;
        }
      }
  }
}


Advertisement

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten