Ausgang soll für 10 Minuten gesetzt bleiben

Hallo Community,

ich habe ein kleines Programm geschrieben. Jedoch möchte ich dies etwas erweitern. Ich möchte, das wenn der Ausgang “OUT” auf High gesetzt wurde, dass der Ausgang für 10 Minuten anbleibt. Unabhängig davon, ob die Spannung unter 3,83V liegt. Danach soll der Loop wieder weiter gehen und er prüft die Spannung erneut. Ich habe daran gedacht mit einem Delay zu arbeiten, jedoch bin ich mir nicht sicher. Bin noch ein Anfänger deswegen kann ich einen Rat von euch Profis gut gebrauchen. Liebe Grüße :slight_smile:

Ich habe an sowas gedacht:

if (voltage < 3.83){
  digitalWrite(OUT, LOW);
  Serial.println("Voltage lower 3,83V");
 }
 else{
  digitalWrite(OUT, HIGH);
  Serial.println("Voltage higher 3,83V");
  delay(600000);
 }

Codeerklärung: Wenn die gemessene Spannung unter 3,83V liegt, soll nichts passieren. Wenn die Spannung jedoch über 3,83V liegt sollte der Ausgang auf High gesetzt werden. Nach 5Sekunden wird erneut geprüft.

Code:

int OUT = 12;

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

void loop() {
 int sensor = analogRead(A0);
 float voltage = sensor * (5 / 1023.00);
 

 if (voltage < 3.83){
  digitalWrite(OUT, LOW);
  Serial.println("Voltage lower 3,83V");
 }
 else{
  digitalWrite(OUT, HIGH);
  Serial.println("Voltage higher 3,83V");
 }

 delay(5000);

}

Ein delay ist hier grundsätzlich falsch, da dein Arduino während der Pause nichts mehr macht, auch ein Messen der Spannung findet nicht mehr statt.
Du musst es mit millis machen und dazu sieh dir mal BlinkWithoutDelay an. Das findest du in den Beispielen der IDE.

du willst eine Statemachine. Vor wenigen Tagen gab es eine ganz ähnliche Anfrage

Die Beiträge #8 und #9 zeigen wie man so was lösen kann.

Ja das macht ja nichts. Er soll einfach den Ausgang 10Minuten geschalten lassen unabhängig von der gemessenen Spannung. Nach den 10 Minuten soll er erneut prüfen ob die gemessene Spannung okay ist, falls ja -> 10 Minuten Ausgang auf ein falls nein -> geht der Loop ohne was zu schalten weiter. Möchte aber noch, das wenn der delay von 5Sekunden beginnt, der Ausgang geschalten bleibt, wenn er denn an war. Jedoch will ich den 5 Sekunden delay am ende nicht entfernen, finde die Pause am Ende sinnvoll weil er sonst die ganze Zeit durchrattert, weiß nicht wie sich das auf den Stromverbrauch auswirkt.

Achso, jetzt hab ich verstanden. Bei dem delay wird GAR NICHTS gemacht. Dann mache ich das mit einem BlinkWithoutDelay. Vielen dank

Sturmfront:
Achso, jetzt hab ich verstanden. Bei dem delay wird GAR NICHTS gemacht. Dann mache ich das mit einem BlinkWithoutDelay. Vielen dank

So ist es.....da wird nur gewartet.

Habe es nun mit Millis probiert. Ist das so richtig?

unsigned long startMillis;
unsigned long currentMillis;
const unsigned long period = 1000;
int OUT = 12;

void setup()
{
  pinMode(OUT, OUTPUT);
  Serial.begin(9600);  
  startMillis = millis();
}

void loop() {
 currentMillis = millis();
 int sensor = analogRead(A0);
 float voltage = sensor * (5 / 1023.00);
 

 if (voltage < 3.83){
  digitalWrite(OUT, LOW);
  Serial.println("Voltage lower 3,83V");
 }
 else{
  high();
 }

void high() {
  if (currentMillis - startMillis >= period)
  {
    digitalWrite(OUT, HIGH);
    Serial.println("Voltage higher 3,83V");
    startMillis = currentMillis;
  }
}

 delay(5000);

}

Verbessert mich bitte falls das falsch ist. Mache das mit millis zum ersten mal, lese mich gerade erst ein. LG

Sturmfront:
Habe es nun mit Millis probiert. Ist das so richtig?

Nicht ganz.

Das "startMillis = millis();" gehört in die Loop.

Alles klar, habe ich verbessert. Und bei "const unsigned long period = 1000;" trage ich statt 1000, 600000 ein um auf die 10 Minuten zu kommen. Stimmt das dann alles so? LG

Wie viele Jahre dauert es noch, bis auch der Letzte verstanden hat, dass in einer Schleife ein "Delay" nichts verloren hat?

Tut mir ja leid. Niemand ist allwissend und viele Leute sind hier neu im Forum und haben erst mit der Sprache angefangen....

Sorry, wollte dir nicht auf die Füße treten.
Ich habe (vor 30 Jahren) auch mal klein angefangen.

Aber bei “delay” bzw in anderen Programmiersprachen “sleep” bleibt das Programm einfach stehen und tut in der angegebenen Zeit gar nichts.
Wenn da gerade Ereignisse von außen auftreten, kümmert sich das laufende Programm einen Sch*** darum.
Also eine Berechnung über millis() oder (wenn von der Hardware unterstützt) Interrupts verwenden !!!

Die Verwendung von Interrupts ist die beste Methode.
Ein Programm arbeitet stur seine Routinen ab, huuuch, da ist ja was an PIN X passiert, Interrupt Funktionen abarbeiten und dann weitermachen wie bisher (bestes Beispiel: Tastendruck oder Mausbewegung am PC).

Happy coding

Schon in Ordnung. Habe gerade erst angefangen und hatte davor nie mit einer Programmiersprache zutun, deswegen wusste ich das noch nicht. Man lernt eben immer dazu. LG

Und dann hast du gleich mit der komplexesten Programmiersprache angefangen.
Respekt !!!
Ist aber auch gut so. In’s kalte Wasser springen und schwimmen lernen.
Einige Java-Programmierer verarschen mich heute noch, was ich mit dem “Uralten C++” will. Ich sei doch so was von der Zeit hinterher
Ohne C++ würde kein Auto fahren, sich kein Windrad drehen usw.
Wir programmieren halt direkt auf der Hardware ohne irgendwelche Interpreter.
Das macht die Programme schnell aber auch kompliziert.
Lerne viel ohne Copy and Paste !!!
Selbst wenn, dann musst du aber den Code verstehen.

Wir alle wollen bestimmt nicht mit dem Arduino in den Weltraum fliegen, aber es ist eine Befriedigung, wenn so ein kleines Programm macht, was es soll.

Viel Spaß und viel Erfolg bei der Programmierung

Danke! :slight_smile:

freddy64:
Aber bei "delay" bzw in anderen Programmiersprachen "sleep" bleibt das Programm einfach stehen und tut in der angegebenen Zeit gar nichts.
Wenn da gerade Ereignisse von außen auftreten, kümmert sich das laufende Programm einen Sch*** darum.

Ganz stimmt das nicht, da Interrupts beispielsweise der seriellen Schnittstelle bedient werden.

freddy64:
Die Verwendung von Interrupts ist die beste Methode.

Mein Eindruck ist, daß dies für die hier im Forum besprochenen Programme eher nicht zutrifft. Um kurze Impulse nicht zu verpassen, eignen sich Interrupts. Sonst sind eher blockadearme Programme das Mittel der Wahl.