Delay als Variable

Moin Leute, kann ich delay() auch als Variable im allerersten Zeil mit einbringen? Es soll als Startbedingung benutzt werden bei einem else if befehle im Zusammenhang mit einem oder, also wenn ich Taster1 drücke oder nach 10000ms soll er Pin 10 auf LOW setzen. Vielen Dank im Vorraus MfG Freddy

kann ich delay() auch als Variable im allerersten Zeil mit einbringen?

Hindert Dich niemand dran. Der Rest ist konfus beschrieben, aber ich habe eine grobe Vorstellung davon was Du möchtest.

Du solltest deine Frage nochmals lesen. Verstehen kann ich diese nicht.

Aber die Funktion "delay()" kannst du auch mit einer Variablen füttern.

Beispiel:

long startzeit = 10000;

delay(startzeit);

Edit: Dann stehe ich ja nicht alleine "unwissend" da. ;)

Ich verstehe zwar nicht wirklich, was du mit “delay() als Variable” meinst … aber ich vermute mal ganz stark, dass du eine bestimmte Wartezeit beim Start des Controllers haben möchtest. In dieser Wartezeit willst du wahrscheinlich entweder >> eine Taste drücken um fortzusetzen … oder >> nach 10 Sek. das Programm automatisch starten !?

Das geht mit “delay()” absolut gar nicht. Du mußt viel mehr für diese 10 Sek. im Setup eine Schleife einbauen, in der du die betreffende Taste abfragst. Wird 10 Sek. keine Taste gedrückt - macht das Programm am definierten Startpunkt weiter. Wird aber innerhalb der 10 Sek. eine Taste gedrückt, macht das Programm direkt (oder an einer anderen Stelle) weiter.

delay(x) … macht nämlich gar nix … außer warten ohne andere Aktionen
Tipp: Suche mal nach dem Tutorial für “BlinkWitoutDelay”, da werden Sie geholfen
LG, Rudi

hi,

wie schon gesagt, während eines delay kannst Du keine tasten abfragen, aber Du könntest hundert kleine delays in einer for-schleife aufrufen und zwischendurch immer wieder die taste abfragen. wenn gedrückt wurde, verläßt Du die schleife mit break.

gruß stefan

Es wäre wünschenswert, wenn der TO seine Fragestellung mal überarbeitet.
Dann verstehen wir die sicher auch besser.

Mit delay() kommst Du immer dann nicht weiter, wenn ein Programm - entweder "mehrere Dinge zur gleichen Zeit ausführen" soll -oder wenn es "jederzeit auf Benutzereingaben reagieren" soll während es ein Ding ausführt.

Im Grunde stimme ich dir zu!

Aber dennoch ist es in dieser Absolutheit falsch!

Der Gegenbeweis: (Ein Blinker, welcher nur blinkt, wenn eine Taste gedrückt wird)

const byte taster     = 3;
const byte led        = LED_BUILTIN;
bool BlinkAnforderung = false;



//---------------------------------------------


void yield()
{
  BlinkAnforderung = !digitalRead(taster);
}



//---------------------------------------------


void setup() 
{
  pinMode(led,OUTPUT);
  pinMode(taster,INPUT_PULLUP);
}

void loop() 
{
  if(BlinkAnforderung) digitalWrite(led,!digitalRead(led));
  delay(500);
}

Es ist also ein Leben nebenläufig von delay() möglich. Mit Bordmitteln. Ganz ohne Interrupts, welche das auch könnten.

hi,

funktioniert yield() auch auf AVRs? ich dachte, das gibt's nur beim ESP.

und wenn ja, wo außer in delay wird es aufgerufen?

gruß stefan

funktioniert yield() auch auf AVRs?

Das Programm wurde auf einem UNO getestet.

und wenn ja, wo außer in delay wird es aufgerufen?

Nirgends!
Ein delay(1) ist das Minimum.

Alternativ:

void loop()
{
   yield();
}

Die Falle:
Wird in yield() direkt, oder indirekt, nochmal delay() genutzt, finden die yield() Aufrufe indirekt rekursiv statt.
Der Stapelüberlauf droht.

Siehe dazu auch:
[Projekt] Multitasking

Vielen Dank für die Tipps, leider weis ich nicht so viel damit anzufangen, ich bin sehr neu im Gebiet Arduino. Mein Sketch sieht im moment so aus:

int Zuendung = 8;
int Schliessen = 9;
int Relais = 10;
int Zuendungstatus = 0;
int Schliessenstatus = 0;

void setup() {
 pinMode(Zuendung, INPUT);
 pinMode(Schliessen, INPUT);
 pinMode(Relais, OUTPUT);
}

void loop() {
Schliessenstatus=digitalRead(Schliessen);
Zuendungstatus=digitalRead(Zuendung);

if (Zuendungstatus == HIGH)
{
 digitalWrite(Relais, HIGH);
}
else if ((Schliessenstatus == HIGH) || (millis() > 10000))
{
 digitalWrite(Relais, LOW);
}

}

ich habe es mit zwei Tastern simuliert, leider klappt es einmal wenn ich Taster Zündung drücke mit der zeit, aber wenn ich den Taster ein zweites mal drücke Leuchtet die LED hinter dem Relais und geht dann sofort wieder aus wenn ich ihn loslasse.

Vielen Dank MfG

Setze deinen Sketch in Code-Tags.
Verwende dazu die Schaltfläche </> im Editor-Fenster.

millis() > 10000

falsch. millis() kann nur zur Differenzbildung mit einem früheren Wert von millis() verwendet werden.

falsch.
millis() kann nur zur Differenzbildung mit einem früheren Wert von millis() verwendet werden.

auch falsch.
millis() zählt ab Start bis zum Überlauf nach 49 Tagen

https://www.arduino.cc/en/Reference/Millis

Mann kann natürlich prüfen, ob millis() > 10000 ist.
Dieser Zustand stellt sich regelmässig ein wenn nach Start 10 Sekunden vergangen sind oder 10 Sekunden nach Überlauf.

Das hilft dem OP nicht.

Freeed94:
if (Zuendungstatus == HIGH)
{
digitalWrite(Relais, HIGH);
}
else if ((Schliessenstatus == HIGH) || (millis() > 10000))
{
digitalWrite(Relais, LOW);
}

Hier musst Du Dein millis() ersetzen.
Wie oben von mir geschrieben, stellt sich diese Bedingung nach 10 Sekunden Laufzeit des Sketches dauerhaft ein und bleibt dann für 49 Tage+x erhalten und somit bei jedem Durchlauf wenn Zuendstatus==LOW ist die Bedingung else if erfüllt.

EDIT:

ungetestet und berücksichtigt nicht, das der arduino 50 Tage laufen kann…

int Zuendung = 8;
int Schliessen = 9;
int Relais = 10;
int Zuendungstatus = 0;
int Schliessenstatus = 0;
unsigned long delayed;


void setup() {
  pinMode(Zuendung, INPUT);
  pinMode(Schliessen, INPUT);
  pinMode(Relais, OUTPUT);
  delayed == millis()+10000;
  
 

}

void loop() {
Schliessenstatus=digitalRead(Schliessen);
Zuendungstatus=digitalRead(Zuendung);

if (Zuendungstatus == HIGH)
{
  digitalWrite(Relais, HIGH);
  delayed == millis()+10000;
}
else if ((Schliessenstatus == HIGH) || (millis() > delayed))
{
  digitalWrite(Relais, LOW);
}

}

Tut mir echt leid Leute ich blicke da relativ wenig durch :(

Also wenn Zuendungsstatus==HIGH ist soll das (Relais, HIGH) sein bis Zuendungsstatus==LOW ist, dann soll nach 10 sekunden bzw. später in der richtigen Schaltung 5min oder sofort durch Schliessenstatus==HIGH (Relais, LOW) sein.

Sorry für die ganzen Umstände

MfG

Das sind keine Umstände !

Aber du solltest dir einfach mal unsere Beiträge komplett durchlesen und dir die Grundlage aneignen, dann verstehst du es auch. Ebenso sollten deine Erklärungen verständlicher formuliert sein.

Achja, und solltest du jetzt aufgrund unserer Antworten es vorziehen, ein anderes Forum zu behelligen, dann mache es ruhig. Die werden dann auch ihre Freude mit dir haben. Warum sollen wir das alleine genießen.

Ja klar ein zünder... das soll für ein autoradio sein das beim abschliessen sofort ausgeht oder nach 5 minuten also pass mal auf was du hier schreibst von wegen terrorist und und und ich habe ganz normal gefragt und nicht nach pissigen antworten..

Achso und vielen Dank an die anderen, die es ernsrgenommen haben und versucht haben mir zu helfen. MfG

Achso und vielen Dank an die anderen, die es ernsrgenommen haben und versucht haben mir zu helfen.

Ja gerne. Ich habs mir schon gedacht, das da was mit KFZ rauskommt. Allerdings dachte ich eher an Motorad oder GPS-Tracker/Alarmanlage, virtueller Zaun oder so. Zumindest war das aus dem Codesnip so zu erkennen.

Man hat manchmal so das Gefühl, die Hysterie einiger weniger führt zu immer abstrusesten Vorstellungen in der Allgemeinheit.

Gruß

-- Aluhüte sind leider ausverkauft

Auch wenn es sowohl bei Autoradios als auch bei Attentätern egal ist:

Laie:
berücksichtigt nicht, das der arduino 50 Tage laufen kann

falsch: Ein Arduino kann ewig laufen. :wink:
Muss man das mit den millis() nur richtig machen.

if (Zuendungstatus == HIGH)
{
  digitalWrite(Relais, HIGH);
  delayed == millis()+10000; // du meinst vermutlich = statt == ?, ist aber trotzdem falsch
}
else if ((Schliessenstatus == HIGH) || (millis() > delayed))
{
  digitalWrite(Relais, LOW);
}

falsch
besser:

static unsigned long zuendungBis; // bleibt stehen, wenn Zuendung aus ist
if (Zuendungstatus == HIGH){
  digitalWrite(Relais, HIGH);
  zuendungBis = millis(); 
}
else if ((Schliessenstatus == HIGH) || (millis() - zuendungBis > 10000))
{
  digitalWrite(Relais, LOW);
}

Die Differenz ( millis() - alteZeit ) ist immer richtig, auch während eines Überlaufs.
Der Überlauf in der Summe millis() + Intervall störthier zugegebenermassen nur minimal.

Problem

void loop() {
   if ( millis() > Endzeit ) {
       Endzeit = Endzeit + 10000;
       zehnSekunden();  // wird alle 10 Sekunden ausgeführt
   }
   wasAnderes();  // delay(9000);
}

WennzehnSekunden()oderwasAnderes()eine merkliche Zeit dauert, kann dies den Arduino nach jeweils 49 Tagen für immer (oder mindestens einen 49,x Tage-Zyklus langt) blockieren!

Das Problem ist + 10000;
Wenn so die Zielzeit auf knapp unter MAX_UINT32 kommt, kann es natürlich sein, dass der millis() Überlauf passiert, ohne dass millis() jemals die Zielzeit überschreitet, bzw. dies bemerkt wird.

Die Differenzbildung (neu - alt) liefert hingegen immer die dazwischen vergangene Zeit, auch kurz vor, während und nach dem Überlauf.


[OT]: Mit dem “Schliessen” - Taster geht das Radio nur aus, wenn die Zündung aus ist. Damit kann man also nur die Nachlaufzeit vorzeitig abbrechen. Das ist vermutlich Absicht?