Stepper.h

Hallo,
wir haben ein Problem bei unserem Projekt mit dem Stepper.h Motor. Unser Ziel ist es, dass der Motor eine halbe Drehung macht, sobald ein Tropfensensor Feuchtigkeit war nimmt. (Praktisch: sobald es anfängt zu regnen, soll sich ein Fenster schließen). Das ist uns auch gelungen, allerdings dreht sich der Motor einmal, dann macht er eine kurze Pause un dreht sich weiter, hält wieder an usw.. Wir wollen aber dass er nur einmal eine halbe Drehung macht. Wir können diese Anweisung nicht ins void-setup schreiben, da wenn der Tropfensensor einmal keine Feuchtigkeit wahrnimmt, er nicht mehr wiederholt misst und es ja sein könnte, dass es später noch "regnet". Wir würden uns über Hilfe und eine schnelle Rückmeldung freuen,
anbei unser Code:

#include <Stepper.h>
int SPU = 2048;
Stepper Motor(SPU, 3,5,4,6);
int messwert=0;

void setup()

{

Motor.setSpeed(5);
Serial.begin(9600);

}

void loop()

{

messwert=analogRead(A0);

Serial.print("Feuchtigkeits-Messwert:");

Serial.println(messwert);

if(messwert==0){}

else {
Motor.step(1024);

}

}

sobald es anfängt zu regnen, soll sich ein Fenster schließen

  • Ihr stellt nicht fest, ob es anfängt zu regnen, sondern ob es regnet (zumindest versucht ihr das).
  • Ihr stellt nicht fest, ob das Fenster schon zu ist. Noch nicht mal, ob der Arduino es bereits geschlossen hat.

Übrigens:
Dass das Fenster jemals wieder aufgeht, ist nicht vorgesehen. Das ist vielleicht auch gut so, sonst würde es noch erheblich komplizierter.

Ihr stellt nicht fest ob es regnet sondern ob der Sensor naß ist.

Hi

Wie würdest Du Das Zuhause lösen?

  • Gucken, ob's regnet
    -- JA - gucken, ob Fenster AUF ist
    --- JA - Fenster ZU (und merken)

Das kann man prima in mehrere Status runterbrechen - Die kann man dann auch erweitern, falls man Mal - warum auch immer - das Fenster wieder auf bekommen will :slight_smile:

Status 0: Fenster ist AUF, wenn Regensensor meldet, Wechsel nach Status 1
Status 1: Fenster ZU fahren, wenn ZU Wechsel auf Status 2
Status 2: Fenster ist ZU, wenn Regensensor NICHT meldet, Wechsel nach Status 3
Status 3: Uhrzeit merken, Wechsel zu Status 4
Status 4: wenn Regensensor meldet, Wechsel zu Status 2, sonst prüfen, wenn Wartezeit vorbei Wechsel nach Status 5
Status 5: Fenster AUF fahren, wenn AUF, Wechsel auf Status 0

Da die Stepper-Lib blockiert, ist das 'wenn Fenster AUF/ZU' hinfällig, da die Methode eh erst fertig ist, wenn die Schritte abgefahren wurden.

Wenn Du noch weitere Status brauchst - z.B. eine Einlernfahrt bei Spannungswiederkehr, noch wäre Platz dafür :slight_smile:
Mit enum() kann man auch den Status Namen geben, Die intern dann als Zahlen gewertet werden - für Dich aber viel leichter zu Lesen sind.

MfG

Hallo,

Ihr hab einen Denkfehler in Eurer Überlegung.

Ihr fagt ab ob der Sensor nass ist , dann lasst Ihr den Motor drehen, soweit scheint das ja zu klappen. Nun jetzt ist der Sensor also mal nass geworden und das bleibt er ja auch, solange er nicht wieder von selber troknet. Bei eurem Sketch ist es nun ja so das Ihr ständig den Sensor abfragt, da der aber immer noch nass ist fährt der Motor natürlich wieder das gleiche Stück zu, und so geht das immer weiter. Nun was ist zu tun ?. Im ersten Anlauf müsste man sich merken ob das das Fenster schon zu ist ,und dann eben nicht noch mal fahren. michel_x hat es ja schon angedeutet , irgendwann sollte das Fenster ja auch wieder auf gehen.

Also erstellt erst mal einen Ablaufplan etwa so :

sensor einlesen

wenn sensor wert > schatschwelle und Fenster nicht zu
Fenster schliessen
merken fenster ist zu

wenn sensor < schaltschelle - Hyterese und fenster nicht offen
Fenster öffnen
merken fenster ist offen

den Wert für die Schaltschwelle muss man ermitteln fanht mal mit 100 an. Die Hysterese sorgt dafür das um die Schaltschwelle herum der Motor nicht ständig auf und zu fährt.

Heinz

Vielen Dank erstmal für die schnellen Antworten!
Wir sind jedoch erst in unserem zweiten NwT-Lehrjahr, wo wir ja auch nicht immer nur Projekte mit Arduino machen. Daher haben wir noch nie Staten gesetzt und wissen nicht wie das funktioniert. Es wäre sehr nett wenn uns jemand erklären könnte wie man den Status angibt.
LG

Hallo,

postmaster-ino spricht eine Schrittkette, Ablaufsteuerung , endlicher Automat an. Das solltest Ihr schon mal gehört haben. Wenn nicht - Googel kennt das bestimmt.

Status ist nichts besonderes, es handelt sich um eine normale Variable mit dem Inhalt 0-5 . Über if() oder select case verzweigt der Programmablauf dann in den entsprechenden Schritt, macht da was , wechest in den nächsten.

Heinz

Hi

Nebenbei: Status ist ebenfalls die Mehrzahl von Status (klingt zwar blöd, ändert aber Nichts).

Eine jede FSM hat Ihre eigene Status-Variable.
Diese kann man auch aus einer enum-Aufzählung entnehmen - dann 'sieht' man, wie der Status heißt und was wohl darin passieren soll.
(intern werden daraus auch wieder nur Zahlen, Worte sind aber besser zu lesen)

Jede FSM kann immer nur in einem Status sein - aus diesem Status wechselt Sie nach irgend welchen Bedingungen in einen Anderen.
Diese Bedingung kann eine Wartezeit sein, oder ein Sensor-Wert/-Signal, auf Das (ohne zu blockieren) gewartet wird.

Wenn Du mehrere Dinge hast, Die quasi parallel ablaufen sollen, wird Jede zu einer SFM gebaut mit jeweils eigener Status-Variable - diese beiden FSM haben (normal) Nichts miteinander zu tun (mir wäre momentan auch nicht bewusst, was Das auch bringen sollte - egal).
Damit Beide (oder wie viele man zusammen bringt) flüssig laufen, muß JEDER Status in jeder FSM nahezu direkt wieder verlassen werden - also auf gar keinen Fall auf 'egal Was' warten - lange Aktionen aufteilen (ggf. mehrere Status oder spätestens nach 3ms abbrechen und beim nächsten Aufruf genau hier wieder weiter machen).

Alles kein Hexenwerk - trotzdem muß man schon etwas drüber nachdenken, was man in welcher Reihenfolge machen will.

Am Besten auf einem Stück Papier aufschreiben - je kleiner die Einzelschritte, desto wahrscheinlicher ist, daß man Das auch so programmiert bekommt.

MfG