Mein problem mit einer Nebelmaschine

Guten Abend miteinander,

ich bin Neuling und brauche eure Hilfe. Ich möchte versuchen bei einem einmaligen digitalWrite(ENABLE, HIGH) einmal etwas auszuführen aber währenddessen weitere Eingaben/digitalWrite(ENABLE, HIGH) zeittechnisch z. B. für 15 sek. "zu blockieren."

Diesen Sketch möchte ich später anderweitig anwenden, sodass bei einem Lichteinfall auf digitalRead(0), ein HIGH an einer Nebelmaschine abgegeben wird(statt wie unten im Sketch an einen DC Motor).
Damit die Nebelmaschine nicht direkt bei weiterem Lichteinfall auslöst, möchte ich hier eine Pause von digitalWrite(Enable, High) einlegen. Sobald ich ein delay(15000) hinter dem digitalWrite(ENABLE, HIGH) hinzufüge, führt es diesen nur für den Delay HIGH aus statt diesen zu blockieren.

Diese Funktion habe ich bisher leider nicht googeln können, eventuell habe ich falsch gesucht, dann schon einmal ein sorry von mir. Im unteren findet ihr meinen Sketch eventuell wird es so ersichtlicher.

int licht;
#define ENABLE 5
#define DIRA 3
#define DIRB 4

void setup() {

   Serial.begin(9600);
   pinMode(13, OUTPUT);
   
   pinMode(ENABLE,OUTPUT);
   pinMode(DIRA,OUTPUT);
   pinMode(DIRB,OUTPUT);

}

void loop() {
  licht = analogRead(0);
  Serial.println(licht);

  if (licht < 700) {
    digitalWrite(ENABLE, HIGH); 
    delay(1000);
    digitalWrite(DIRA,HIGH); //one way
    digitalWrite(DIRB,LOW);
    
  }
  
  else {
    digitalWrite(ENABLE ,LOW);

  }
}

Ich habs 3 mal gelesen und 3 mal nicht verstanden. Versuchs mal so zu erklären, dass auch ich es verstehe.

Ein sinnvoller deutscher Titel wäre außerdem sinnvoll.

Gruß Tommy

Du musst nur wissen wie oft die Nebelmaschine angesteuert werden soll, bzw wie lange die Pause dazwischen sein soll. Dann nimmst du dir das "blink without delay" Beispiel und versuchst es zu verstehen.
Die blinkende LED ist deine Nebelmaschine, deren Blinkgeschwindigkeit musst du dementsprechend anpassen. Als Bedingung zum Setzen des Ausgangs nimmst du noch deinen Lichtsensor dazu.
So kannst du auch noch andere Dinge erledigen lassen ohne das dein Programm blockiert wird

Danke für die prompten Antworten. Den Titel habe ich aus dem "How to use this forum - please read" als Vorgabe übernommen.

Um auf mein Vorhaben nochmal zurück zukommen. Wir sind Betreiber einer Indoor Minigolf Anlage. In einem Themenraum gibt es eine Bahn welche als Hindernis einen Vulkan beinhaltet. Wenn bei der Bahn eingelocht wird möchte ich den Vulkan per Nebelmaschine einmal "zum ausbrechen" bringen. Dafür wollte ich einen Fotowiderstand für den Lichteinfall benutzen sobald es durch den eingelochten Ball dunkel wird. Damit es nicht die ganze Zeit die Nebelmaschine anschmeißt wollte ich eine Pause zwischen den Nebelstößen einlegen um die Kosten der Nebelmaschine gering zu halten.

Achso, das ist dann doch etwas anders als ich dachte.

Den Ablauf würde ich so ungefähr machen:

Ball erkennen -> Zeit ablaufen lassen -> ist der Ball immer noch da? -> Nebelmaschine starten -> Zeit ablaufen lassen -> Nebelmaschine ausschalten

Durch das zweimalige einlesen des Eingangs mit Zeit dazwischen kann man Fehlalarme etwas eindämmen, zum Beispiel wenn jemand den Schläger übers Loch zieht oder der Ball drüber weg läuft

Es ergibt soweit alles sinn, Scherheinz. Wie könnte ich das mit dem Code dann wie beschrieben umsetzen? Bräuchte einen Denkanstoß. Wäre sehr lieb, wenn du mir dabei weiterhelfen könntest, zerbreche mir nämlich dabei schon seit geraumer Zeit den Kopf

Was bedeutet denn:

#define DIRA 3
#define DIRB 4

Das hab ich von einem sketch übernommen, welcher für einen DC Motor bestimmt war. Das sollte die Drehrichtung des Motors bestimmen. Das würde ich dann rausnehmen, weil das mit dem Vorhaben gar nichts zutun hat.

Für die Nebelmaschine würde ich dann einen neuen Sketch schreiben um es dort zu verwenden. Derzeit hab ich als OUTPUT statt einer Nebelmaschine einen DC Motor verwendet, bis die Nebelmaschine eintrifft. Hätte hierfür auch eine LED zum tüfteln benutzen können. Hat also keine weitere Bedeutung.

newcomer1:
Danke für die prompten Antworten. Den Titel habe ich aus dem "How to use this forum - please read" als Vorgabe übernommen.
.....

Das ist doch keine Vorgabe, sondern nur ein Beispiel.
Zumal wir uns hier im deutschen Forumsteil befinden.
Und ein aussagekräftiger Titel, der dein Problem kurz beschreibt, ist immer besser.

Das kannst du auch noch nachträglich ändern.

newcomer1:
Den Titel habe ich aus dem "How to use this forum - please read" als Vorgabe übernommen.

HotSystems:
Das ist doch keine Vorgabe, sondern nur ein Beispiel.

Und es stand auch ausdrücklich unter den Beispielen, wie man es nicht machen soll

Soweit ich erkennen kann, habe ich den Titel abgeändert. Dann dürfte ja das Problem beseitigt sein. Ich bräuchte immer noch eure Hilfe :slight_smile:

newcomer1:
Ich bräuchte immer noch eure Hilfe :slight_smile:

Du möchtest einen einfachen endlichen Automaten bauen.
Inklusive einer Zeitabhandlung.

Schaue dir die "Nachtwächter Erklärung" hier im Form an

Hallo,

ist ja fast noch Weihnachten, also hier mein Q&D Ansatz :wink:

ich gehe mal davon aus das Du letzlich mit einem Relais schalten willst, macht jedenfalls Sinn. Musst halt die Zeiten und den Relais Ausgang anpassen. Habs kurz getestet sollte für Deinen Anwendungsfall erst mal so reichen.

mfg
Heinz

/* LDR mit Widerstand als als Spannungsteiler aufgebaut
    Hardware UNO
*/

byte ldr = 0;// Eingang zum lesen des LDR
byte relais = 13;// Ausgang Nebelmaschine

int LDRwert;    // Messwert LDR Sensor
bool nebel_on;  // status Ausgang

unsigned long startwarte;
unsigned long wartezeit = 2000UL;
unsigned long nebelzeit = 5000UL;

void setup() {
  pinMode (relais, OUTPUT);
  //Serial.begin(9600);
}

void loop() {
  LDRwert = analogRead(ldr);// relais wert lesen
  //Serial.println (LDRwert);

  if (LDRwert > 700) {  // wenn dunke erkannt wird
    // wenn wartezeit abgelaufen
    if (millis() - startwarte > wartezeit) {
      nebel_on = true;
    }
  }
  else { // sonst aus und reset wartezeit
    nebel_on = false;
    startwarte = millis();
  }
  // wenn nebelzeit abgelaufen
  if ( millis() - startwarte > nebelzeit + wartezeit) {
    nebel_on = false;
  }
  digitalWrite(relais, nebel_on); // Ausgang schreiben

}