Fotowiderstand und Stepper Motor

Hallo Leute, ich hoffe ihr könnt mir helfen. Bin echt am verzweifeln. Also mein Plan ist folgender:
Ich möchte mit einen Stepper Motor meine Lamellen an meiner Jalousie steuern mithilfe eines Fotowiderstands (bei Hell auf und bei Dunkel zu). Mein problem ist das wenn der gemessene Wert überschritten wird der Motor nur EINMAL die Umdrehungen machen soll die ich eingetragen habe. Nur das tut er nicht. In der IF Schleife dreht er sich dann permanent wenn der Sensorwert überschritten wird. Ich hoffe ihr könnt mir helfen was für eine befehl ich brauche damit er die Aktion nur einmal ausführt. Vielen Dank vorab.

Leider können wir ohne den Code zu sehen, nur raten.
Also bitte den Code hier einstellen. Bitte Code-Tags (</> ) verwenden.

Tut mir leid bin neu hier^^
Hier mein Code:

#include <Stepper.h>

int SPMU = 32;

Stepper myStepper(SPMU, 2,3,4,5);

int eingang= A0;

int sensorWert = 0;

void setup()
{
myStepper.setSpeed(500);

Serial.begin(9600);
}

void loop(){

sensorWert =analogRead(eingang);

Serial.print("Sensowert = ");

Serial.println(sensorWert);

if (sensorWert > 300 )
{
myStepper.step(2048);
}
else
{
myStepper.step(-2048);
}
delay (500);
}

Man braucht einen Zustandsautomaten. Was ich aber gerade gemerkt habe ist dass man hier auf die Zustandsänderung abfragen muss. Also die Aktion nur dann ausführen wenn sich der Zustand von hell -> dunkel und von dunkel -> hell ändert. Und nicht immer während des Zustands.

Also einmal den vorherigen Zustand (hell oder dunkel) abspeichern und dann mit dem aktuell Zustand vergleichen.

Warum's bei Dir nicht funktioniert, läßt sich ohne Blick in Deinen Code nicht sagen.

Anpacken würde ich die Aufgabe so, daß zwei Variablen den Zustand der Steuerung repräsentieren - die Lichtstärke, auf die aktuell eingestellt wurde - wieviele Schritte der Stepper dafür noch machen muß

Dann in loop() sowas wie:

  if (Steps!=0) ... //Stepper bewegen
  else if (LichtNeu != LichtAlt) Steps=... //Anzahl Schritte berechnen

Ich habe es auch schon mit Switch veswrucht aber es geht dann nur mit einem festen Wert. aber genau diesen zu treffen ist nicht so leicht. und das weitere proble ist ja er soll wenn der Weert überschritten wird nach rechts drehen und wenn der wert unterschritten ist nach links drehen aber die Aktion halt nur einmal ausführen und nicht permanent drehen lassen. Vielen Dank

Die Lösung wurde schon genannt!

Ein endlicher Automat Eine Zustandsmaschine

Ganz klein, ganz zart, nix kompliziertes .....

Und wie sieht das Programm dafür aus? habe noch nicht soviel erfahrung in der Programmierung. Vielen Dank

Wenn Steps>0 rechts drehen, wenn Steps<0 links drehen, wenn Steps==0 nichts mehr zu tun.

Du musst nur abspeichern ob es hell oder dunkel ist. Wobei man da eine Hysterese einbauen muss

Nimm das eher als Anregung. Es ist nicht vollständig!

const int sensorInput = A0;

enum states { HELL, DUNKEL };
int oldState;

void setup()
{
   oldState = getCurrentState();     //Ausgangszustand bestimmen

   //dieser Teil muss für korrekte Funktion angepasst werden. So geht es nicht richtig
}

void loop()
{
    int currentState = getCurrentState();   //aktuellen Zustand bestimmen

    if(oldState == HELL && currentState == DUNKEL)
    {
    } 
    else if(oldState == DUNKEL && currentState == HELL)
    {
    }
}

int getCurrentState()
{
   int sensor = analogRead(sensorInput);

   if(sensor < ...)       //untere Schwelle
      return DUNKEL;
   else if(sensor > ...)   //obere Schwelle
      return HELL;
   else 
      return oldState;
}

Das Problem mit dem Anfangszustand existiert noch

also der befehl für den stepper um ihn zu bewegen is "myStepper.step(2048);" wobei die 2048 eine ganze umdrehung entspricht. und wie soll ich das jetzt schreiben sowie du das beschrieben hast? Vielen Dank

markus200692: Und wie sieht das Programm dafür aus? habe noch nicht soviel erfahrung in der Programmierung. Vielen Dank

Bei oberflächlicher Betrachtung komme ich auf 4 mögliche Zustände:

  1. ISTAUF
  2. FAHREZU
  3. ISTZU
  4. FAHREAUF

Im Zustand ISTAUF wartest du auf einen niedrigen Lichteinfall Wenn niedrig, dann wechsle zu Zustand FAHREZU

Im Zustand FAHREZU wartest du bis das zufahren abgeschlossen ist Wenn fertig, dann wechsle zu Zustand ISTZU

Im Zustand ISTZU wartest du auf einen hohen Lichteinfall Wenn hoch, dann wechsle zu Zustand FAHREAUF

Im Zustand FAHREAUF wartest du bis das auffahren abgeschlossen ist Wenn fertig, dann wechsle zu Zustand ISTAUF

Meine Idee oben geht doch nicht so ganz :/

1.) Es muss am Anfang erst mal eine Zustandsänderung statt finden damit überhaupt etwas passiert 2.) Wenn der Anfangszustand NORMAL ist passiert gar nichts. Besser nur HELL/DUNKEL nehmen und eine Hysterese einbauen.

combie: Bei oberflächlicher Betrachtung komme ich auf 4 mögliche Zustände:

  1. ISTAUF
  2. FAHREZU
  3. ISTZU
  4. FAHREAUF

Im Zustand ISTAUF wartest du auf einen niedrigen Lichteinfall Wenn niedrig, dann wechsle zu Zustand FAHREZU

Im Zustand FAHREZU wartest du bis das zufahren abgeschlossen ist Wenn fertig, dann wechsle zu Zustand ISTZU

Im Zustand ISTZU wartest du auf einen hohen Lichteinfall Wenn hoch, dann wechsle zu Zustand FAHREAUF

Im Zustand FAHREAUF wartest du bis das auffahren abgeschlossen ist Wenn fertig, dann wechsle zu Zustand ISTAUF

Ok das habe ich soweit verstanden. Aber wie sieht ungefähr das programm dafür aus? bzw. wie schreibe ich die zustände im programm? Vielen vielen dank

Serenifly: Meine Idee oben geht doch nicht so ganz :/

1.) Es muss am Anfang erst mal eine Zustandsänderung statt finden damit überhaupt etwas passiert 2.) Wenn der Anfangszustand NORMAL ist passiert gar nichts. Besser nur HELL/DUNKEL nehmen und eine Hysterese einbauen.

Was ist denn eine Hysterese? Sorry für die dumme frage^^

Was ist denn eine Hysterese?

Der mindest Abstand zwischen hell und dunkel

https://de.wikipedia.org/wiki/Hysterese#Zweipunktregler

Ein Bereich in dem sich der Zustand nicht ändert. Wenn du einfach nur eine Schwelle hast oder zwei Schwellen die zu nahe zusammen liegen, zappelt dein Ausgang an der Stelle

Das ganze ist aber ohne Endschalter sowieso sehr problematisch. Da man glaube ich am Anfang mal die Position der Jalousie kennen sollte. Dann könnte man auch einfach sagen: Wenn es beim Einschalten hell ist mache erst mal auf. Wenn schon auf ist mache nichts. Danach geht auch die reguläre Regelung entsprechend.

markus200692: Was ist denn eine Hysterese? Sorry für die dumme frage^^

Etwa: Beharrung.

Der Zustand (Ausgang...) ändert sich nur, wenn entweder der obere Schwellwert überschritten wird, oder der untere unterschritten wird. Bei Werten zwischen unterem und oberem Schwellwert ändert sich nichts, der vorherige Zustand (ein/aus, hell/dunkel...) bleibt unverändert.

Alle Arduino Eingänge haben eine eingebaute Hysterese, werden HIGH wenn 0,7*Vcc überschritten wird, und werden LOW wenn 0,3*Vcc unterschritten wird.

Alle Arduino Eingänge haben eine eingebaute Hysterese, werden HIGH wenn 0,7*Vcc überschritten wird, und werden LOW wenn 0,3*Vcc unterschritten wird.

Im Grunde ja, aber hier wird der LDR vermutlich analog ausgelesen. Zumindest würde ich das empfehlen.

Es geht hier übrigens nicht darum eine komplette Jalousie hoch und runter zu fahren, sondern darum die Lamellen zu drehen. Sowie ich das verstanden habe.

Das könnte man vielleicht wirklich über eine feste Schrittanzahl machen. Aber man bräuchte einen Endschalter um die Anfangsposition beim Einschalten der Steuerung zu bestimmen.