Finde den Fehler nicht Menü LCD Keypad

Hallo,
ich habe nach einer Anleitung bei Youtube versucht eine Menüführung mit dem LCD Keypad Shield zu realisieren.

Leider verwendet der Ersteller der Anleitung das Shield nicht sondern normale Buttons.
Jetzt würde ich gerne das Menü über die Buttons des Shields steuern.
Irgendwie weiß ich nicht wie ich die Analogauswertung auf die const int input_Buttons[Number_of_Inputs] schreiben soll. Kann mir jemand helfen?
Danke

#include <Bounce2.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Die erforderlichen Pins
 
int Analogwert = 0;
#define BUTTON_UP     0
#define BUTTON_DOWN   1
#define BUTTON_RIGHT  2
#define BUTTON_LEFT   3
#define BUTTON_SELECT 4
#define NO_BUTTON     5


const unsigned int BAUD_RATE = 9600;
const unsigned int DEBOUNCE_DELAY = 20;

//inputs from LCD Logic
const int Number_of_Inputs = 5;
const int input_Buttons[Number_of_Inputs] = {BUTTON_UP, BUTTON_DOWN, BUTTON_RIGHT, BUTTON_LEFT, BUTTON_SELECT};

 

int inputState[Number_of_Inputs];
int lastinputState[Number_of_Inputs] = {LOW, LOW, LOW, LOW, LOW};
bool inputFlags[Number_of_Inputs] = {LOW, LOW, LOW, LOW, LOW};
long lastDebounceTime[Number_of_Inputs] = {0, 0, 0, 0, 0};
long debounceDelay = 5;

//LCD Menu Logic
const int number_of_Screens = 5;
int currentScreen = 0;
String screens[number_of_Screens][2] = {{"Main Menu", "Test1" }, {"Menu2", "Test2"}, {"Menu3", "Test3"}, {"Menu4", "Test4"}, {"Menu5", "Test5"}};
int parameters [number_of_Screens];
//String parametersUnits[number_of_Screens]={"Test2","Test2","Test3","Test4","Test5"};




void setup() {

//  for(int i = 0; i < Number_of_Inputs; i++) {
//    pinMode(input_Buttons[i], INPUT); 
//    digitalWrite(input_Buttons[i], HIGH); // pull-up 20k }
//  }
  
  Serial.begin(BAUD_RATE);
  lcd.begin(16, 2);
}

void loop() {
  // put your main code here, to run repeatedly:

  setInputFlags();
    resolveInputFlags();
checkLCD_BUTTONS ();
 
}

int checkLCD_BUTTONS () {
  Analogwert = analogRead(A0);
  if  (Analogwert > 1000)  return NO_BUTTON; 
  if  (Analogwert < 50)    return BUTTON_RIGHT;  
  if  (Analogwert < 195)   return BUTTON_UP;  
  if  (Analogwert < 380)   return BUTTON_DOWN;  
  if  (Analogwert < 555)   return BUTTON_LEFT ; 
  if  (Analogwert < 790)   return BUTTON_SELECT;

  return NO_BUTTON;
}

void resolveInputFlags() {
  for (int i = 0; i < Number_of_Inputs; i++) {
    if (inputFlags[i] == HIGH) {
      inputButtonAction(i);
      inputFlags[i] = LOW;
      printscreen();
    }
  }
}

void setInputFlags() {
  for (int i = 0; i < Number_of_Inputs; i++) {
    int reading = digitalRead(input_Buttons[i]);
    if (reading != lastinputState[i]) {
      lastDebounceTime[i] = millis();
    } if ((millis() - lastDebounceTime[i]) > debounceDelay) {
      if (reading != inputState[i]) {
        inputState[i] = reading;
        if (inputState[i] == HIGH) {
          inputFlags[i] = HIGH;
        }
      }
    }
    lastinputState[i] = reading;
  }
}


void inputButtonAction( int input ) {
  if (input == 0) {
    if (currentScreen == 0) {
      currentScreen =  number_of_Screens - 1;
    }
    else
      currentScreen--;
  } else if (input == 1 ) {
    if (currentScreen == number_of_Screens - 1) {
      currentScreen = 0;
    } else {
      currentScreen ++;
    }
  } else if (input == 2) {
    parameterChange(0);
  } else if (input == 3) {
    parameterChange(1);
  }
}

void parameterChange(int key) {
  if (key == 0) {
    parameters[currentScreen]++;
  } else if (key == 1) {
    parameters[currentScreen]--;
  }
}

void printscreen() {
  lcd.clear();
  lcd.print(screens[currentScreen][0]);
  lcd.setCursor(0, 1);
  lcd.print(parameters[currentScreen]);
  lcd.print(" ");
  lcd.print(screens[currentScreen][1]);
}

Dein Problem ist, dass es keine Unterstützung von den Youtube-Autoren gibt.
Das ist ganz anders, wenn du das Menü hier aus dem Forum verwendest.

Z.B dies hier. und Unterstützung ist dir sicher.

@TO: Pins doppelt zu benutzen (4 und 5) ist eine sehr schlechte Idee.

Gruß Tommy

Das mit der doppelten Nutzung der Pins (Tommy hat es beschrieben) ist sicher ein Fehler, weil du noch nicht aufgeräumt hast. Wenn du den analogen Pin für die Tasten nimmst, brauchst nicht die digitalen Pins.

Und wenn du dann noch auf einen I2C-Adapter für das Display umsteigst, wird es noch besser und du sparst weitere Pins.

Okay, ich muss ehrlich sagen ich hab den Grund für die Zahlen hinter define nicht ganz verstanden. Hab mich bei dem Teil mit den Tasten über den Analogen Eingang an diese Anleitung gehalten. https://funduino.de/zb-01-keypad-shield

Dort funktioniert es. Das kann also nicht der Fehler sein.

Danke

Was heißt "dort funktioniert es" ?

Und wenn du etwas nicht verstanden hast, solltest du es nachlesen. Grundlagen lernen ist auch hier wichtig, das können wir dir nicht abnehmen.

Dort kann man die Tasten vom LCD Keypad Shield nutzen. Allerdings wollte ich es so wie im ersten Post lösen.

Warum hinter den Defines eine Zahl steht wird einfach nicht erklärt in den anderen Tutorien.

define BUTTON_UP 0

define BUTTON_DOWN 1

define BUTTON_RIGHT 2

define BUTTON_LEFT 3

define BUTTON_SELECT 4

define NO_BUTTON 5

Es sind aber keine Eingänge.

OK hab's herausgefunden. Dem Define muss ein Wert angegeben werden. Um so mehr verstehe ich nicht warum ich die Werte nicht Einlesen kann in const int input_Buttons[Number_of_Inputs] = {BUTTON_UP, BUTTON_DOWN, BUTTON_RIGHT, BUTTON_LEFT, BUTTON_SELECT};

Matt87: Leider verwendet der Ersteller der Anleitung das Shield nicht sondern normale Buttons. Jetzt würde ich gerne das Menü über die Buttons des Shields steuern.

Damit hast Du keine Buttons, sondern verschiedene analogInput-Werte, die einem Button entsprechen. Welche das sind sollte in der Doku zu den Shield stehen.

Gruß Tommy

OK, das ist tatsächlich keine Doppelbelegung, sondern ein Wert, den die entsprechend Tastenfunktion benötigt.

Im folgenden Beitrag kannst du sehen, wie das funktioniert und daraus einiges ableiten.

HotSystems: OK, das ist tatsächlich keine Doppelbelegung, sondern ein Wert, den die entsprechend Tastenfunktion benötigt.

Im folgenden Beitrag kannst du sehen, wie das funktioniert und daraus einiges ableiten.

Danke aber die Anleitung kenne ich schon und versuche darüber die 5 Taster Digital in die Struktur des ersten Post von mir einzubetten. Irgendwie kommen die Signsle der Taster nicht aus dem int checkLCD_BUTTONS () raus. So das ich Sie in diese Struktur ein binden kann: const int input_Buttons[Number_of_Inputs] = {BUTTON_UP, BUTTON_DOWN, BUTTON_RIGHT, BUTTON_LEFT, BUTTON_SELECT};

Das ist mein Problem.

Hast du dir denn wenigstens das von mir verlinkte Menü in Post#1 angesehen ? Damit wird dein Problem sicher zur Vergangenheit angehören.

HotSystems: Hast du dir denn wenigstens das von mir verlinkte Menü in Post#1 angesehen ? Damit wird dein Problem sicher zur Vergangenheit angehören.

Noch nicht alles. Aber schätze es löst nicht das Problem an dem Sketch :-( Warum kann ich Die Buttons nicht weiter Verschalten ist ein Array?

Matt87: Noch nicht alles. Aber schätze es löst nicht das Problem an dem Sketch :-( Warum kann ich Die Buttons nicht weiter Verschalten ist ein Array?

Und woher nimmst Du diese 'Schätzung' , wenn Du es gar nicht erst probierst? Ich denke erst nach nem Versuch, mit negativem Ergebnis kannst Du mit Sicherheit sagen: 'Danke für den Tip, aber leider löst es das Problem aus diesem und jenem Grund nicht. Wenn Du um hilfe bittest, währe es sehr voteilhaft, wenn Du die gegebenen Hilfestellungen auch annimst, oder sie wenigstens mal testest, anstatt von vornherein zu sagen 'Ich schätze, das löst das Problem nicht' Solltest Du jedoch die gebotene Hilfe nicht annehmen (können), schätze ich, wirst Du Dein Problem selbst lösen müssen.

LG Stefan

Matt87: Noch nicht alles. Aber schätze es löst nicht das Problem an dem Sketch :-( Warum kann ich Die Buttons nicht weiter Verschalten ist ein Array?

Eine Antwort darauf hast du ja bekommen. Dennoch ist es für uns sehr schwer einfach zusammen kopierte Sketch zu lesen und auch zu verstehen. Ich steig da jedenfalls auch nach mehrmaligem Lesen nicht durch.

Mein Tipp: Setze ein paar serielle Ausgaben zum seriellen Monitor ein und prüfe wo deine Tasten noch funktionieren. Fange mit der Tastenauswertung an und erweitere nach und nach. Dokumentiere deinen Sketch so, dass externe den auch verstehen. Schmeiße Zeilen raus, die du nicht verwendest. Formatiere den Sketch mit Strg + T in der IDE. Danach ist er evtl. auch für uns besser verständlich.

Deltaflyer: Und woher nimmst Du diese 'Schätzung' , wenn Du es gar nicht erst probierst? Ich denke erst nach nem Versuch, mit negativem Ergebnis kannst Du mit Sicherheit sagen: 'Danke für den Tip, aber leider löst es das Problem aus diesem und jenem Grund nicht. Wenn Du um hilfe bittest, währe es sehr voteilhaft, wenn Du die gegebenen Hilfestellungen auch annimst, oder sie wenigstens mal testest, anstatt von vornherein zu sagen 'Ich schätze, das löst das Problem nicht' Solltest Du jedoch die gebotene Hilfe nicht annehmen (können), schätze ich, wirst Du Dein Problem selbst lösen müssen.

LG Stefan

Ja das stimmt schon, aber es sind über 100 Seiten wo ich in der Hilfe durcharbeiten müsste. Hab mir die Sketchs schon angesehen. Das wird dauern bis ich die alle durch habe.

HotSystems: Eine Antwort darauf hast du ja bekommen. Dennoch ist es für uns sehr schwer einfach zusammen kopierte Sketch zu lesen und auch zu verstehen. Ich steig da jedenfalls auch nach mehrmaligem Lesen nicht durch.

Mein Tipp: Setze ein paar serielle Ausgaben zum seriellen Monitor ein und prüfe wo deine Tasten noch funktionieren. Fange mit der Tastenauswertung an und erweitere nach und nach. Dokumentiere deinen Sketch so, dass externe den auch verstehen. Schmeiße Zeilen raus, die du nicht verwendest. Formatiere den Sketch mit Strg + T in der IDE. Danach ist er evtl. auch für uns besser verständlich.

Danke für den Tipp werde ich machen am We.

Hallo, also ich komme zu keinem Ergebnis. Ich sehe über den über Serial.println( das ein Knopf gedrückt wird? Die Taster funktionieren.

Ich verstehe nur nicht den Unterschied. im Original werden die Eingänge der Buttons in die Struktur geschrieben.

const int inputPins[numOfInputs] = {8,9,10,11};

Da ich das LCD-Keypadshield verwende möchte ich die Pins vom Analogen Eingang benutzten.

Also Statt Digitaler Eingänge die den Analogen Eingang.

const int input_Buttons[Number_of_Inputs] = {BUTTON_UP, BUTTON_DOWN, BUTTON_RIGHT, BUTTON_LEFT, BUTTON_SELECT};

Das auslesen der Analogen Werte ist nicht das Problem. Ich bekomme den Status der Tasten einfach nicht in diese oder eine Andere Struktur und verstehe nicht warum?

Hab's auch schon als bool oder versucht.

Was hast Du denn bisher [u]konkret[/u] getestet, um die Buttons einzulesen und weiter zu verarbeiten?

Gruß Tommy

Tommy56:
Was hast Du denn bisher konkret getestet, um die Buttons einzulesen und weiter zu verarbeiten?

Gruß Tommy

Ich habe versucht die Struktur anderweitig zu beschreiben.
input_Buttons[Number_of_Inputs] =

Aber sie lässt dies nicht zu.
Lustigerweise kann ich zumindest das Menü wechseln wenn ich bei der Analogauswertung ein Serial.println hinzufüge.

int checkLCD_BUTTONS () {
  Analogwert = analogRead(A0);
  if  (Analogwert > 1000)  return NO_BUTTON;
  if  (Analogwert < 50)    return BUTTON_RIGHT; 
  if  (Analogwert < 195)   return BUTTON_UP; 
  if  (Analogwert < 380)   return BUTTON_DOWN; 
  if  (Analogwert < 555)   return BUTTON_LEFT ;
  if  (Analogwert < 790)   return BUTTON_SELECT;

  return NO_BUTTON;
}

Ok gestern verstanden das die Buttons für die Definierten Werte steht. Also 0-5 Jetzt ist nur die Frage wie bekomme ich die Buttons als bool angelegt und in die Struktur. Einfach in bool umwandeln geht leider nicht.