raufenautomat problem...

Hallo, da bin ich wieder. mein Vater und ich bauen gerade an einem Heuraufen automat ,welcher eine zeit abwarten soll
danach den motor drehen(füttern) und nach einer bestimmten zeit schauen ob die Zinken(welche an einer welle am motor hängen) an dem hallsensor vorbei gekommen sind, wenn nicht ,den motor stehen lassen und auf dem display schreiben Fehler und bis beide knöpfe gedrückt sind(es sind knöpfe mit integrierten Leds falls das wichtig ist) die rote led blinken lassen.

mein problem ist, die Zeit wird runtergezählt, aber er erkennt nicht dass der hallsensor kein signal gesendet hat. also er ist noch nicht angeschlossen genauso wenig wie die Motoren aber dass kein signal kommt sollte er ja merken.
auf jeden fall fängt er einfach wieder bei der ausgangs zeit von neuem an zu zählen(also als ob der sensor ein signal gesendet hätte)

hoffentlich kann jemand hierfür eine Lösung finden weil ich bin verzweifelt.

P.S ich bin noch nicht so der pro im Arduino programmieren wie man es im code wahrscheinlich auch sieht

#include <LiquidCrystal.h>
LiquidCrystal lcd(27, 7, 8, 23, 10, 28);
struct LED_KNOPF  {
  String Namen;
  int Led_pin;
  int Knopf_pin;
};
LED_KNOPF Belegung[]  {
  {"Gruen1",52},
  {"Rot1", 48},
  {"Gruen2", 40},
  {"Rot2", 44}
};

int noOfLed_Knopf = 4;

int pause1 = 60;
int pause2 = 40;
int aktuelleZeit1 = pause1;
int aktuelleZeit2 = pause2;

int State1 ;
int State2;

long interval = 100;
unsigned long actualMillis;
unsigned long previousmillis = 0;
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
unsigned long previousMillis4 = 0;
long interval12 = 1000;

bool Fuettern2 = false;
bool Fuettern1 = false;
int In1;
int In2;
int In3;
int In4;


int sensor1;
int sensor2;
int sensorpin1 = A4;
int sensorpin2 = A5;
bool sensorspeicher1 = false;
bool sensorspeicher2 = false;
bool Danger1 = false;
bool Danger2 = false;
bool aktualisieren1 = false;
bool aktualisieren2 = false;

void Gefahr(){
  if(Danger1 == true){
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
    lcd.setCursor(1, 1);
    lcd.print("Fehler");
    
    if (actualMillis - previousMillis3 >= 150) {   
    previousMillis3 = actualMillis;
    if (State1 == LOW) {
      State1 = HIGH;
    } else {
      State1 = LOW;
    }
     digitalWrite(Belegung[1].Led_pin, State1);
     digitalWrite(Belegung[0].Led_pin, LOW);

     
    if(Belegung[0].Knopf_pin == HIGH  ){
      if(Belegung[1].Knopf_pin == HIGH){
      Danger1 = false;
      lcd.setCursor(1, 1);
      lcd.print("      ");
      digitalWrite(Belegung[1].Led_pin, LOW);
    }
    }
  }
  }
  if(Danger2 == true){
    digitalWrite(In3, LOW);
    digitalWrite(In4, LOW);
    lcd.setCursor(10, 1);
    lcd.print("Fehler");
    
    if (actualMillis - previousMillis4 >= 150) {
    previousMillis4 = actualMillis;
    if (State2 == LOW) {
      State2 = HIGH;
    } else {
      State2 = LOW;
    }
    digitalWrite(Belegung[3].Led_pin, State2);
    digitalWrite(Belegung[2].Led_pin, LOW);
    
    if(Belegung[2].Knopf_pin == HIGH && Belegung[3].Knopf_pin == HIGH){
      Danger2 = false;
      lcd.setCursor(10, 1);
      lcd.print("      ");
      digitalWrite(Belegung[3].Led_pin, LOW);
    }
  }
}
}

void lcdanzeigen(){
  
  
  if(actualMillis - previousmillis >= interval){
    previousmillis = actualMillis;
    
    
    //neue zeit 1 anzeigen
    if(Danger1 == false){
       digitalWrite(Belegung[0].Led_pin, HIGH);
    aktuelleZeit1 -= 1;
    lcd.setCursor(1, 1);
    lcd.print("   ");
    lcd.setCursor(1, 1);
    lcd.print(aktuelleZeit1);
    }
    // neue Zeit 2 anzeigen
    
    if(Danger2 == false){
      aktuelleZeit2 -= 1;
      digitalWrite(Belegung[2].Led_pin, HIGH);
    lcd.setCursor(12, 1);
    lcd.print("   ");
    lcd.setCursor(12, 1);
    lcd.print(aktuelleZeit2);
    }
  }
  if(aktuelleZeit1 <= 0){Fuettern1 = true;aktualisieren1 = true;aktuelleZeit1 = pause1;}
  
  if(aktuelleZeit2 <= 0){Fuettern2 = true;aktualisieren2 = true;aktuelleZeit2 = pause2;}


}


void MotorZustand() {

if(Fuettern1 == false){
  digitalWrite(In1, LOW);
  digitalWrite(In2, LOW);
}
if(Fuettern2 == false){
  digitalWrite(In3, LOW);
  digitalWrite(In4, LOW);
}

if(Fuettern1 == true && Danger1 == false){
  if(aktualisieren1 == true){
    previousMillis1 = actualMillis;
    aktualisieren1 = false;
  }
  digitalWrite(In1, HIGH);
  digitalWrite(In2, LOW);
  if(sensor1 == 0){
    Fuettern1 = false;
    sensorspeicher1 = true;
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
  }
  
  if(actualMillis - previousMillis1 >= interval12){
    previousMillis1 = actualMillis;
     Fuettern1 = false;
    if(sensorspeicher1 == true){
      sensorspeicher1 = false;
    }
    else{
      Danger1 = true;
    }
  }
}

if(Fuettern2 == true && Danger2 == false){
  if(aktualisieren2 == true){
    previousMillis2 = actualMillis;
    aktualisieren2 = false;
  }
  digitalWrite(In3, HIGH);
  digitalWrite(In4, LOW);
  if(sensor2 == 0){
    Fuettern2 = false;
    digitalWrite(In3, LOW);
    digitalWrite(In4, LOW);
    sensorspeicher2 = true;
  }
  if(actualMillis - previousMillis2 >= interval12){
    previousMillis2 = actualMillis;
     Fuettern2 = false;
    if(sensorspeicher2 == true){
      sensorspeicher2 = false;
    }
    else{
      Danger2 = true;
    }
  }
} 
}


void setup() {
lcd.begin(16, 2);
for (int i = 0; i < noOfLed_Knopf;i++){pinMode(Belegung[i].Led_pin, OUTPUT);pinMode(Belegung[i].Knopf_pin, INPUT);}
pinMode(In1, OUTPUT);
pinMode(In2, OUTPUT);
pinMode(In3, OUTPUT);
pinMode(In4, OUTPUT);
lcd.clear();
//Anfangs das display beschreiben
lcd.setCursor(1, 0);
lcd.print(pause1);
lcd.setCursor(1, 1);
lcd.print(pause1);
lcd.setCursor(12, 0);
lcd.print(pause2);
lcd.setCursor(12, 1);
lcd.print(pause2);
}

void loop () {
  Belegung[0].Knopf_pin = digitalRead(51);
  Belegung[1].Knopf_pin = digitalRead(47);
  Belegung[2].Knopf_pin = digitalRead(39);
  Belegung[3].Knopf_pin = digitalRead(43);
 actualMillis = millis();
 sensor1 = analogRead(sensorpin1);
 sensor2 = analogRead(sensorpin2);
 
 lcdanzeigen();
 MotorZustand();
 
 Gefahr();

 }

Formatiere bitte Deinen Sketch ordentlich /+T in der IDE hilft Dir dabei. Dann ist er besser lesbar.
2 Klammern in der gleichen Spalte untereinander sind schwer zu lesen.

Gruß Tommy

Bitteschön

#include <LiquidCrystal.h>
LiquidCrystal lcd(27, 7, 8, 23, 10, 28);
struct LED_KNOPF  {
  String Namen;
  int Led_pin;
  int Knopf_pin;
};
LED_KNOPF Belegung[]  {
  {"Gruen1", 52},
  {"Rot1", 48},
  {"Gruen2", 40},
  {"Rot2", 44}
};

int noOfLed_Knopf = 4;

int pause1 = 60;
int pause2 = 40;
int aktuelleZeit1 = pause1;
int aktuelleZeit2 = pause2;

int State1 ;
int State2;

long interval = 100;
unsigned long actualMillis;
unsigned long previousmillis = 0;
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
unsigned long previousMillis4 = 0;
long interval12 = 1000;

bool Fuettern2 = false;
bool Fuettern1 = false;
int In1;
int In2;
int In3;
int In4;


int sensor1;
int sensor2;
int sensorpin1 = A4;
int sensorpin2 = A5;
bool sensorspeicher1 = false;
bool sensorspeicher2 = false;
bool Danger1 = false;
bool Danger2 = false;
bool aktualisieren1 = false;
bool aktualisieren2 = false;

void Gefahr() {
  if (Danger1 == true) {
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
    lcd.setCursor(1, 1);
    lcd.print("Fehler");

    if (actualMillis - previousMillis3 >= 150) {
      previousMillis3 = actualMillis;
      if (State1 == LOW) {
        State1 = HIGH;
      } else {
        State1 = LOW;
      }
      digitalWrite(Belegung[1].Led_pin, State1);
      digitalWrite(Belegung[0].Led_pin, LOW);


      if (Belegung[0].Knopf_pin == HIGH  ) {
        if (Belegung[1].Knopf_pin == HIGH) {
          Danger1 = false;
          lcd.setCursor(1, 1);
          lcd.print("      ");
          digitalWrite(Belegung[1].Led_pin, LOW);
        }
      }
    }
  }
  if (Danger2 == true) {
    digitalWrite(In3, LOW);
    digitalWrite(In4, LOW);
    lcd.setCursor(10, 1);
    lcd.print("Fehler");

    if (actualMillis - previousMillis4 >= 150) {
      previousMillis4 = actualMillis;
      if (State2 == LOW) {
        State2 = HIGH;
      } else {
        State2 = LOW;
      }
      digitalWrite(Belegung[3].Led_pin, State2);
      digitalWrite(Belegung[2].Led_pin, LOW);

      if (Belegung[2].Knopf_pin == HIGH && Belegung[3].Knopf_pin == HIGH) {
        Danger2 = false;
        lcd.setCursor(10, 1);
        lcd.print("      ");
        digitalWrite(Belegung[3].Led_pin, LOW);
      }
    }
  }
}

void lcdanzeigen() {


  if (actualMillis - previousmillis >= interval) {
    previousmillis = actualMillis;


    //neue zeit 1 anzeigen
    if (Danger1 == false) {
      digitalWrite(Belegung[0].Led_pin, HIGH);
      aktuelleZeit1 -= 1;
      lcd.setCursor(1, 1);
      lcd.print("   ");
      lcd.setCursor(1, 1);
      lcd.print(aktuelleZeit1);
    }
    // neue Zeit 2 anzeigen

    if (Danger2 == false) {
      aktuelleZeit2 -= 1;
      digitalWrite(Belegung[2].Led_pin, HIGH);
      lcd.setCursor(12, 1);
      lcd.print("   ");
      lcd.setCursor(12, 1);
      lcd.print(aktuelleZeit2);
    }
  }
  if (aktuelleZeit1 <= 0) {
    Fuettern1 = true;
    aktualisieren1 = true;
    aktuelleZeit1 = pause1;
  }

  if (aktuelleZeit2 <= 0) {
    Fuettern2 = true;
    aktualisieren2 = true;
    aktuelleZeit2 = pause2;
  }


}


void MotorZustand() {

  if (Fuettern1 == false) {
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
  }
  if (Fuettern2 == false) {
    digitalWrite(In3, LOW);
    digitalWrite(In4, LOW);
  }

  if (Fuettern1 == true && Danger1 == false) {
    if (aktualisieren1 == true) {
      previousMillis1 = actualMillis;
      aktualisieren1 = false;
    }
    digitalWrite(In1, HIGH);
    digitalWrite(In2, LOW);
    if (sensor1 == 0) {
      Fuettern1 = false;
      sensorspeicher1 = true;
      digitalWrite(In1, LOW);
      digitalWrite(In2, LOW);
    }

    if (actualMillis - previousMillis1 >= interval12) {
      previousMillis1 = actualMillis;
      Fuettern1 = false;
      if (sensorspeicher1 == true) {
        sensorspeicher1 = false;
      }
      else {
        Danger1 = true;
      }
    }
  }

  if (Fuettern2 == true && Danger2 == false) {
    if (aktualisieren2 == true) {
      previousMillis2 = actualMillis;
      aktualisieren2 = false;
    }
    digitalWrite(In3, HIGH);
    digitalWrite(In4, LOW);
    if (sensor2 == 0) {
      Fuettern2 = false;
      digitalWrite(In3, LOW);
      digitalWrite(In4, LOW);
      sensorspeicher2 = true;
    }
    if (actualMillis - previousMillis2 >= interval12) {
      previousMillis2 = actualMillis;
      Fuettern2 = false;
      if (sensorspeicher2 == true) {
        sensorspeicher2 = false;
      }
      else {
        Danger2 = true;
      }
    }
  }
}


void setup() {
  lcd.begin(16, 2);
  for (int i = 0; i < noOfLed_Knopf; i++) {
    pinMode(Belegung[i].Led_pin, OUTPUT);
    pinMode(Belegung[i].Knopf_pin, INPUT);
  }
  pinMode(In1, OUTPUT);
  pinMode(In2, OUTPUT);
  pinMode(In3, OUTPUT);
  pinMode(In4, OUTPUT);
  lcd.clear();
  //Anfangs das display beschreiben
  lcd.setCursor(1, 0);
  lcd.print(pause1);
  lcd.setCursor(1, 1);
  lcd.print(pause1);
  lcd.setCursor(12, 0);
  lcd.print(pause2);
  lcd.setCursor(12, 1);
  lcd.print(pause2);
}

void loop () {
  Belegung[0].Knopf_pin = digitalRead(51);
  Belegung[1].Knopf_pin = digitalRead(47);
  Belegung[2].Knopf_pin = digitalRead(39);
  Belegung[3].Knopf_pin = digitalRead(43);
  actualMillis = millis();
  sensor1 = analogRead(sensorpin1);
  sensor2 = analogRead(sensorpin2);

  lcdanzeigen();
  MotorZustand();

  Gefahr();

}

ich habe drei verschiedene schritte 1. lcd aktualisieren also runterzählen des timers bis zum nächsten drehen und falls bei null dem nächsten schritt sagen dass der motor drehen soll.
2. motor drehen falls nötig, also den motor solange drehen bis der sensor sagt dass er wieder bei null ist.
wenn dies nicht in einer bestimmten Zeitspanne passiert(hier sind die Zeiten verkürzt zum testen ) dem nächsten schritt mitteilen dass der motor hängt.
3. wenn der motor hängt alle Funktionen des motors also Leds, die eine Seite des displays, und so abschalten und die rote led blinken lassen dazu auf dem display Fehler schreiben. bis dann beide knöpfe gedrückt wurden
(diese Funktion ist wichtig da es starke Motoren sind un d wenn diese blockiert sind besteht Brandgefahr)

Du solltest dein Programm mal mit ein paar sinnvollen Kommentaren versehen, damit man ( und auch Du in ein paar Wochen noch ) versteht, was da ablaufen soll.

Was mir auffällt:

  • Du initiierst die Pins für deine Knöpfe (Knopf_pin) nicht. Wo und wie sind die angeschlossen?
  • Du setzt In1..In4 als OUTPUT, hast die aber gar nicht mit einem Wert (Pinnummer) initiiert. Ausserdem ist es sehr verwirren einen OUTPUT als IN1 zu bezeichenen ( womit wir auch wieder bei den Kommentaren wären ... )
  • Ich nehme mal an, dass sensorpin die Hall-Sensoren sein sollen? Die liest Du analog ein und fragst dann auf 0 ab. Wenn da nichts angeschlossen ist wirst Du alle möglichen beliebigen Werte als Ergebnis bekommen.
    Du solltest vielleicht auch mal Links zu den verwendeten Komponenten einstellen und ein Schaltbild, wie Du sie angeschlossen hast ( pullup/pulldown Widerstände ? ).

erstmal danke für die Antwort

  1. die knöpfe sind unten in loop iniziiert
    2.In1… sind die h Brücken Anschlüsse die hbrücken sind noch nicht angeschlossen und ich habe die pinbelegungen von ihnen noch nicht benötigt
  2. der sensorschickt wenn ein magnet vorbei läuft eine null also kein signal an den Arduino

die Schaltung funktioniert das habe ich getestet es liegt am code

p4u1:

  1. die knöpfe sind unten in loop iniziiert

Das geht aber vollkommen durcheinander. Sollen das jetzt die Pinnummern sein, oder der Zustand am pin. Im setup initiierst Du die als INPUT:

   pinMode(Belegung[i].Knopf_pin, INPUT);

Dann wären das die Pins, im loop liest Du da einen Status ein. Mit so einem Durcheinander wird das nichts.

p4u1:
2.In1... sind die h Brücken Anschlüsse die hbrücken sind noch nicht angeschlossen und ich habe die pinbelegungen von ihnen noch nicht benötigt

Du initiierst sie aber im setup - dann musst Du sie auch mit einem Wert vorbelegen:

 pinMode(In1, OUTPUT);

p4u1:
3. der sensorschickt wenn ein magnet vorbei läuft eine null also kein signal an den Arduino

Wenn der Sensor ein digitales Signal schickt, dann solltest Du das auch als digitales Signal einlesen und nicht mit analogRead.

p4u1:
die Schaltung funktioniert das habe ich getestet es liegt am code

Du hast aber geschrieben, dass sie noch nicht angeschlossen sind. Und ein offener Eingang verhält sich nunmal unbestimmt.

Dankeschön für die Antwort ich werde morgen alles mal überarbeiten danke

(deleted)

Ich würde an deiner Stelle im Code Serial.print Ausgaben ergänzen die dir zur Laufzeit mitteilen, was der Code so macht und wie die dafür notwendigen Variablen stehen. Damit kannst du selber Verfolgen, was dein Programm macht bzw. nicht macht.

Aktuell hast du eine ziemliche Vermischung zwischen
lcdanzeigen();
MotorZustand();

was welche Funktion macht.

Ich würde da eine saubere Finite State Machine machen. Für jeden Schritt definieren:

  • Was ist zu tun wenn ein Schritt beginnt
  • Was ist während diesem Schritt zu tun
  • Wodurch wird der Schritt beendet
  • Was ist beim Verlassen des Schrittes zu tun

das sauber für alle deine 3 (?) Schritte und dann ein gesamtes Zustandsdiagramm zeichnen. Je Zustand:

4buzzer4m.png

4buzzer4m.png

(deleted)

hier mal dein Code in ordentlicher Formatierung und mit Fragen die als Kommentare eingefügt sind

ich empfehle dir ganz dringend selbsterklärende Namen zu verwenden. Du möchtest ja Hilfe aus dem Forum haben.
Also sollte dein Programm auch leicht verständlich sein. Das wird er durch selbsterklärende Variablennamen
selbsterklärende Variablennamen ersparen dann ganz oft überhaupt einen Kommentar zu schreiben.

Für mich hört sich der Ablauf so an wie wenn es immer ein gleichartiger Ablauf ist.
Das programmiert man am besten über eine sogenannte Statemachine. Auch Überprüfung auf Fehler geht mit einer Statemachine

Mit statemachine ist es einfach durchschaubar. Ohne Statemachine bekommt man immer mehr sich gegenseitig bedingende if-bedingungen und zusätzliche boolsche Variablen die das nachvollziehen des Programmablaufs immer schwieriger machen. Da lohnt es sich einmal das Grundprinzip der statemachine zu erlernen und dann damit zu programmieren.

Wenn du in 3 monaten noch einmal etwas an dem Programm ändern willst und es bliebe im jetzigen Zustand
dann brauchst du eine Woche um das Programm wieder zu verstehen oder 3 Tage um es ganz neu zu programmieren.
Selbst das überprüfen auf Fehler und das Auslösen von Fehlerwarnungen wird damit viel einfacher.

#include <LiquidCrystal.h>
LiquidCrystal lcd(27, 7, 8, 23, 10, 28);
struct LED_KNOPF  {
  char Namen[10];//String Namen;
  int Led_pin;
  int Knopf_pin;
};

LED_KNOPF Belegung[]  { // Belegung sollte auch durch einen selbsterklärenden Namen ersetzt werden
  {"Gruen1", 52},
  {"Rot1", 48},
  {"Gruen2", 40},
  {"Rot2", 44}
};

int noOfLed_Knopf = 4;

int pause1 = 60;
int pause2 = 40;
int aktuelleZeit1 = pause1;
int aktuelleZeit2 = pause2;

int State1 ;
int State2;

unsigned long interval = 100;
unsigned long actualMillis;
unsigned long previousmillis = 0;
unsigned long previousMillis1 = 0;
unsigned long previousMillis2 = 0;
unsigned long previousMillis3 = 0;
unsigned long previousMillis4 = 0;
unsigned long interval12 = 1000;

bool Fuettern2 = false;
bool Fuettern1 = false;
int In1 = 10;//welche IO - PinNr ist es in deinem Projekt?
int In2 = 11;//welche IO - PinNr ist es in deinem Projekt??
int In3 = 12;//welche IO - PinNr ist es in deinem Projekt??
int In4 = 13;//welche IO - PinNr ist es in deinem Projekt??


int sensor1;
int sensor2;
int sensorpin1 = A4;
int sensorpin2 = A5;

bool sensorspeicher1 = false;
bool sensorspeicher2 = false;

// Die beiden "Gefahren" kann man konkret beschreiben
// Beispiel: "Messer_ausgefahren" (=man könnte sich schneiden)
// dann sollten die Variablen selbsterklärende Namen haben
bool Danger1 = false; // woraus besteht Gefahr Nr 1???
bool Danger2 = false; // woraus besteht Gefahr Nr 2???
bool aktualisieren1 = false; // was wird da aktualisiert?
bool aktualisieren2 = false; // was wird da aktualisiert?

void Gefahr() {
  if (Danger1 == true) {
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
    lcd.setCursor(1, 1);
    lcd.print("Fehler");

    if (actualMillis - previousMillis3 >= 150) {
      previousMillis3 = actualMillis;
      if (State1 == LOW) {
        State1 = HIGH;
      } else {
        State1 = LOW;
      }
      digitalWrite(Belegung[1].Led_pin, State1); // nicht nachvollziehbar was Belegung[1] anzeigt
      digitalWrite(Belegung[0].Led_pin, LOW);

      if (Belegung[0].Knopf_pin == HIGH  ) {
        if (Belegung[1].Knopf_pin == HIGH) {
          Danger1 = false;
          lcd.setCursor(1, 1);
          lcd.print("      ");
          digitalWrite(Belegung[1].Led_pin, LOW);
        }
      }
    }
  }
  if (Danger2 == true) {
    digitalWrite(In3, LOW);
    digitalWrite(In4, LOW);
    lcd.setCursor(10, 1);
    lcd.print("Fehler");

    if (actualMillis - previousMillis4 >= 150) {
      previousMillis4 = actualMillis;
      if (State2 == LOW) {
        State2 = HIGH;
      } else {
        State2 = LOW;
      }
      digitalWrite(Belegung[3].Led_pin, State2);
      digitalWrite(Belegung[2].Led_pin, LOW);

      if (Belegung[2].Knopf_pin == HIGH && Belegung[3].Knopf_pin == HIGH) {
        Danger2 = false;
        lcd.setCursor(10, 1);
        lcd.print("      ");
        digitalWrite(Belegung[3].Led_pin, LOW);
      }
    }
  }
}

void lcdanzeigen() {

  if (actualMillis - previousmillis >= interval) {
    previousmillis = actualMillis;

    //neue zeit 1 anzeigen
    if (Danger1 == false) {
      digitalWrite(Belegung[0].Led_pin, HIGH);
      aktuelleZeit1 -= 1;
      lcd.setCursor(1, 1);
      lcd.print("   ");
      lcd.setCursor(1, 1);
      lcd.print(aktuelleZeit1);
    }
    // neue Zeit 2 anzeigen

    if (Danger2 == false) {
      aktuelleZeit2 -= 1;
      digitalWrite(Belegung[2].Led_pin, HIGH);
      lcd.setCursor(12, 1);
      lcd.print("   ");
      lcd.setCursor(12, 1);
      lcd.print(aktuelleZeit2);
    }
  }

  if (aktuelleZeit1 <= 0) {
    Fuettern1 = true;
    aktualisieren1 = true;
    aktuelleZeit1 = pause1;
  }

  if (aktuelleZeit2 <= 0) {
    Fuettern2 = true;
    aktualisieren2 = true;
    aktuelleZeit2 = pause2;
  }


}


void MotorZustand() {

  if (Fuettern1 == false) {
    digitalWrite(In1, LOW);
    digitalWrite(In2, LOW);
  }

  if (Fuettern2 == false) {
    digitalWrite(In3, LOW);
    digitalWrite(In4, LOW);
  }

  if (Fuettern1 == true && Danger1 == false) {
    if (aktualisieren1 == true) {
      previousMillis1 = actualMillis;
      aktualisieren1 = false;
    }
    digitalWrite(In1, HIGH);
    digitalWrite(In2, LOW);
    if (sensor1 == 0) {
      Fuettern1 = false;
      sensorspeicher1 = true;
      digitalWrite(In1, LOW);
      digitalWrite(In2, LOW);
    }

    if (actualMillis - previousMillis1 >= interval12) {
      previousMillis1 = actualMillis;
      Fuettern1 = false;
      if (sensorspeicher1 == true) {
        sensorspeicher1 = false;
      }
      else {
        Danger1 = true;
      }
    }
  }

  if (Fuettern2 == true && Danger2 == false) {
    if (aktualisieren2 == true) {
      previousMillis2 = actualMillis;
      aktualisieren2 = false;
    }

    digitalWrite(In3, HIGH);
    digitalWrite(In4, LOW);

    if (sensor2 == 0) {
      Fuettern2 = false;
      digitalWrite(In3, LOW);
      digitalWrite(In4, LOW);
      sensorspeicher2 = true;
    }

    if (actualMillis - previousMillis2 >= interval12) {
      previousMillis2 = actualMillis;
      Fuettern2 = false;

      if (sensorspeicher2 == true) {
        sensorspeicher2 = false;
      }
      else {
        Danger2 = true;
      }
    }
  }
}


void setup() {
  lcd.begin(16, 2);

  for (int i = 0; i < noOfLed_Knopf; i++) {
    pinMode(Belegung[i].Led_pin, OUTPUT);
    pinMode(Belegung[i].Knopf_pin, INPUT);
  }
  pinMode(In1, OUTPUT); // an dieser Stelle müssen in den Variablen In1 usw. passende Zahlen stehen
  pinMode(In2, OUTPUT); // In1,2,3,4 ist nichtssagend was genau machen die Ausgänge???
  pinMode(In3, OUTPUT);
  pinMode(In4, OUTPUT);
  lcd.clear();
  //Anfangs das display beschreiben
  lcd.setCursor(1, 0);
  lcd.print(pause1);
  lcd.setCursor(1, 1);
  lcd.print(pause1);
  lcd.setCursor(12, 0);
  lcd.print(pause2);
  lcd.setCursor(12, 1);
  lcd.print(pause2);
}

void loop () {
  Belegung[0].Knopf_pin = digitalRead(51);
  Belegung[1].Knopf_pin = digitalRead(47);
  Belegung[2].Knopf_pin = digitalRead(39);
  Belegung[3].Knopf_pin = digitalRead(43);
  actualMillis = millis();
  sensor1 = analogRead(sensorpin1);
  sensor2 = analogRead(sensorpin2);

  lcdanzeigen();
  MotorZustand();

  Gefahr();
}

viele Grüße Stefan

Hi

Ersetze

int noOfLed_Knopf = 4;

durch

int noOfLed_Knopf = sizeof(Belegung)/sizeof(Belegung[0]);

Das hat den Vorteil, daß der Kompiler Dir die Anzahl der Inhalte berechnet - Du kannst die Liste ändern, der Kompiler 'macht den Rest'.

Da sich diese Anzahl wohl während der Laufzeit nicht mehr ändern wird, gehört noch ein CONST davor - dadurch ermöglichst Du dem Kompiler, diese Anzahl fest im Code einzubringen und den Code dadurch zu verkleinern.

ALLES, Was konstant ist, auch so deklarieren!

Konstante Werte kann der Kompiler fest 'verdrahten' - Das ist im Endeffekt nur noch eine Zahl im Code - ohne das 'const' ist Das eine Variable, Die jedes Mal auf's Neue aus dem Speicher ausgelesen wird - Das kostet dann also auch noch Rechenzeit.

MfG

Entschuldigung dass ich nicht geantwortet habe mein laptop war leer und ich fand mein Ladekabel nicht

aber danke für diese vielen hilfreichen antworten!!
ich werd mich jetzt mal daran machen das alles umzusetzen