Verbesserungsvorschläge Code

Liebe Comunity,

Ich bin vor einer weile auf Arduino gestoßen und habe es jetzt geschafft, mein erstes größeres Projekt zu vollenden.

Nun war meine Überlegung was man an dem Code noch verändern, schönen oder auch kürzen könnte.

Hoffe dadurch noch mehr über das Programmieren zu lernen um dieses in kommenden Projekten verwenden zu können:)

Ich habe daheim eine Getreidemühle. Diese kann einmal von einem Getreidesilo und einmal von einem Stoffsilosack befüllt werden.

Meine Anforderung war, das ich vorgeben kann in welchem verhältniss das Getreide gemischt werden kann und der Prozess fortgesetzt wird, bis der Behälter für das Mehl voll ist.

Danach soll diese abgeschaltet werden. Ebenso soll bei einem Fehler die Mühle ausgeschaltet werden.

Schrotesteuerung.ino (22,9 KB)

Fein!
Ein lohnendes Ziel.

Wenn ich mir deinen Code so anschaue, ....
Ich finde, dass eine Funktion nicht mehr als 20 Zeilen haben sollte.
So in etwa.
Deine loop() Funktion hat quasi 1000 Zeilen.

Dann, dein Umgang mit dem EEPROM.
Vielleicht nicht falsch, das kann gut sein, aber auch nicht optimal.
Unnötig kompliziert.

Mein Rat:
Aufteilen, modularisieren.
Wo es geht, Strukturen verwenden. Gerade bei der Adressberechnug für das EEPROM. Dabei hilfreich: offsetof

Ein Beispiel für Codevereinfachungen. Das gesamte weiderholte EEPROM laden

unsigned long Stoerungstimer=0;
unsigned long EntleerungsTimerStahlsilo=0;
unsigned long FuellTimerStahlsilo=0;
unsigned long EntleerungsTimerSiloSack=0;
unsigned long FuellTimerSiloSack=0;
unsigned long ZeitNachlaufTimerStahlsilo=0;
unsigned long ZeitNachlaufTimerSiloSack=0;
unsigned long NachlaufTimerStahlsilo=0;
unsigned long NachlaufTimerSiloSack=0;
int Silo = 0;
int Sack = 0;

unsigned long Ergebnis;

Speicheradresse=0;
EEPROM.get(Speicheradresse, Ergebnis);
EntleerungsTimerStahlsilo=Ergebnis;

Speicheradresse += sizeof(unsigned long);

EEPROM.get(Speicheradresse, Ergebnis);
FuellTimerStahlsilo=Ergebnis;

Speicheradresse += sizeof(unsigned long);

EEPROM.get(Speicheradresse, Ergebnis);
NachlaufTimerStahlsilo=Ergebnis;

Speicheradresse += sizeof(unsigned long);

EEPROM.get(Speicheradresse, Ergebnis);
EntleerungsTimerSiloSack=Ergebnis;

Speicheradresse += sizeof(unsigned long);

EEPROM.get(Speicheradresse, Ergebnis);
FuellTimerSiloSack=Ergebnis;

Speicheradresse += sizeof(unsigned long);

EEPROM.get(Speicheradresse, Ergebnis);
NachlaufTimerSiloSack=Ergebnis;

Speicheradresse += sizeof(unsigned long);

EEPROM.get(Speicheradresse, Ergebnis);
Silo=Ergebnis;

Speicheradresse += sizeof(int);

EEPROM.get(Speicheradresse, Ergebnis);
Sack=Ergebnis;

(52 Zeilen)

Lässt sich in einer Datenstruktur (struct) wiederspiegeln, die in einem einzigen Zug geladen und auch gespeichert werden kann.

struct {
	unsigned long Stoerungstimer;
	unsigned long EntleerungsTimerStahlsilo;
	unsigned long FuellTimerStahlsilo;
	unsigned long EntleerungsTimerSiloSack;
	unsigned long FuellTimerSiloSack;
	unsigned long ZeitNachlaufTimerStahlsilo;
	unsigned long ZeitNachlaufTimerSiloSack;
	unsigned long NachlaufTimerStahlsilo;
	unsigned long NachlaufTimerSiloSack;
	int Silo;
	int Sack;
} EEPROM_Einstellungen;

EEPROM_Einstellungen gEinstellungen; /* als globale Variable */

// Einstellungen aus EEPROM laden
EEPROM.get(0, gEinstellungen);

// Zugriff mit bspw.
gEinstellungen.Stoerungstimer

// Einstellungen in EEPROM speichern
EEPROM.put(0, gEinstellungen);

(effektiv 18 Zeilen).

Du könntest den Code mit STRG-T mal formatieren, dabei werden überwiegend die Einrückungen standardisiert.

Du hast noch viele globale Variablen der Größe int. Prüfe da mal jede einzelne, ob das wirklich ein signed Wert mit mehreren Bytes sein muss oder ob z.B. auch ein byte reicht.

Bei den Fixtext-Ausgaben auf deinem LCD könntest du Speicher Sparen und das F-Makro verwenden.

Leerzeilen ... das geht auch mit weniger. Wenn du damit optisch was strukturieren willst, denk darüber nach ob du da nicht besser Codeteile zueigenen Funktionen machen kannst.

Dieser Codeblock wird viele Male wiederholt. Anscheinend müssen wir eine Funktion zum Anzeigen von Informationen auf dem Bildschirm und zum Übergeben von Parametern erstellen

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Stahlsilo");
      lcd.setCursor(0, 1);
      lcd.print(">Enleerungstimer:");
      lcd.print(EntleerungsTimerStahlsilo/1000);
      lcd.setCursor(0, 2);
      lcd.print("Fuelltimer:");
      lcd.print(FuellTimerStahlsilo/1000);
      lcd.setCursor(0, 3);
      lcd.print("Nachlauftimer:");
      lcd.print(NachlaufTimerStahlsilo/1000);

Du solltest unbedingt die Warnungen in den Einstellungen der IDE einschalten.
DATEI - VOREINSTELLUNGEN
grafik

(Könnte bei Dir leicht anders aussehen)

Denn:

/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:374:25: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     if((Menuestatus==1) && (VarWeiter==LOW)  ||  (Menuestatus==10 && VarOk == LOW)  ||  (Menuestatus==20 && VarOk == LOW)  || (Menuestatus==4) && (VarWeiter==LOW) || (Menuestatus==5) && (VarReset==LOW) || (Menuestatus==6) && (VarReset==LOW)){
        ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:374:144: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     if((Menuestatus==1) && (VarWeiter==LOW)  ||  (Menuestatus==10 && VarOk == LOW)  ||  (Menuestatus==20 && VarOk == LOW)  || (Menuestatus==4) && (VarWeiter==LOW) || (Menuestatus==5) && (VarReset==LOW) || (Menuestatus==6) && (VarReset==LOW)){
                                                                                                                               ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:374:184: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     if((Menuestatus==1) && (VarWeiter==LOW)  ||  (Menuestatus==10 && VarOk == LOW)  ||  (Menuestatus==20 && VarOk == LOW)  || (Menuestatus==4) && (VarWeiter==LOW) || (Menuestatus==5) && (VarReset==LOW) || (Menuestatus==6) && (VarReset==LOW)){
                                                                                                                                                                       ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:374:223: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
     if((Menuestatus==1) && (VarWeiter==LOW)  ||  (Menuestatus==10 && VarOk == LOW)  ||  (Menuestatus==20 && VarOk == LOW)  || (Menuestatus==4) && (VarWeiter==LOW) || (Menuestatus==5) && (VarReset==LOW) || (Menuestatus==6) && (VarReset==LOW)){
                                                                                                                                                                                                              ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:419:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:477:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:23: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
      ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:100: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
                                                                                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:140: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
                                                                                                                          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:180: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
                                                                                                                                                                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:220: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
                                                                                                                                                                                                          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:260: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
                                                                                                                                                                                                                                                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:497:300: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==4) && (VarOk==LOW) || (Menuestatus==6) && (VarWeiter==LOW) || (Menuestatus==80) && (VarReset==LOW) || (Menuestatus==70) && (VarReset==LOW) || (Menuestatus==60) && (VarReset==LOW) || (Menuestatus==50) && (VarReset==LOW) || (Menuestatus==40) && (VarReset==LOW) || (Menuestatus==30) && (VarReset==LOW)){
                                                                                                                                                                                                                                                                                          ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:512:23: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==5) && (VarOk==LOW) || (Menuestatus==31) && (VarOk==LOW) || (Menuestatus==80) && (VarWeiter==LOW) || (Menuestatus==41) && (VarOk==LOW) || (Menuestatus==81) && (VarOk==LOW)){
      ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:512:97: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==5) && (VarOk==LOW) || (Menuestatus==31) && (VarOk==LOW) || (Menuestatus==80) && (VarWeiter==LOW) || (Menuestatus==41) && (VarOk==LOW) || (Menuestatus==81) && (VarOk==LOW)){
                                                                               ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:512:138: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==5) && (VarOk==LOW) || (Menuestatus==31) && (VarOk==LOW) || (Menuestatus==80) && (VarWeiter==LOW) || (Menuestatus==41) && (VarOk==LOW) || (Menuestatus==81) && (VarOk==LOW)){
                                                                                                                        ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:512:175: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==5) && (VarOk==LOW) || (Menuestatus==31) && (VarOk==LOW) || (Menuestatus==80) && (VarWeiter==LOW) || (Menuestatus==41) && (VarOk==LOW) || (Menuestatus==81) && (VarOk==LOW)){
                                                                                                                                                             ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:546:24: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==30) && (VarOk==LOW) || (Menuestatus==31) && ((VarWeiter==LOW) || (VarReset==LOW))){
      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:553:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:591:24: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==40) && (VarOk==LOW) || (Menuestatus==41) && ((VarWeiter==LOW) || (VarReset==LOW))){
      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:597:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:634:23: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==6) && (VarOk==LOW) || (Menuestatus==51) && (VarOk==LOW) || (Menuestatus==70) && (VarWeiter==LOW) || (Menuestatus==61) && (VarOk==LOW) || (Menuestatus==71) && (VarOk==LOW)){
      ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:634:97: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==6) && (VarOk==LOW) || (Menuestatus==51) && (VarOk==LOW) || (Menuestatus==70) && (VarWeiter==LOW) || (Menuestatus==61) && (VarOk==LOW) || (Menuestatus==71) && (VarOk==LOW)){
                                                                               ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:634:138: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==6) && (VarOk==LOW) || (Menuestatus==51) && (VarOk==LOW) || (Menuestatus==70) && (VarWeiter==LOW) || (Menuestatus==61) && (VarOk==LOW) || (Menuestatus==71) && (VarOk==LOW)){
                                                                                                                        ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:634:175: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==6) && (VarOk==LOW) || (Menuestatus==51) && (VarOk==LOW) || (Menuestatus==70) && (VarWeiter==LOW) || (Menuestatus==61) && (VarOk==LOW) || (Menuestatus==71) && (VarOk==LOW)){
                                                                                                                                                             ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:676:24: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==50) && (VarOk==LOW) || (Menuestatus==51) && ((VarWeiter==LOW) || (VarReset==LOW))){
      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:682:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:721:24: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==60) && (VarOk==LOW) || (Menuestatus==61) && ((VarWeiter==LOW) || (VarReset==LOW))){
      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:727:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:764:24: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==70) && (VarOk==LOW) || (Menuestatus==71) && ((VarWeiter==LOW) || (VarReset==LOW))){
      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:770:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:807:24: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   if((Menuestatus==80) && (VarOk==LOW) || (Menuestatus==81) && ((VarWeiter==LOW) || (VarReset==LOW))){
      ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
/tmp/arduino_modified_sketch_893116/sketch_oct12a.ino:813:13: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits]
         if(i<0){i=0;}
            ~^~

Da muss noch viel berichtigt werden.

Wss benutzt Du für eine lcd-I2C-Lib?

Funktionen
ich hab mir deine 3 fache Ausgabe vom Menü Mischung rausgesucht.

du könntest dir eine Funktion schreiben:

void showMenuMischung(int activeRow = -1) {
  lcd.clear();
  lcd.setCursor(2, 0);
  lcd.print(F("Mischung"));
  lcd.setCursor(0, 1);
  if (activeRow == 1) lcd.print('>');
  lcd.print(F("Stahlsilo:"));
  lcd.print(Silo);      
  lcd.setCursor(0, 2);
  if (activeRow == 2) lcd.print('>');
  lcd.print(F("Silosack:"));
  lcd.print(Sack);
  lcd.setCursor(0, 3);
  if (activeRow == 3) lcd.print('>');
  lcd.print(F("Einstellungen"));
}

und dann bräuchtest du nur noch z.b. showMenuMischung(1) aufrufen um den Pfeil in die Zeile 1 zu bekommen (oder 2, oder 3 oder Parameter einfach leer lassen).

Geht sicher noch besser, aber so zum Anfangen vieleicht einfach mal ausprobieren.

Wenn du einen bool zusätzlich mit übergibst, kannst du noch das stahlsilo in Zeile1: umschaltbar einbauen und erschlägst damit 3 weitere Ausgaben.

Hatte ich angefangen, aber meine Zugfahrt ist zu Ende. Ich Bau auf der Rückfahrt ggfls. weiter.

Hallo,

mein Senf, habe auch einmal drüber geschaut.
Erstmal sehr gut das du zu einem funktionierendem Programm gekommen bist. Keine Sorge, so fängt jeder an. Jetzt heißt es, Stück für Stück aufzuräumen und das Programm sicherer zu machen, damit es kein Amok läuft.
Paar Dinge wurde schon genannt.
Mir fiel das globale i hier und da auf.
Das wird häufig nur mit +1 oder -1 geändert und an anderer Stelle mit -10000 subtrahiert und auf kleiner 0 geprüft.
So wie es jedoch im Code steht, ist es sicherlich nicht das was gewollt ist.
Das globale i ist als unsigned long deklariert. Soweit so gut. Ob hierfür signed besser wäre muss man sich überlegen. Kommt auf die Verwendung an. Wenn es jedoch für einen Timer ggf. mit millis() benötigt wird, muss es unsigned long bleiben.

Dann gibt es verstreut solche Sachen.

Sack=i+1;
Sack=i-1;
EntleerungsTimerStahlsilo=i+10000;
EntleerungsTimerStahlsilo=i-10000;

Danach wird ein Unterlauf von i geprüft.

if(i<0){i=0;}
if(i>10){i=10;}

Gedanklich richtig, die Prüfung, aber wirklungslos. Weil die oberen 4 Zeilen i nicht ändern. Es wird das Ergebnis der Addition oder Subtraktion Sack oder EntleerungsTimerStahlsilo zugewiesen, nicht dem globalen i. Desweiteren kann i nicht negativ werden, weil es unsigned deklariert ist. Das heißt die Prüfung auf <0 ist wirkungslos.

Danach wird es mit gefährlich mit.

i=Silo;
i=EntleerungsTimerStahlsilo;

Weil hiermit unkontrolliert i ein falscher Wert zugewiesen werden kann.

Hier müsstest du in Ruhe überlegen was wie erreicht werden soll. Kannst du i auf der Seriellen zum debuggen ausgeben lassen. Beim Unterlauf von unsigned, springt der Wert um und macht am oberen Ende des Wertebereichs weiter. Wenn diese plötzlich viel zu groß sind, löst eine Reaktion zu spät aus.

Beim UND und ODER Vergleich warnt der Compiler, dass er nicht sicher ist, was er wie womit vergleichen soll. Kann gut gehen, muss aber nicht. Hier ist die Klammersetzung wichtig, damit die Vergleiche so ausgeführt werden wie man selbst möchte. Hier musste nochmal überlegen ob jeweils 1 aus x (ODER) wahr sein soll und diese Ergebnisse UND verknüpft sein sollen. Oder ob jeweils für sich mehrere Bedingungen wahr sein müssen (UND), um wahr zu sein und diese Ergebnisse am Ende mit 1 aus x ODER verknüpft sein können. Ist schwierig zu beschreiben. Man kann die Logik drehen wie man will und der Compiler sagt dir er kann deine Absicht nicht erkennen. Da es syntaktisch korrekt geschrieben ist, gibt es nur eine Warnung und keinen Fehler.

Edit:

Noch eine Hilfestellung wegen den Logikverknüpfungen.
Um den Überblick zu behalten vielleicht auftrennen, damit es Wochen später noch lesbar bleibt was man machen wollte.

const bool ergebnis1 = ausdruckA || ausdruckB || ausdruckC
const bool ergebnis2 = ausdruckD || ausdruckE || ausdruckF
if (ergebnis1 && ergebnis2)

Bedeteutet, es muss nur irgendeine Bedingung von jeweils A,B,C bzw. D,E,F wahr sein, aber irgendeine muss jeweils wahr sein, damit die Endbedingung mit UND wahr wird.

Anders vertauscht hier.

const bool ergebnis1 = ausdruckA && ausdruckB && ausdruckC
const bool ergebnis2 = ausdruckD && ausdruckE && ausdruckF
if (ergebnis1 || ergebnis2)

Es müssen jeweils A, B und C oder D, E und F wahr sein, damit die Endbedingung wahr wird. Wir können hierbei leider nicht wissen welche Bedingungen du benötigst.

Deine Zugfahrten sind eindeutig zu kurz. :rofl:

Wenn man Start - Ziel am Stück fahren könnte... Aber ne, erstmal werden Stellwerke abgebrannt...

Habe ich versucht aus der Logik zu lesen.
Wenn das aufgelöst ist, dann kann mindestens eine Verknüpfung als Bedingung aufgelöst werden und dann wird übersichtlich.

Das mit dem i und subtrahieren ist übrigens gefährlich, wenn es zum Unterlauf kommt...

Sehe ich anders:
Der Compiler ist sich sicher, dass er das so macht wie in C/C++ vorgegeben. Aber dass ein Mensch (selbst ein Programmierer) damit überfordert ist, hat sich schon öfters gezeigt.
Mit den (evtl. formal überflüssigen) Klammern kriegst du die Warnung weg, besser wäre es aber, die ganze Logik zu überdenken und eventeuell den einzelnen Teilen sprechende Variablen-Namen zu geben, um sich selbst und anderen Lesern das Verständnis zu erleichtern.

Eine globale Variable namens i geht übrigens gar nicht. Variable sollten nur in dem Bereich gültig sein, in dem sie gebraucht werden.

if((Menuestatus==5) && (VarOk==LOW) || (Menuestatus==31) && (VarOk==LOW) || (Menuestatus==80) && (VarWeiter==LOW) || (Menuestatus==41) && (VarOk==LOW) || (Menuestatus==81) && (VarOk==LOW)){

Du kannst hier Klammerpaare rausnehmen oder Klammerpaare einsetzen.
Beides ergibt die selbe Logik.
Was macht der Compiler, wenn die ganz weggelassen werden?
Oder anders gefragt: Nach welcher Logik wird das zusammengebaut?

Lesen:

Das hab ich in einem C(?)-Buch schon mal gelesen.
Am Beispiel von oben interpretiere ich das von links nach rechts erst && dann ||

if(Menuestatus==5 && VarOk==LOW || Menuestatus==31 && VarOk==LOW ||        &&
                   1             4                 2              5        3

aber lesbar ist auch anders.

Ich interpretiere das wie folgt. Der Compiler kann mit dem Code etwas anfangen, weil er syntaktisch korrekt ist. Sonst gebe es einen Fehler. Der Compiler kann nur laut der verlinkten Seite nach der Operatoren Priorität übersetzen. Gleichzeitig merkt er, dass die Klammersetzung "seltsam" ist und gibt eine Warnung aus. Das heißt, dass was der Compiler denkt zu erkennen, muss nicht das sein, was der User beabsichtigt.

Es gibt mehrere Möglichkeiten, mit der Problematik umzugehen:

  1. Man baut in komplizierte Bedingungen Fehler ein, und wundert sich, dass der Code nicht so läuft wie man will.
  2. Man lernt die Tabelle auswendig und arbeitet so konzentriert, dass keine Fehler auftreten.
  3. Man setzt Klammern, da wo sie vielleicht unnötig sind, aber das Vorhaben, die Absicht, klar zum Ausdruck bringen.
  4. Man vereinfacht die Bedingungen, also die Programmlogik soweit, dass diese komplizierten Bedingungen unnötig werden.

Diese Liste ist geordnet, von Dumm zu Schlau.

Manche Menschen können evtl diese komplizierte Bedingungsdenke.
Ich nicht. ca 3 Ebenen, dann ist Schicht im Schacht
Und viele andere hier auch nicht, das ist offensichtlich.
Das verirren in ifs und seinen Bedingungen, sehen wir hier täglich.

Auch von mir noch was

if(digitalRead(Ein)==true){
    VarEin=true;}
  
  else{VarEin=false;}

Geht auch als

VarEin = digitalRead(Ein);

Ich bin echt begeistert wie viele tolle Ideen und Vorschläge bisher kamen :smiley:

werde mich gleich mal ans Werk machen:)

Ich benutze die LCD-I2C von Frank Häfele:)

AAHH!
Mensch, hätt ich mich ja tot suchen können.

Wenn ich nachher wieder unterwegs bin, setz ich mich mal noch ran.
Mal sehen, was mir noch so einfällt :slight_smile: Ideen gibts genug.