Relais zeitverzögert ansteuern

Hallo zusammen,

ich bin neu bei Euch in der Arduino Welt und stoße im Augenblick auf folgendes Problem:

Ein Relais soll per Zufallszahl ein- und wieder ausgeschaltet werden. Es werden also Zahlen zwischen 1-10 ausgegeben und bei kleiner als 2 wird eingeschaltet und bei größer als 8 eingeschaltet.
Das funktioniert auch alles, soweit so gut.

ABER. Sobald der Einschaltbefehlt kommt soll folgendes passieren:

  • eine LED soll ohne Verzögerung eingeschaltet werden
  • das Relais soll erst nach 2 Sekunden eingeschaltet werden
  • das Programm soll indessen weiter laufen

Mit delay habe ich leider keinen Erfolg in meinem kleinen Programm da dieses nur die Ausgabe der Zufallszahl verlangsamt.

Vielleicht könnt ihr mir behilflich sein.

Das Programm:

long randNumber;
int Relais1 = 6;

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));
  pinMode(Relais1, OUTPUT);
  
}

void loop() {
  randNumber = random(10);
  Serial.println(randNumber);
  delay (500);

 
  
    if (randNumber >8)
   digitalWrite(Relais1, HIGH);
      
   if (randNumber <2)
   digitalWrite (Relais1, LOW);


}

typische Schrittkette.

Bitte geh mal in Deinen ersten Post - unten mit dem Bleistift - markiere den Code und klick dann auf das </> Symbol. Speichern und fertig.

Hallo,

wie gesagt ich bin komplett neu in dieser Welt und bin froh das es schon so läuft.

Brauche also etwas Hilfe :wink:

Ich hab mal was gebaut - probier mal, ob das geht.

unsigned long randNumber;
const byte relaisPin = 6;
const byte ledPin = LED_BUILTIN;
byte schritt;
unsigned long lastmillis;

void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));
  pinMode(relaisPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  randNumber = random(11); // die letze ausgebbare Ziffer ist 10
  switch (schritt)
  {
    case 0:
      Serial.println(randNumber);
      if (randNumber > 8)
      {
        digitalWrite(ledPin, HIGH);
        lastmillis = millis();
        schritt++;
      }
      break;
    case 1:
      if (millis() - lastmillis >= 2000)
      {
        digitalWrite(relaisPin, HIGH);
        schritt++;
      }
      break;
    case 2:
      Serial.println(randNumber);
      if (randNumber < 2)
      {
        digitalWrite(relaisPin, LOW);
        digitalWrite(ledPin, LOW);
        schritt = 0;
      }
      break;
    default:
      schritt = 0;
      break;
  }
}

leider schaltet das Relais nicht mehr. Ist hier evtl. der Schaltimpuls zu kurz? Wie gesagt ich habe leider keine Ahnung :frowning:

Dann sind jetzt mal 5Sekunden Pause drin.
Aber mal ne Frage: Schaltet das Relais wirklich bei HIGH? Die mir bekannten Relaisboards schalten bei LOW.
Wenn das Relais jetzt nicht 5 Sekunden an bleibt, tausche in case 1: und case 2: für das relais das HIGH gegen LOW.

unsigned long randNumber;
const byte relaisPin = 6;
const byte ledPin = LED_BUILTIN;
byte schritt;
unsigned long lastmillis;

void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));
  pinMode(relaisPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  randNumber = random(11); // die letze ausgebbare Ziffer ist 10
  switch (schritt)
  {
    case 0:
      Serial.println(randNumber);
      if (randNumber > 8)
      {
        digitalWrite(ledPin, HIGH);
        lastmillis = millis();
        schritt++;
      }
      break;
    case 1:
      if (millis() - lastmillis >= 2000)
      {
        digitalWrite(relaisPin, HIGH);
        lastmillis = millis();
        schritt++;
      }
      break;
    case 2:
      Serial.println(randNumber);
      if (millis() - lastmillis > 5000)
      {
        if (randNumber < 2)
        {
          digitalWrite(relaisPin, LOW);
          digitalWrite(ledPin, LOW);
          schritt = 0;
        }
      }
      break;
    default:
      schritt = 0;
      break;
  }
}

jetzt schaltet es quasi nur hin und her und die Zufallszahlen werden nicht beachtet

:weary:

Ach man. Alles etwas kompliziert :smiley:

Doch doch, die werden schon beachtet.
Wenn > 8: led an, 2 sekunden später relais an, nach weiteren 5 sekunden wird begonnen zu prüfen und wenn <2 geht alles aus. und es beginnt von vorn.

Beschreib doch mal was Du vor hast.

Es soll quasi ein Reaktionstest sein:

Wenn nach einer zufälligen Zahl das Relais einschaltet soll ein Knopf gedrückt werden müssen. Um dieses aber vorab kenntlich zu machen das es jetzt gleich passiert soll eben 2 Sekunden davor die LED leuchten.
Sobald das Relais abgeschaltet wird soll eine andere LED Leuchten um zu zeigen das der Knopf gleich losgelassen werden kann.

also:

LED1 2 Sekunden an --> dann Relais an
LED2 2 Sekunden an --> dann Relais aus

LED2 bleibt so lange an bis die Routine mit LED1 wieder von vorne startet.

Dieses soll aber zufällig geschehen

unsigned long randNumber;
const byte relaisPin = 6;
const byte startLedPin = LED_BUILTIN;
const byte stopLedPin = 2;
byte schritt;
unsigned long lastmillis;

void setup()
{
  Serial.begin(9600);
  randomSeed(analogRead(0));
  pinMode(relaisPin, OUTPUT);
  pinMode(startLedPin, OUTPUT);
  pinMode(stopLedPin, OUTPUT);
}

void loop()
{
  switch (schritt)
  {
    case 0:                      // Spielstart
      randNumber = random(11);   // die letze ausgebbare Ziffer ist 10
      Serial.println(randNumber);
      lastmillis = millis();     // Zeit merken
      schritt++;
      break;
    case 1:                      // LED 1 startet zufällig 1 Sekunde x randNumber
      if (millis() - lastmillis > 1000UL * randNumber) // Wartezeit abgelaufen?
      {
        digitalWrite(stopLedPin, LOW);
        digitalWrite(startLedPin, HIGH);
        lastmillis = millis();
        schritt++;
      }
      break;
    case 2:                      // Relaisstart
      if (millis() - lastmillis >= 2000) // Wenn Zeit abgelaufen
      {
        digitalWrite(relaisPin, HIGH);
        lastmillis = millis();
        schritt++;
      }
      break;
    case 3:                      // LED 2 start
      if (millis() - lastmillis >= 2000) // Wenn Zeit abgelaufen
      {
        digitalWrite(stopLedPin, HIGH);
        lastmillis = millis();
        schritt++;
      }
      break;
    case 4:                      // Relais stop
      if (millis() - lastmillis > 2000)
      {
        digitalWrite(relaisPin, LOW);
        schritt = 0;
      }
      break;
    default:
      schritt = 0;
      break;
  }
}

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