[German] Hilfe bei meiner bei If Abfrage

Schalom, ich arbeite gerade an einem kleinen Schul Projekt. Ich baue eine Holzklappbrücke (bewegliche Brücke). Per Knopf druck soll die Brücke hoch/runterfahren (Bis zum Endschalter).

Nun mein Problem.

Beim Hochfahren soll die Brücke folgendes tun:

Rote Lampe geht an > 5 Sec Warten > Brücke fährt hoch > Endschalter wird berührt und die Brücke Stop.

Leider Funktioniert es nicht so richtig. Deswegen bin ich hier

void BrueckeHoch() {

  analogWrite(enA, 255);
if (digitalRead(AufSchalter) == HIGH) {
    digitalWrite(13, HIGH);
    digitalWrite(6, LOW);
    delay(5000);
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);}
  else{}
}  
 void brueckeHochStop() {

if (digitalRead(1) == HIGH && digitalRead(AufSchalter) == HIGH) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);}
  else{}  
 }

Die Brücke fährt zwar hoch aber es stopt nicht. Den Endtaster habe ich schon gecheckt. Achso

13 = Rote LED
6= Grüne LED
in1 = +Motor
in2 = -Motor
1= Endtaster
AufSchalter = Start Knopf

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

  1. Welchen Arduino verwendest Du?
  2. Welchen Motortyp mit welchem Treiber verwendest Du?
  3. <Strg>+t in der IDE formatiert Dein Programm in leserlich.
  4. Programmteile sind wenig hilfreich, denn häufig befindet sich das Problem im unsichtbaren Teil, lehrt die Erfahrung.
  5. Bitte benenne alle Pins mit einem sinnvollen Namen, macht das Verständnis einfacher.
  6. Wenn UNO, dann sind die Pins 0 und 1 für USB reserviert.
  7. Deine Aufgabenstellung läßt sich mit einer Schrittkette (= finite state machine, = endlicher Automat) grundsätzlich leicht lösen. Sagt Dir das was?
  8. delay() ist doof, da blockierend!
  9. Wird Dein Tun benotet?

Dein Code ist leider unvollständig und die Pinbeschreibung auch...

Ich hab mal was gebaut.
Die Pins für Endschalter und Starttaster schalten nach GND.

const byte rotLed = 13;
const byte gruenLed = 6;
const byte motorPin = 10;
const byte in1 = 9;
const byte in2 = 8;
const byte startTaste = 7;
const byte endSchalterOben = 5;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (rotLed, OUTPUT);
  pinMode (gruenLed, OUTPUT);
  pinMode (in1, OUTPUT);
  pinMode (in2, OUTPUT);
  pinMode (startTaste, INPUT_PULLUP);
  pinMode (endSchalterOben, INPUT_PULLUP);
}

void loop()
{
  bruecke();
}

void bruecke()
{
  static uint32_t lastmillis = 0;
  enum {warten, ampelrot, auf, ab, ampelgruen};
  static byte status = warten;
  switch (status)
  {
    case warten:
      analogWrite(motorPin, 0);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      digitalWrite(rotLed, LOW);
      digitalWrite(gruenLed, HIGH);
      if (!digitalRead(startTaste))
      {
        status = ampelrot;
        digitalWrite(rotLed, HIGH);
        digitalWrite(gruenLed, LOW);
        lastmillis = millis();
      }
      break;
    case ampelrot:
      if (millis() - lastmillis > 5000)
      {
        analogWrite(motorPin, 255);
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        status = auf;
      }
      break;
    case auf:
      if (!digitalRead(endSchalterOben))
      {
        analogWrite(motorPin, 0);
        digitalWrite(in1, LOW);
        digitalWrite(in2, LOW);
        // Hier das runterfahren starten
        // Dann in Status ab gehen
      }
      break;
    case ab:
      // Hier auf Endschalter unten warten
      // Dann in Status warten gehen
      break;
  }
}
1 Like

1 Arduino Uno

2 DC und L293D

7 Nein Leider nicht

9 Wir müssen am Ende des Schuljahres eine Facharbeit abgeben. Diese Brücke ist eine Probefacharbeit um zu lernen wie man eine Facharbeit aufbaut. Benotet wird aber nicht die Brücke, sondern die Facharbeit. Heißt nur das geschrieben. Es gilt auch nur als Deutsch Note.

Danke für die Restlichen Tipps. Kannst du mir den weiterhelfen?
Ich weschel gleich mal den pin 0 und 1.

Vielen Dank,

const int AufSchalter = 4;
const int ZuSchalter = 5;
const int tasterauf = 1;
const int tasterzu = 2;
int eingang= A0; 
int sensorwert = 0;
int enA = 9;
int in1 = 8;
int in2 = 7;

void setup() {
  
  pinMode(enA, OUTPUT); //MOTOR
  pinMode(in1, OUTPUT); //MOTOR
  pinMode(in2, OUTPUT); //MOTOR
  pinMode(6, OUTPUT); //LED GRÜN
  pinMode(13, OUTPUT);//(LED Rot)
  pinMode(1, INPUT); // Brücke ist zu (Taster)
  pinMode(2, INPUT); // Brücke ist offen(Taster)
  pinMode(4, INPUT);
  pinMode(5, INPUT);

  
  
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(6, LOW);
  digitalWrite(13, LOW);
}

void loop() {
  AufStop();
  Zu();
  Auf();
  ZuStop();
  Allesaus();
}

void Auf() {
  analogWrite(enA, 255);
if (digitalRead(AufSchalter) == HIGH) {
    digitalWrite(13, HIGH);
    digitalWrite(6, LOW);
    delay(5000);
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);}
  else{}
}  
 void AufStop() {
if (digitalRead(1) == HIGH && digitalRead(AufSchalter) == HIGH) {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);}
  else{}  
 }
void Zu() {
if (digitalRead(ZuSchalter) == HIGH) {
    digitalWrite(6, LOW);
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);}
  else{}  
}
void ZuStop() {
if (digitalRead(tasterzu) == HIGH && digitalRead(ZuSchalter) == HIGH) {
    digitalWrite(in1, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(in2, LOW);}
  else{}  
}
void Allesaus(){
  if (digitalRead(AufSchalter) == LOW && digitalRead(ZuSchalter) == LOW){
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(13, LOW);
  }
}

Hier mein ganzer Sketch

Na schick...
Oben bezeichnest Du die Pins.
Benutze die Bezeichnungen auch im Code. (Siehe meins oben)

Wenn du pinMode(x,INPUT) nutzt, musst Du die Pins extern mit einem PULLUP oder PULLDOWN Widerstand beschalten.
Darauf kannst Du verzichten, wenn Du statt dessen INPUT_PULLUP benutzt. (Siehe meins :wink: )
Der Taster/Schalter schliesst dann nach GND

Zu den Pin 0 und 1 wurde schon gesagt.
Deine IF-Bedingungen werden bei jedem Durchlauf komplett durchlaufen.
Wenn Du das mit switch/case machst, wird jeder Schritt nacheinander abgearbeitet.

Mit der Vorlage von oben sollte das eigentlich recht schnell zu lösen sein...

1 Like

Perfekt Danke. Hier ist eine Exakte veranschauung meines Aufbaus.


(Wichtig, Tinker cad hat keinen Schalter mit 3 Positionen. In Wirklichkeit habe ich aber einen mit 3 Positionen Verbaut.)

Ich probiere es jetzt mit deinem Code aus. Wenn ich es richtig verstanden habe, regelt dein Code nur das Hoch fahren. Könntest du mir dabei helfen, noch 2 weitere Optionen hinzuzufügen? Nämlich für die neutrale Position und die untere Position des Schalters.

In der neutralen Position soll die Grüne Lampe leuchten (Nur wenn die Brücke Runtergefahren ist)

In der Unteren Position soll die Brücke nach unten fahren. Bis zum Endschalter und danach grün leuchten.

MFG

Achso und vielen dank für den Tipp mit INPUT_PULLUP

@my_xy_projekt programmiert sowas nebenbei, während er noch einen spannenden Krimi schaut oder dergleichen tut. Vermutlich hat er das Konzept schon fertig im Kopf.

Jetzt bist Du dran, die gemachten Hinweise in die Tat umzusetzen und das Ergebnis zu zeigen.

Da fehlt mir noch was.
Wenn die fährt und der Schalter in die Neutralposition geht, dann HALT?

Ja okay, das Problem ist nur ich verstehe den Großteil seines Codes gar nicht. Ich fange gerade erst mit C++ an.

In der neutralen Position soll Garnichts passieren. Also Motor Stoppen.

Leseempfehlung: ArduinoForum.de - Das deutschsprachige Forum rund um den Arduino - Arduino Code-Referenz (deutsch) Dort das pdf runterladen.
Alles super erklärt - von einem User und nicht von einem Lektor fachchinesisch gegengelesen.

Vielen Dank, ich werde mich definitiv reinlesen. Ich habe noch weitere Arduino Projekte in Zukunft vor. Aber jetzt will ich eigentlich nur das diese Brücke endlich Funktioniert

Na dann hab ich mal was gebaut.
[EDIT] Im runterfahren noch was geändert, weil die wartestellung mittendrin sonst nicht mehr beendet wird.

const byte rotLed = 13;
const byte gruenLed = 6;
const byte motorPin = 10;
const byte in1 = 9;
const byte in2 = 8;
const byte endSchalterOben = 5;
const byte endSchalterUnten = 4;
const byte startTasteAuf = 3;
const byte startTasteAb = 2;

const bool rot = 0;
const bool gruen = 1;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode (rotLed, OUTPUT);
  pinMode (gruenLed, OUTPUT);
  pinMode (in1, OUTPUT);
  pinMode (in2, OUTPUT);
  pinMode (startTasteAuf, INPUT_PULLUP);
  pinMode (startTasteAb, INPUT_PULLUP);
  pinMode (endSchalterOben, INPUT_PULLUP);
  pinMode (endSchalterUnten, INPUT_PULLUP);
}

void loop()
{
  bruecke();
}

void motorStop()                        // funktion zum anhalten - spart Schreibarbeit
{
  analogWrite(motorPin, 0);
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
}

void led(const bool farbe)              // funktion für die Ampel - spart Schreibarbeit
{
  if (farbe == rot)
  {
    digitalWrite(gruenLed, LOW);
    digitalWrite(rotLed, HIGH);
  }
  else
  {
    digitalWrite(rotLed, LOW);
    digitalWrite(gruenLed, HIGH);
  }
}
//
void bruecke()
{
  static uint32_t lastmillis = 0;
  enum {warten, ampelrot, auf, ab, ampelgruen};
  static byte status = warten;
  if (digitalRead(startTasteAuf) &&
      digitalRead(startTasteAb))                    // Wenn Mittenposition
  {
    status = warten;                                // dann ...
  }
  switch (status)
  {
    case warten:
      motorStop();                                  //
      if (!digitalRead(startTasteAuf))              // Hoch?
      {
        status = ampelrot;                          // Status setzen
        lastmillis = millis();                      // Auslösezeit merken
      }
      if (digitalRead(startTasteAb))                // Runter?
      {
        status = ab;                                // dann dahin springen
      }
      break;
    case ampelrot:
      led(rot);                                     // Ampel auslösen
      if (millis() - lastmillis > 5000)             // Wenn Zeit um
      {
        analogWrite(motorPin, 255);
        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        status = auf;                               // nächster Status
      }
      break;
    case auf:
      if (!digitalRead(endSchalterOben) )           // Warten bis oben
      {
        motorStop();
      }
      if (!digitalRead(startTasteAb))               // Wenn Richtung geändert wird
      {
        motorStop();
        status = ab;
      }
      break;
    case ab:
      analogWrite(motorPin, 255);
      digitalWrite(in2, HIGH);
      if (!digitalRead(endSchalterUnten))            // wenn unten angeschlagen
      {
        motorStop();                                 // halt
        lastmillis = millis();                       // Zeit merken
        status = ampelgruen;                         // nächster Status
      }
      break;
    case ampelgruen:
      if (millis() - lastmillis > 1000)              // Zeit um?
      {
        led(gruen);                                  // freigeben
      }
      break;
  }
}

Das kommentieren ist immer das schlimmste - aber ich hoffe es genügend gemacht zu haben.

1 Like

Ich habe den versteckten Fehler gefunden :slightly_smiling_face:

Ups... war ich noch nachlässig? Und ich dachte einen Plan zu haben.
Na mal sehen.

Erstmal vielen Dank das du mir hilfst. Ich habe mein Simulationsboard auf deinen Code angepasst. Ich habe wie du sagtest die Widerstände entfernt. Nur leider Funktioniert er nicht Richig.

Die Schaltung:

Wenn ich denn "startTasteAuf" Schalter betätige dreht der Motor mit -9000rpm. Schonmal gut. Er stop allerdings nicht, wenn ich "endSchalterOben" trigger. Allerdings stopt er, wenn ich "endSchalterUnten" trigger.

Bei "startTasteAb" passiert leider nichts.

Wenn es ein Fehler meinerseits ist, lass es mich bitte wissen

Zeile 73:

      if (digitalRead(startTasteAb))                // Runter?

Da fehlt das ! - Schau oben drüber Zeile 68 bei startTasteAuf.
Rest schau ich gleich nochmal.

Ja Perfekt, das fehlende "!" hat alles behoben. Funktioniert wirklich Perfekt, vielen Dank. Deutlich besser als mein alter code xD