lcd menu submenu probleem
1 bericht
• Pagina 1 van 1
- sjoerd rosier
- Berichten: 4
- Geregistreerd: 14 Jan 2017, 19:35
lcd menu submenu probleem
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:
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
1 bericht
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten