While-Schleife macht nicht das, was ich gern möchte

Hallo zusammen,

beim Versuch eine zusätzliche Sicherheitsschaltung für mein Garagentor zu bauen scheitere ich am Programmieren.
Das Ziel ist, das Tor beim Erkennen eines Hindernisses anzuhalten und wieder zu schließen. Als Bord habe ich mich für den Arduino Nano entschieden und die Hindernisüberwachung möchte ich mit 5 Stück HC-SR04 Ultraschallsensoren realisieren. Die Sensoren habe ich im Griff und auch das Relais macht, was es soll. Mein Problem ist, dass die Überwachung nur aktiv sein soll, wenn das Tor auch öffnet. Das Signal hierzu kann ich am Motor abgreifen und mittels Optokoppler-Relais auf einen Eingang am Arduino melden. Eigentlich dachte ich, dass dies mit einer While-Schleife funktionieren müsste, aber irgendwie läuft der Loop stetig.

Kann mir hier eventuell jemand helfen, oder hat wer einen Tipp den Sketch zu vereinfachen?

Vorab schonmal viele Dank,

Maik

Test_mehrere_SONAR_jan07e.ino (5.53 KB)

Das Tor hat mehrere Zustände, z.B. Offen, Geschlossen, Öffnend, Schließend, die in einer Zustandsvariablen gespeichert werden können - siehe State Machine (Automat). Dann kannst Du leicht feststellen, was im Falle eines Alarms getan werden sollte.

Hallo
zum Morgenkaffee habe ich den Sketch überflogen. Die Schleife while (freigabe); wird in der LOOP() nie verlassen so lange die Variable freigabe den Wert 1 an nimmt. Variable freigabe wird in der LOOP nicht bearbeitet.
Der Sketch birgt eine Menge von Optimierungsmöglichkeiten, z.b. das Messen der Entfernung in eine Funktion zusammenfassen, usw. Hilfreich ist hier die Verwendung des EVA-Prinzips: E=Eingabe, V-Verabeitung und A=Ausgabe. Die Anwendung von SWITCH/CASE-, ARRAYs und der STRUCT-Anweisung macht den Sketch schlanger und die Vermeidung der delay-Funktion, im Sketch sind 25 vorhanden, echtzeitfähig.

Hallo,

Eigendlich ist Dein Ansatz falsch, sowas löst man mittels logischer Verknüfungen und / oder . Zudem wären ein paar Komentare nicht schlecht. In einem halben Jahr weißt selbst Du nicht mehr was in den einzelnen Abschitten gemacht wird.

Du solltest auch auf delay verzichten und zeitliche Abläufe mittels millis lösen. Versuche while durch if Konstrukte zu ersetzen. Du solltest Dir das Thema Functionen ansehen.

zu Deinem while

while (freigabe); {

da ist das ; das Problem das ist zuviel muss weg.

Heinz

Allen schonmal vielen Dank,

jetzt habe ich ein paar Ansätze für mein Problem. Ich werde den Sketch mal überarbeiten und lade dann die neue Version hoch.

LG
Maik

Hallo,

noch ein Hinweis. Deine Variable float freigabe hat doch bestimmt nur bool Charakter? Dann ändere sie zu bool. float ist dafür der schlechtmöglichste Datentyp. Und über solche Zeilen wie

freigabe=digitalRead(oeffnungsvorgang)==HIGH;

Sollte das eine if Abfrage werden? Wenn ja, wäre die Abfrage auf High bzw. true Rückgabewert wie folgt korrekt.

freigabe = if (digitalRead(oeffnungsvorgang));

// Was du vielleicht schreiben wolltest wäre
freigabe = if (digitalRead(oeffnungsvorgang) == HIGH);

oder

 while (freigabe); { 
....

Hier muss mindestens das Semikolon weg.

Und wegen dem while Ausdruck. Ganz konkret. while wird solange ausgeführt solange der Ausdruck wahr ist. wahr ist alles was größer 0 ist. Das kann manchmal entscheidend sein wenn man das ausnutzen möchte für irgendwelche Auswertungen.

freigabe=digitalRead(oeffnungsvorgang)==HIGH;

Das Verfahren verwende ich gerne, auch wenn ich hier eher dieses verwenden würde.
freigabe=digitalRead(oeffnungsvorgang);
Der Vergleich ist eher redundant.

freigabe = if (digitalRead(oeffnungsvorgang));

Das geht gar nicht.
Wenn man ein if in einer Zuweisung unterbringen will, muss man schon was mehr tut....

const byte oeffnungsvorgang {2};
int freigabe = ({   // geht nur in Funktionen/Methoden
                  int dies = 0; 
                  if (digitalRead(oeffnungsvorgang)) dies = 42;
                    else dies = 4711;  
                  dies;  
               });

Hallo,

ja okay, das mit dem if war geistige Umnachtung. Sorry. Das sollte eine klassische if Abfrage werden.
Ich dachte da eher an sowas was der TO bestimmt machen wollte, ausführlich geschrieben.

bool freigabe;
...
...
if (digitalRead(oeffnungsvorgang))
{
   freigabe = true;
}
else
{
   freigabe= false;
}

Warum dann nicht gleich

freigabe = digitalRead(oeffnungsvorgang);

BTW hat noch jemand festgestellt, wie beknackt sich diese neuen Code Tags verhalten? Änderungen sind mit Cut&Paste kaum noch möglich, auch mit Text markieren und verschieben bekomme ich jedesmal ein neues Code-Feld erzeugt, oder das Ziel wird vorher gelöscht :frowning:

Hallo,

es ist mir einfach nur noch peinlich was ich mit dem if geschrieben habe. War heute nicht mein Tag.
Ihr habt völlig recht mit eurem Syntax ohne if. Ich schreibs ja eigentlich auch nicht anders. Der Tag ist abgehakt.

Code Tags. Code editieren nach Preview drücken funktioniert bei mir auch schon länger nicht richtig. Ich schreibe bei längeren Texten alles im Editor inkl. Tags und kopiere dann alles.

es ist mir einfach nur noch peinlich was ich mit dem if geschrieben habe.

Lass es gut sein!
Du hast Mist gebaut, es sofort eingesehen, und stehst dazu, öffentlich!
Das bringt so manch ein anderer nicht zustande.
Dazu ist schon ein gewisses Maß an mentaler Stärke notwendig.

Bitte falsch verstehen:
Die Schamesröte gönne ich dir.
Gleichzeitig bewundere ich dich für diese Einsichtsfähigkeit.
Wenn ich es besser könnte, würde ich dich Loben, so bleibt mir nur die Bewunderung.

Hallo,

keine Sorge, ist angekommen. Danke. :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.