Zeitschalter in Relaisschaltung

Hallo,

ich habe mir aus Arduino-Foren-Sketches etwas zusammengebastelt und bin nun am Ende mit meinem Anfängerlatein.

Folgendes ist bereits realisiert:

Ein IR-Sensor gibt bei "LOW" Signal und ein Zähler zählt jeweils bis 30. Zwischen 1 und 10 schaltet Relais 1 auf "HIGH", zwichen 11 und 20 Relais 2 auf "HIGH" und zwichen 21 und 30 schaltet Relais 3 auf "HIGH".

Problem ungelöst:

Circa 5 Minuten nachdem der Sensor das Signal "LOW" ausgegeben hat, bzw. ein Zähler nach oben gezählt wurde, sollen alle 3 Relais auf "HIGH" schalten.
Dies sollte sich doch über den Zähler realisieren lassen, ich habe aber überhaupt keine Idee wie ich das umsetzen kann.

An dieser Stelle bitte ich deshalb um Hilfe.

int SensorPin = 12;             // Eingang IR-Sensor
int SensorState = 1;            // Sensorstatus
int counter = 1;                // Zähler
int SensorStateHIGH = 1;

int Relais5V = 11;              // Variable mit Pin 11 deklarieren + initialisieren
int relais1 =   2;              // Variable mit Pin 12 deklarieren + initialisieren
int relais1State = HIGH;
int relais2 =   8;              // Variable mit Pin  8 deklarieren + initialisieren
int relais3 =   7;              // Variable mit Pin  7 deklarieren + initialisieren

int relais4 =  4;               // für millis Zählschleife (Pin 4 = relais4)
int relais4State = LOW;
long myTimer = 0;
long myTimeout = 2000;



void setup() {
 Serial.begin(9600);
 pinMode(SensorPin, INPUT);   
 pinMode(Relais5V, OUTPUT);     // setzt 5V als Ausgang fest
 digitalWrite(Relais5V, HIGH);  // schaltet 5V+ auf Ausgang 11
 pinMode(relais1, OUTPUT);      // Digitaler Pin 12 als Ausgang
 pinMode(relais2, OUTPUT);      // Digitaler Pin  8 als Ausgang
 pinMode(relais3, OUTPUT);      // Digitaler Pin  7 als Ausgang
  
 pinMode(relais4, OUTPUT);      // millis
}

void loop(){
 SensorState = digitalRead(SensorPin);
 if (SensorState == LOW)
 {    
   SensorStateHIGH = 1;
 }
 if (SensorState == HIGH && SensorStateHIGH == 1)
 {
   counter++;
   SensorStateHIGH = 0;
   
   }
 Serial.println(counter);
 
 
 {
 if (counter <=0 || counter >10)
      digitalWrite(relais1, HIGH);
    
  if (counter <=10 || counter >=30)
    digitalWrite(relais1, LOW);
    
  if (counter <=10 || counter >20)
      digitalWrite(relais2, HIGH);
    
  if (counter <=0 || counter >10 && counter <=20 || counter >30)
    digitalWrite(relais2, LOW);
    
  if (counter <=20 || counter >30)
      digitalWrite(relais3, HIGH);
    
  if (counter <=0 || counter >20)
    digitalWrite(relais3, LOW);
    
  if (counter == 30)(counter = 1);
  }
  
  {
  if (millis() > myTimeout + myTimer ) {               // millis
    myTimer = millis();

    if (relais4State == LOW) relais4State = HIGH;
    else relais4State = LOW;

    digitalWrite(relais4, relais4State);
  }
  
 
  }
  
  
}

Hi

Bitte für Code Code-Tags nutzen - Du hast hier QUOTE-Tags (Zitat) benutzt.
Im Code-Tag kann man den Kram scrollen, kopieren und es werden keine Smilies produziert (ok, kam hier nicht vor)

Wenn ich Dich richtig verstehe, soll

  • Relais 1 von 0...10 und AB Minute 5 AN sein
  • Relais 2 von 10...20 und AB Minute 5 AN sein
  • Relais 3 von 20...30 und AB Minute 5 AN sein

... dann programmiere Das doch so :slight_smile:
Du schaltest jetzt in JEDEM loop()-Durchlauf das Relais 1 AN, wenn wir im Bereich 0...10 sind und IMMER AUS, wenn wir oberhalb sind - blöd, die 5 Minuten werden ebenfalls oberhalb sein.
Auch ist das dauernde Geschalte unschön (dem Pin ist's egal, ob Der auf 1 soll, wenn Er bereits auf 1 ist - Da ist kein Problem).

Dann ist Deine millis-Abfrage falsch.
Millis IMMER mit
millis()-startzeit>=wartezeit
abfragen - wenn der Arduino Mal länger als 49,x Tage durchläuft, fällt Dir Dein Konstrukt auf die Füße.

Du möchtest pro Relais und Zustand Dessen entscheiden, ob Was zum Umschalten da ist.
Wenn Relais AUS und wir sind in einer Einschalt-Zeit->Relais einschalten (und merken, daß wir AN sind).
Wenn das Relais AN ist prüfen, ob wir uns in einer AUS-Zeit befinden (oder einer NICHT-EIN-Zeit - kann also der Else-Zweig sein) - dann AUS schalten und diesen Zustand merken.

MfG