Einstellbaren Impuls ausgeben

Hallo Leute,

Ich will auf einem Arduino folgende Aktion ausführen:
Wenn ein Ereigniss ausgelöst wird z.bsp. Taster o.ä., soll
ein Ausgang für eine eisntellbare Zeit gesetzt werden.

Leider habe ich gerade keinen Arduino mehr (falsche Spannung am falschen
Pin :open_mouth: )
und kann daher nicht herumexperimentieren.

Wird das funktionieren?

Deklarationen:

const word ImpulseTime = 500; //Impulszeit in Millisekunden
int AUSGANG_pin = 5;
unsigned long PreviousMillis = 0;

In der loop:

if ("Ereigniss" and !digitalRead(AUSGANG_pin)){  
// Starte Impulszeit. Nicht Ausgangpin soll garantieren, das der Impuls beim ersten Ereigniss auslöst.
digitalWrite(AUSGANG_pin, HIGH);
PreviousMillis = millis();
}

if (millis() - PreviousMillis >= ImpulseTime){  // Zeit für Impuls abgelaufen
  digitalWrite(AUSGANG_pin, LOW);
}

Ich habe Angst, das das Zurücksetzen beim Überlauf von millis() Ausgang_pin noch einmal zurück gesetzt wird.

Hallo,

wo haste denn das wieder her? word

millis ist vom Datentyp unsigned long.
Wenn PreviousMillis ebenfalls unsigned long ist, passiert beim Überlauf absolut nichts.

Standardverfahren:

if (millis() - PreviousMillis >= ImpulseTime) {

Doc_Arduino:
wo haste denn das wieder her? word

Weil die ImpulseTime sicher nicht grösser als 65 Sekunden wird.
PreviousMillis ist ebenfalls unsigned long

Mir macht eben folgendes Kopfweh:

if (millis() - PreviousMillis >= ImpulseTime)

Wenn millis() überläuft und wieder bei 0 anfängt.
Was passiert dann, wenn millis() grösser als Impulszeit wird!

Hi

Rechne Es doch durch!
Die Antwort: Nichts - einzige Ausnahme: Das letzte 'Ereigniss' ist 49,batsch Tage her, dann 'glaubt' der Arduino, daß das Ereignis 'jetzt gerade eben' die PrevousMillis gesetzt hat - wäre nämlich genau der gleiche Wert - dadurch kommen wir wieder unterhalb der Impulszeit und die IF wird anders ausgehen.

Weiter: Du setzt akut für 49,batsch Tage bei JEDEM loop()-Durchlauf (außer innerhalb der Impulszeit) den Ausgang immer und immer wieder auf LOW - warum?
Klar macht Das dem Arduino herzlich wenig - ob Er einen Bit in einem der Register setzt oder nicht, oder dieses Setzen überspringt - Das ist Ihm wurscht.
Trotzdem ist's 'schöner', wenn der Kram nur ausgeführt wird, wenn Er gebraucht wird.

MfG

PS: word würde wohl unsigned int (16 Bit) entsprechen - zumindest damals hüstel zu 286er Zeiten war Das Mal so.

Hallo,

okay "word" steht auch in der Arduino Referenz, ist jedoch nicht geläufig. Sorry.
Besser lesbar und geläufig ist unsigned int.

Ponos:
Mir macht eben folgendes Kopfweh:

if (millis() - PreviousMillis >= ImpulseTime)

Wenn millis() überläuft und wieder bei 0 anfängt.
Was passiert dann, wenn millis() grösser als Impulszeit wird!

Wegen deinem Kopfweh, vielleicht können wir die Schmerzen lindern.
Fakt ist, millis wird wohl meistens größer irgendeinem Vergleichswert sein.
Darauf kommt es aber nicht an. Es kommt auf die Differenz an die du vorher bildest und danach vergleichst.
Schreibe dir ein einfaches Bsp. nur mit Byte Datentypen in einer for Schleife ohne millis und lasse dir alle Werte serial anzeigen. Schaue was mit dem Überläufen und der Differenzbildung passiert. Die Erkenntnis kannste auf andere Datentypen 1:1 übertragen.
Das millis nach 49 Tagen überläuft bedeutet praktisch nur das deine maximale Differenzzeit auf die du vergleichen kannst maximal 49 Tage sein kann. Das ist jedoch noch längst kein hartes Limit für den Programmierer.

Ponos:
Mir macht eben folgendes Kopfweh:

if (millis() - PreviousMillis >= ImpulseTime)

Wenn millis() überläuft und wieder bei 0 anfängt.
Was passiert dann, wenn millis() grösser als Impulszeit wird!

Dann passiert das, was vorher schon passiert ist, d.h. der Impuls wird abgeschaltet. Da er aber schon vorher abgeschaltet war, passiert eben garnichts. Man kann allerdings Unfug treiben und z.B. Serial.print aufrufen, das dann bei jedem weiteren Durchlauf munter weiter Zeichen rausschickt.

Zum definitiven Abschalten der obigen Abfrage kann man PreviousMillis auf den höchsten Wert setzen und auf > abfragen, dann bleibt das Ergebnis immer False.

Es gibt einen wunderbaren kostenlosen Arduino-Simulator (leider nur für Windoof, aber immerhin). Mit dem Ding kann man hervorragend Algorithmen enwickeln und testen, ohne irgendwas kaputt zu machen:

Download: https://www.sites.google.com/site/unoardusim/services

Screenshot:

Was soll beim Entwickeln von Algorithmen kaputtgehen? Wenn man später dem Motor eine zu hohe Spannung verpaßt, dann brennt der eben durch, auch wenn die Simulation problemlos durchlief. Die LEDs scheinen auch unkaputtbar zu sein?

Und wie bekommt man Rückmeldungen, z.B. die Drehzahl eines Motors, oder seine Endschalter?