Hilfe für die Facharbeit (Menüführung)

Hi Leute, ich habe ein Problem...
Es geht darum:
ich soll ein Notaustester für einen Schaltschrank machen. Ich habe 2 Taster und ein LCD. Der soll einfach überprüfen ob ein Schaltkreis sich öffnet, wenn ein Notaus betätigt wird. Dafür soll es 2 Modi geben, einmal einen Schritt für Schritt und einen Automatikbetrieb. Ich kann zwar sozusagen im Hauptmenü die beiden Punkte anwählen und mit Doppelklick in das Untermenü aber dann will es nicht weitergehen. Ich habe mir schon einige Beispiele mit Menüs angeschaut, aber das wollte nicht in mein Kopf gehen. Meine einzigsten Erfahrungen sind ein Grundkurs im normalen C++ sozusagen. Habe ich einen völligen Denkfehler oder müsste ich alles anders Strukturieren? Ich hoffe ihr könnt mir helfen! :slight_smile:
Ich hätte auch noch meinen Schaltplan angehangen, aber das geht als neuer Benutzer anscheinend nicht.

#include <OneButton.h>
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

OneButton rechtsklick (8, false);
OneButton linksklick (6, false);
int l = 1;
int r = 1;


void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Watttron GmbH");
  lcd.setCursor(0, 1);
  lcd.print("X6-Tester");
  rechtsklick.attachClick(rechts);
  linksklick.attachClick(links);
  rechtsklick.attachDoubleClick(doublerechts);
  linksklick.attachDoubleClick(doublelinks);
  pinMode(30, OUTPUT);
  pinMode(31, INPUT);
  pinMode(32, OUTPUT);
  pinMode(33, INPUT);
  digitalWrite(31, HIGH);
  digitalWrite(33, HIGH);
}
void loop() {
  rechtsklick.tick();
  linksklick.tick();
  delay(10);
}
void rechts(){ 
     if(r == 1){
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("Auto <<");
      lcd.setCursor(9, 1);
      lcd.print("Step");
      lcd.setCursor(0, 0);
      lcd.print("X6-Tester");
     }
}


void links(){
    if(l == 1){
      lcd.clear();
      lcd.setCursor(0, 1);
      lcd.print("Auto");
      lcd.setCursor(9, 1);
      lcd.print("Step <<");
      lcd.setCursor(0, 0);
      lcd.print("X6-Tester");
    }
}
void doublerechts(){
      l=
      0;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Automatikbetrieb");
}

void doublelinks(){
      r=0;
      l=2;
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("Step by Step");
      lcd.setCursor(0, 1);
      lcd.print("ext. Notaus 1");
      if(digitalRead(links) == HIGH){
        l++;
      }
      if(digitalRead(links)==HIGH){
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print("Step by Step");
        lcd.setCursor(0, 1);
        lcd.autoscroll();
        lcd.print("Bitte Notaus 1 betätigen");
        if(digitalRead(31) == LOW){
          lcd.noAutoscroll();
          lcd.clear();
          lcd.setCursor(2, 0);
          lcd.print("Step by Step");
          lcd.setCursor(0, 1);
          lcd.autoscroll();
          lcd.print("links zum fortfahren");
          if(l == 4){
            lcd.noAutoscroll();
            lcd.clear();
            lcd.setCursor(2, 0);
            lcd.print("Step by Step");
            lcd.setCursor(0, 1);
            lcd.print("ext. Notaus 2"); 
      }
      else{
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Fehler:");
        lcd.setCursor(0, 1);
        lcd.print("0001");
          }
      }
      }
      if(l == 5){
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print("Step by Step");
        lcd.setCursor(0, 1);
        lcd.autoscroll();
        lcd.print("Bitte Notaus 2 betätigen");
        if(digitalRead(33) == LOW){
          lcd.noAutoscroll();
          lcd.clear();
          lcd.setCursor(2, 0);
          lcd.print("Step by Step");
          lcd.setCursor(0, 1);
          lcd.print("ext. Notaus 2");
      }
      else{
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Fehler:");
        lcd.setCursor(0, 1);
        lcd.print("0002");
        }
      
      }
}

Wenn ein Schaltkreis aufgeht, dann nur in Rauch.

Ansonsten sehe ich da viele Stufen if's.
Warum nimmst Du nicht switch/case und baust eine klassische Schrittkette?

Und dann benamse Deine Pins. Das suchen, nach der Pinnummer, ist nicht grade förderlich...

Mit switch/case hatte ich es auch schon versucht, aber da hatte ich noch weniger erfolg. Aber ich kann es ja auch nochmal versuchen das soweit umzuschreiben. Alles klar, danke, da werde ich mal ein wenig ordnung in das system bringen :slight_smile:

Nimm ein Blatt Papier und zeichne dir dein Menü auf.
Von welchem Bildschschirm willst du Sprünge wohin zulassen lassen,
Welche Sprünge gibt es in jedem Menü.
Wenn du das erst mal auf einem Blatt DIN A4 hast, gelingt auch die Navigation.

ein "einfaches" Menü - viele Funktionen mit up (links) / down (rechts) und einer Auswahl haben wir vor einigen Tagen hier gemacht:
https://forum.arduino.cc/t/menu-mit-20x4-lcd-funktioniert-nicht-richtig/883443/42
Beitrag 42 war von mir und könnte als Idee dienen (du müsstest es halt umbauen von I2C auf 4bit Beschaltung, aber das soll leicht sein).

Auf ein Blatt Papier habe ich es nicht geschrieben, aber alles mit meinem Chef genauestens durchgesprochen.
Vielen Dank für diese Idee eines Menüs, das werde ich wohl mal probieren. Das versteh sogar ich halbwegs :smiley:

Oha .... "Vom Hirn ins Terminal" ... kann gut gehen, muss es aber nicht :wink:

Es empfiehlt sich fast immer, die Aufgabenstellung (besser sogar das erwartete Ergebnis!) schriftlich und eventuell bildlich zu beschreiben. Dabei fällt einem i.d.R. auf, was alles zu berücksichtigen ist und/oder welche Reihenfolgen einzuhalten sind.

Abgesehen davon reden Menschen häufig aneinander vorbei, so dass ein Stück Papier mit einer Bleistiftskizze in so einem Fall echt hilfreich ist, nicht Stunde um Stunde für die Tonne zu arbeiten ...

Ich würde ein Stück Papier riskieren ... :wink:

Oder ein virtuelles "Papier", z.B. so etwas (15-30 min mit LibreOffice Draw):

Als nächstes kann man z.B. für die Anteile "Manueller Test", "Automatischer Test", "Warte auf Tastendruck" usw. auch eine solche Skizze aufzeichnen. Das macht (scheinbar) erstmal keinen besonderen Spaß, insbesondere weil man dabei merkt, dass die Aufgabe komplexer ist, als man sich das vorgestellt hat, aber es hilft, nachher zielstrebig codieren zu können.

Vielleicht muss es bei Automatischer Test und Manueller Test ja auch noch eine Abbruchtaste geben? Die kann man hier gleich einbauen ...

P.S.: Und das "Geile" an diesem Vorgehen ist, dass man i.d.R. bereits ein lauffähiges Grundgerüst aufbauen kann, bevor man die Details in den einzelnen "Bubbles" ausfüllt.

1 Like

Ich finde es wirklich überragend und erstaunlich wie sehr die Leute hier im Forum die Erfüllung des Ziels vorantreiben. Da bin ich deutlich schlimmeres gewohnt '^^. Vielen Dank an alle! Da werde ich das morgen früh gleich Mal in Angriff nehmen und alles detailliert runterschreiben. In der Hoffnung, dass ich eure Zeit nicht noch weiter in Anspruch nehmen muss

Du darfst hier so viele Fragen stellen wie du möchtest. Wenn da bei jeder Frage erkennbar ist, dass du dazugelernt hast macht das den meisten hier richtig Spaß die Fragen zu benatworten.

vgs

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.