Fahrstuhl Projekt. Etagen speichern nicht aktuelle Position

Hallo,
Ich und ein Freund haben für ein Schulprojekt eine Fahrstuhl Programmierung geschrieben.

Dafür haben wir einmal ein Programm geschrieben, indem der Etagenablauf automatisch festgehalten ist.
siehe CODE1

und einmal ein Programm geschrieben, indem wir das Programm ausgeschrieben haben.
siehe CODE2

Bei beiden haben wir das Problem, dass die Etagen nur einmal angesteuert werden können. D.h. nach einmaligen erreichen der Etage, erzeugt ein weiterer Knopfdruck eines anderen Etagen-Tasters, keine Veränderungen der Etagen, welche hier mit den Gelben LED's Siumliert wird.

-Arduino Genuino Uno

-Die Variabeln "Auf und Zu", welche in beiden Codes zu finden sind, haben noch keine Implimentation. Können somit ignorriert werden. (Diese siumlieren das auf und zu gehen der Fahrstuhl-Türen.)

---Hauptproblem---

Wie kriegen wir es hin, dass der Fahrstuhl DAUERHAFT/MEHRFACH betätigt werden kann.!
Wir würden uns riesig freuen, wenn einer von den beiden Codes korrigiert werden könnte, bzw uns wissen zulassen wie wir das Implimentieren können. Danke im Vorraus

CODE 1:

int Zu = 2;
int Auf = 3;

int Knopf1 = 7;
int Knopf2 = 6;
int Knopf3 = 5;
int Knopf4 = 4;

int Tasterstatus1 = 0;
int Tasterstatus2 = 0;
int Tasterstatus3 = 0;
int Tasterstatus4 = 0;

int Etage1 = 13;
int Etage2 = 12;
int Etage3 = 11;
int Etage4 = 10;

int AnzahlLED = 4;
int AktuelleLED = 0;
int ZielLED = 0;

int AnzahlStockwerke = 4;
int AktuellesStockwerk = 0;
int Zielstockwerk = 0;

int AktuelleEtage = 0;
int ZielEtage = 0;

void setup()
{
  Serial.begin(9600);

  pinMode(Zu, OUTPUT);
  pinMode(Auf, OUTPUT);

  pinMode(Knopf1, INPUT);
  pinMode(Knopf2, INPUT);
  pinMode(Knopf3, INPUT);
  pinMode(Knopf4, INPUT);

  pinMode(Etage1, OUTPUT);
  pinMode(Etage2, OUTPUT);
  pinMode(Etage3, OUTPUT);
  pinMode(Etage4, OUTPUT);
}

void loop()
{
// (1) Knöpfe Input wird hier mit den jeweiligen Stockwerk verbunden (Knopf zu LED)

Tasterstatus1 = digitalRead(Knopf1);
if (Tasterstatus1 == HIGH)
{
    Zielstockwerk = 1;
}

Tasterstatus2 = digitalRead(Knopf2);
if (Tasterstatus2 == HIGH)
{
    Zielstockwerk = 2;
}

Tasterstatus3 = digitalRead(Knopf3);
if (Tasterstatus3 == HIGH)
{
    Zielstockwerk = 3;
}

Tasterstatus4 = digitalRead(Knopf4);
if (Tasterstatus4 == HIGH)
{
    Zielstockwerk = 4;
}


// (2) LED's/Etagen werden hier deklariert

  if (AktuelleLED == 1)
  {
    digitalWrite (Etage1, HIGH);
  }
  else
  {
    digitalWrite (Etage1, LOW);
  }

  if (AktuelleLED == 2)
  {
    digitalWrite (Etage2, HIGH);
  }
  else
  {
    digitalWrite (Etage2, LOW);
  }

  if (AktuelleLED == 3)
  {
    digitalWrite (Etage3, HIGH);
  }
  else
  {
    digitalWrite (Etage3, LOW);
  }

  if (AktuelleLED == 4)
  {
    digitalWrite (Etage4, HIGH);
  }
  else
  {
    digitalWrite (Etage4, LOW);
  }

//(3) Eigentliche Programmierung des Fahrstuhls

     if (AktuellesStockwerk == Zielstockwerk)
      {
       Serial.println(" Angekommen");
       Zielstockwerk = AktuellesStockwerk ;
       while (Zielstockwerk == AktuellesStockwerk)
       {
        AktuelleLED = Zielstockwerk;
       }

       } else if (AktuellesStockwerk < Zielstockwerk)
       {
       Serial.println(" Nach oben fahren");
       AktuelleLED +1;
       AktuellesStockwerk++;


      } else if (AktuellesStockwerk > Zielstockwerk)
      {
       Serial.println(" Nach unten fahren");
       AktuelleLED -1;
       AktuellesStockwerk--;
       }
}

Code 2:

int Zu = 2;
int Auf = 3;

int Knopf1 = 7;
int Knopf2 = 6;
int Knopf3 = 5;
int Knopf4 = 4;

int Tasterstatus1 = 0;
int Tasterstatus2 = 0;
int Tasterstatus3 = 0;
int Tasterstatus4 = 0;

int Etage1 = 13;
int Etage2 = 12;
int Etage3 = 11;
int Etage4 = 10;

int AnzahlLED = 4;
int AktuelleLED = 0;
int ZielLED = 0;

int AnzahlStockwerke = 4;
int AktuellesStockwerk = 0;
int Zielstockwerk = 0;

int AktuelleEtage = 0;
int ZielEtage = 0;

void setup()
{
  Serial.begin(9600);

  pinMode(Zu, OUTPUT);
  pinMode(Auf, OUTPUT);

  pinMode(Knopf1, INPUT);
  pinMode(Knopf2, INPUT);
  pinMode(Knopf3, INPUT);
  pinMode(Knopf4, INPUT);

  pinMode(Etage1, OUTPUT);
  pinMode(Etage2, OUTPUT);
  pinMode(Etage3, OUTPUT);
  pinMode(Etage4, OUTPUT);
}

void loop() {

digitalWrite(Etage1, HIGH);
  Tasterstatus1=digitalRead(Knopf1);
if (Tasterstatus1 == HIGH)
{
  Zielstockwerk = 1;
}

  Tasterstatus2=digitalRead(Knopf2);
if (Tasterstatus2 == HIGH)
{
  Zielstockwerk = 2;
}

Tasterstatus3=digitalRead(Knopf3);
if (Tasterstatus3 == HIGH)
{
  Zielstockwerk = 3;
}

Tasterstatus4=digitalRead(Knopf4);
if (Tasterstatus4 == HIGH)
{
  Zielstockwerk = 4;
}

  // ZIELSTOCKWERK 1      ZIELSTOCKWERK 1         ZIELSTOCKWERK 1         ZIELSTOCKWERK 1         ZIELSTOCKWERK 1

  if (Zielstockwerk == 1 && AktuellesStockwerk == 1)
  {
    while (Zielstockwerk == 1)
    {
      digitalWrite(Etage1, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;
  }

  if (Zielstockwerk == 1 && AktuellesStockwerk == 2)
  {
    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    while (Zielstockwerk == 1)
    {
      digitalWrite(Etage1, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }

  if (Zielstockwerk == 1 && AktuellesStockwerk == 3)
  {
    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    while (Zielstockwerk == 1)
    {
      digitalWrite(Etage1, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 1 && AktuellesStockwerk == 4)
  {

    digitalWrite(Etage4, HIGH);
    delay(150);
    digitalWrite(Etage4, LOW);
    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    while (Zielstockwerk == 1)
    {
      digitalWrite(Etage1, HIGH);

    }
    Zielstockwerk = AktuellesStockwerk;

  }


  // ZIELSTOCKWERK 2     ZIELSTOCKWERK 2     ZIELSTOCKWERK 2     ZIELSTOCKWERK 2     ZIELSTOCKWERK 2     ZIELSTOCKWERK 2
  if (Zielstockwerk == 2 && AktuellesStockwerk == 1)
  {
    digitalWrite(Etage1, HIGH);
    delay(150);
    digitalWrite(Etage1, LOW);
    while (Zielstockwerk == 2)
    {
      digitalWrite(Etage2, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }

  if (Zielstockwerk == 2 && AktuellesStockwerk == 2)
  {

    while (Zielstockwerk == 2)
    {
      digitalWrite(Etage2, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }

  if (Zielstockwerk == 2 && AktuellesStockwerk == 3)
  {
    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    while (Zielstockwerk == 2)
    {
      digitalWrite(Etage2, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }


  if (Zielstockwerk == 2 && AktuellesStockwerk == 4)
  {
    digitalWrite(Etage4, HIGH);
    delay(150);
    digitalWrite(Etage4, LOW);
    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    while (Zielstockwerk == 2)
    {
      digitalWrite(Etage2, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }

  //ZIELSTOCKWERK 3    ZIELSTOCKWERK 3    ZIELSTOCKWERK 3    ZIELSTOCKWERK 3    ZIELSTOCKWERK 3    ZIELSTOCKWERK 3    ZIELSTOCKWERK 3

  if (Zielstockwerk == 3 && AktuellesStockwerk == 1)
  {
    digitalWrite(Etage1, HIGH);
    delay(150);
    digitalWrite(Etage1, LOW);
    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    while (Zielstockwerk == 3)
    {
      digitalWrite(Etage3, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 3 && AktuellesStockwerk == 2)
  {
    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    while (Zielstockwerk == 3)
    {
      digitalWrite(Etage3, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 3 && AktuellesStockwerk == 3)
  {
    while (Zielstockwerk == 3)
    {
      digitalWrite(Etage3, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 3 && AktuellesStockwerk == 4)
  {
    digitalWrite(Etage4, HIGH);
    delay(150);
    digitalWrite(Etage4, LOW);
    while (Zielstockwerk == 3)
    {
      digitalWrite(Etage3, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  //ZIELSTOCKWERK 4     ZIELSTOCKWERK 4     ZIELSTOCKWERK 4     ZIELSTOCKWERK 4     ZIELSTOCKWERK 4     ZIELSTOCKWERK 4

  if (Zielstockwerk == 4 && AktuellesStockwerk == 1)
  {
    digitalWrite(Etage1, HIGH);
    delay(150);
    digitalWrite(Etage1, LOW);
    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    while (Zielstockwerk == 4)
    {
      digitalWrite(Etage4, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 4 && AktuellesStockwerk == 2)
  {

    digitalWrite(Etage2, HIGH);
    delay(150);
    digitalWrite(Etage2, LOW);
    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    while (Zielstockwerk == 4)
    {
      digitalWrite(Etage4, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 4 && AktuellesStockwerk == 3)
  {

    digitalWrite(Etage3, HIGH);
    delay(150);
    digitalWrite(Etage3, LOW);
    while (Zielstockwerk == 4)
    {
      digitalWrite(Etage4, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }
  if (Zielstockwerk == 4 && AktuellesStockwerk == 4)
  {

    while (Zielstockwerk == 4)
    {
      digitalWrite(Etage4, HIGH);
    }
    Zielstockwerk = AktuellesStockwerk;

  }

}

Schaltplan|429x500
Aufbau 1|690x388

Ich habe mir deinen Sketch und die Bilder nur kurz angeschaut.
Du fragst die Taster auf HIGH ab und diese sind mit einem Pullup-Widerstand ständig auf HIGH. So kann das nicht funktionieren.
Baue deine Abfrage auf LOW um.
Auch kannst du interne Pullup-Widerstände verwenden. Dann sparst du die externen Widerstände.

Hier, Dein while (Zielstockwerk == AktuellStockerk) wird zur Endlosschleife
Du setzt hier die Bedinung: 'Solange Zielstockwerk == AktuellStockwerk , AktuelleLED = ZielSockwerk' nun wiederhole. Damit bleibst Du ewig in dieser while schleife stecken, da ja während der ausführung der schleife sich werder Zielstockwerk, noch Aktuellstockwerk jemals ändern können. denn das Programm tut ja innerhalb dieses while-Loops nichts anderes, als den Wert der AktuelleLED auf den Wert von Zielstockwerk setzen, und dies endlos.

Du kommst beim erreichen des Stockwerkes aus der Schleife nicht mehr raus:

    while (Zielstockwerk == 1)
    {
      digitalWrite(Etage1, HIGH);
    }

@Deltaflyer war schneller...

Mal ne Nachfrage:
Wenn der Fahrstuhl auf einer Etage steht, soll die EtagenLED an sein?
Wenn er losfährt, geht die Etage aus - und an jeder Etage wo er viorbei fährt, erst an, dann aus - bis in die Zieletwage und da bleibt die LED wieder an?

Im 2. Code hast Du hier mit diesem Construct dieselbe Endlos-schleife gebaut, nur hast du das im 2. Code zur Sicherheit , wie ich so beim überfliegen gesehen habe, mindestens 3x gemacht. damit ist zu 100% garantiert, dass Dein Programm sicher stecken bleibt und nix mehr geht.

Oh ich hatte nicht genau genug hingeschaut, Du hast das im 2. Code sogar in JEDEM Stockwerk 3x so gemacht.

Ja genau. Die LED's Simulieren die Position des Fahrstuhls. Genau so wie du das beschrieben hast.

Okay, hatten da auch einige Probleme mit. Stellen das nächste Woche mal um. Danke für den Tipp

Ja haha. Wir werden das ändern. Wir sind recht neu in diesem Bereich. Danke aber das du uns darauf hingewiesen hast :slight_smile:

So, dann beschreib mal weiter...
Wenn der Fahrstuhl die Etage erreicht, geht die Tür auf und bleibt offen (zusammen mit der leuchtenden LED)?
Mit dem auslösen der neuen Etage, geht die Tür zu (LED AUF = AUS, LED ZU = AN, Wenn die AN ist, geht die EtagenLED aus) der Fahrstuhl fährt sein Ziel an (wie oben beschrieben)?

Dann macht Ihr Euch zuviel Aufwand.
Wird das ein Prüfungsobjekt? Für den Code oder für die Logik? Oder beides?

Wie schätzt Du Deine Kenntnisse rund um die Programmiersprache ein?

Danke für die Hilfe. Hier ist unser Funktionsfähiges Fertiges Projekt.

int Zu = 2;
int Auf = 3;

int Knopf1 = 7;
int Knopf2 = 6;
int Knopf3 = 5;
int Knopf4 = 4;

int Tasterstatus1 = 0;
int Tasterstatus2 = 0;
int Tasterstatus3 = 0;
int Tasterstatus4 = 0;

int Etage1 = 13;
int Etage2 = 12;
int Etage3 = 11;
int Etage4 = 10;

int AnzahlLED = 4;
int AktuelleLED = 0;
int ZielLED = 0;

int AnzahlStockwerke = 4;
int AktuellesStockwerk = 1;
int Zielstockwerk = 1;

int AktuelleEtage = 1;
int ZielEtage = 0;

void setup()
{
  Serial.begin(9600);

  pinMode(Zu, OUTPUT);
  pinMode(Auf, OUTPUT);

  pinMode(Knopf1, INPUT);
  pinMode(Knopf2, INPUT);
  pinMode(Knopf3, INPUT);
  pinMode(Knopf4, INPUT);

  pinMode(Etage1, OUTPUT);
  pinMode(Etage2, OUTPUT);
  pinMode(Etage3, OUTPUT);
  pinMode(Etage4, OUTPUT);
}

void loop()
{
// (1) Knöpfe Input wird hier mit den jeweiligen Stockwerk verbunden (Knopf zu LED)

Tasterstatus1 = digitalRead(Knopf1);
if (Tasterstatus1 == HIGH)
{
    Zielstockwerk = 1;
}

Tasterstatus2 = digitalRead(Knopf2);
if (Tasterstatus2 == HIGH)
{
    Zielstockwerk = 2;
}

Tasterstatus3 = digitalRead(Knopf3);
if (Tasterstatus3 == HIGH)
{
    Zielstockwerk = 3;
}

Tasterstatus4 = digitalRead(Knopf4);
if (Tasterstatus4 == HIGH)
{
    Zielstockwerk = 4;
}


// (2) LED's/Etagen werden hier deklariert

  if (AktuelleLED == 1)
  {
    digitalWrite (Etage1, HIGH);
  }
  else
  {
    digitalWrite (Etage1, LOW);
  }

  if (AktuelleLED == 2)
  {
    digitalWrite (Etage2, HIGH);
  }
  else
  {
    digitalWrite (Etage2, LOW);
  }

  if (AktuelleLED == 3)
  {
    digitalWrite (Etage3, HIGH);
  }
  else
  {
    digitalWrite (Etage3, LOW);
  }

  if (AktuelleLED == 4)
  {
    digitalWrite (Etage4, HIGH);
  }
  else
  {
    digitalWrite (Etage4, LOW);
  }

//(3) Eigentliche Programmierung des Fahrstuhls

     if (AktuellesStockwerk == Zielstockwerk)
      {
        delay(1600);
       Serial.println(" Angekommen");
        digitalWrite(Zu, LOW);
       digitalWrite(Auf, HIGH);
      

  
       Zielstockwerk = AktuellesStockwerk ;
       while (Zielstockwerk == AktuellesStockwerk)
       {
        AktuelleLED = Zielstockwerk;
        break;
       }

       } else if (AktuellesStockwerk < Zielstockwerk)
       {delay(800);
       Serial.println(" Nach oben fahren");
       digitalWrite(Auf, LOW);
       digitalWrite(Zu, HIGH);
       delay(1600);
       AktuelleLED ++;
       AktuellesStockwerk++;
       delay(800);
    

             


      } else if (AktuellesStockwerk > Zielstockwerk)
      {delay(800);
       Serial.println(" Nach unten fahren");
       digitalWrite(Auf, LOW);
       digitalWrite(Zu, HIGH);
       delay(1600);
       AktuelleLED --;
       AktuellesStockwerk--;
       delay(800);
     
  
       
       }
}

Einen Schönen Tag noch.

Ein wenig Kritik:

int Zu = 2;

Alle Pins sind von Euch als int gesetzt. dafür reicht ein byte
für die Stati sogar ein bool
Spart schon mal 100 bytes an Code
Und PIN-Nummern ändern sich nicht. Mach daraus ein const

Die StatusVariablen für die Tasten braucht ihr nicht. Du kannst die Abfrage der Taste in der Bedingung machen.

Und dann ist da ganz viel Code mehrfach geschrieben.
Das geht mit Arrays einfacher und wird übersichtlicher.
Die delay() tun weh, ihr blockiert damit den gesamten Code.

Aber schick. Da lässt sich rauslesen, was ihr machen wollt.

Unsinn erschwert das Verständnis, auch wenn es beim Ablauf nicht stört.

1 Like