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.