Schrittmotor mit LDR und 2 Magnetkontakten steuern

Hallo zusammen,

ich bin ein Anfänger der seit ein paar Wochen mit Arduino experimentiert.

Im Moment bin ich gerade dabei zu versuchen, dass mein Vorhang am Fenster wenn es hell wird automatisch aufgeht und wenn es dunkel wird wieder von alleine zu geht.

Ich Habe mir das so vorgestellt dass ich links und rechts einen Reedkontakt montiere und am Vorhang selber einen Magneten.

Zur Erkennung ob es hell oder dunkel ist habe ich einen LDR geplant.

Zum öffnen und schließen des Vorhangs würde ich einen Schrittmotor 28BYJ-48 und ein Motorschild mit einem ULN2003 nehmen.

Nun Soll der Arduino Uno prüfen ob es Tag oder Nacht ist, soll dann entscheiden ob der Vorhang geöffnet oder geschlossen werden soll und wenn der Vorhang an der Endposition ist, den Motor abschalten und warten bis sich der Status (Tag oder Nacht) ändert und dann wieder den Vorhang öffnen bzw schließen.

Im Moment bin ich soweit dass der Motor die Richtung wechselt jenachdem wie Hell es ist und wenn der Magnetkontakt geschlossen wird anhält.

Nun komme ich aber nicht weiter, da ich nicht weiß wie ich dem Arduino sagen soll dass er wenn es dunkel wird, wieder den Motor anzuschalten um den Vorhang zu schließen.

Ich Hoffe ihr könnt mir Helfen.

Hier mal mein momentaner Code:

#include <Stepper.h>

const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution, 8,10,9,11);      
int sensor = A5;
int magnet1 = 2;
int magnet2 = 3;
int magnetstatus1 = 0;
int magnetstatus2 = 0;

void setup() {
  myStepper.setSpeed(10);
  Serial.begin(9600);
  pinMode (magnet1, INPUT);
  pinMode (magnet2, INPUT);
}

void loop() {  
 int sensorValue = analogRead(sensor) ;
  Serial.println(sensorValue);
  magnetstatus1 = digitalRead(magnet1);
 if (magnetstatus1 == HIGH){
   Serial.println("magnet1 an");
 if (magnetstatus2 == LOW)
  Serial.println("magnet2 an"); 
 delay (500);}
 
 else {
   Serial.println ("magnet1 aus");
 if (sensorValue < 300) {   
   Serial.println("im Uhrzeigersinn");
  myStepper.step(stepsPerRevolution);  
  }
 else {    
  Serial.println("gegen den Uhrzeigersinn");
  myStepper.step(-stepsPerRevolution);    
    } 
  }
}

Du kannst dir den Zustand merken in dem du bist. Für hell/dunkel reicht da ein bool.

Pseudocode:

boolean hell = false;

if(hell == true)
{
      if (sensorValue < 300)
      {
             hell = false;
      }
}
else   //dunkel
{
        if (sensorValue > x)
        {
             hell = true;
        }
}

Dann hast du zwei Pfade für hell und dunkel und kannst da unterschiedliche Sachen machen

Ich würde 4 verschiedene Modi definieren zB Variable MODI:
0: Vorhang offen
1: Vorhang schließt
2: Vorhang geschlossen
3: Vorhang öffnet.
dazu den Wert ob Hell oder Dunkel vom LDR und von den Sensoren Vorhang offen oder geschlossen.

wenn "Vorhang offen"(modi 0) und LDR dunkel und Sensor Vorhang offen dann MODI= 1

MODI=1 Der Motor dreht bis der Endschalter erreicht ist dann wird MODI=2.
ecc

Grüße Uwe

Dafür dann aber enums verwenden und keine byte/int Variablen:

enum states { OFFEN, ZU, GEHT_AUF, GEHT_ZU };
states currentState = OFFEN;

if(currentState == OFFEN)
{
     if(...)
         currentState = GEHT_ZU;
}
...

Hallo,
Vielen Dank für eure Hilfe, diese Jahr werde ich wohl leider nicht mehr dazukommen das Projekt weiter zu verfolgen.
Anfang Januar setzte ich mich dann wieder dran wenns bei der Arbeit wieder ruhiger wird.

Ich halte euch dann gerne auf dem Laufenden.
Vielen Dank nochmal.

Gruß Adrian