Alternative zu pulseIn()?

Hi Leute,

ich bin auf der Suche nach einer Altenative für PulseIn(). Die 3min. Timeout reichen mir nicht. Ich möchte eine LED überwachung und zum Event LED = High etwas schreiben und dann wieder bei dem Event LED = Low. Aber das sind immer wesentlich mehr als 3 Minuten, wie lange die LED an oder aus ist. Wie kann ich das denn anders lösen (die Intervalle sind nicht immer gleich)?

Viele Grüße Can

laserbrain:
Wie kann ich das denn anders lösen (die Intervalle sind nicht immer gleich)?

Hm, "Alternative", was heißt das konkret?

Die Abstände der Impulse sind mehr als 3 Minuten, aber mit welcher Genauigkeit und welcher Länge möchtest Du Impulse erfassen? Soll die Impulslänge auch auf Mikrosekunden genau feststellbar sein, wie bei pulseIn? Oder reicht es beispielsweise, die Impulslänge auf Millisekunden genau zu ermitteln?

Mir würden sogar die Sekunden reichen. Mit Alternative meinte ich, ob es eine Funktion ähnlich pulseIn gibt ohne ein timeout oder mit einem großen timeout.

laserbrain:
...zum Event LED = High etwas schreiben und dann wieder bei dem Event LED = Low.

Wenn ich das richtig interpretiere, dann willst du gar nicht die Pulslänge messen, sondern an den Flanken irgendwelche Aktionen starten. Das könne man so lösen:

int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


void loop() {
   buttonState = digitalRead(Pin);
   if (buttonState != lastButtonState) {
        // do something 
     }
    lastButtonState = buttonState;
}

genau erklärt ist das hier: Arduino Tutorial Button State Change Detection

Wenn du aber sogar die Pulslänge messen möchtest, kannst du das einfach machen, in dem du in der if Abfrage mit millis() die jeweilige Zeit abspeicherst.

Gunther

laserbrain:
Mit Alternative meinte ich, ob es eine Funktion ähnlich pulseIn gibt ohne ein timeout oder mit einem großen timeout.

Was hindert Dich daran, so eine ähnliche Funktion ohne Timeout selbst zu schreiben?

Was macht denn die Funktion?

  • Sie mißt die Pulselänge eines Low- oder High-Impulses auf Mikrosekunden genau
  • dazu wartet sie einen ganzen, vollständigen Impuls ab, je nachdem HIGH oder LOW
  • während die Funktion läuft, blockiert sie den weiteren Programmablauf
  • damit ein Programm nicht unendlich lange blockiert wird, gibt es einen Timeout

Lasse ich den Timeout weg und reicht es mir, das Timing des auszumessenden Impulses auf Millisekunden genau zu bekommen, schreibe ich die eigene Funktion:

unsigned long slowPulseIn(byte pin, boolean State)
{
  long timing;
  while (digitalRead(pin)==State) ; // pulse in progress, wait for another one
  while (digitalRead(pin)==!State) ; // false pulse flank, just wait
  timing=millis(); // now the pulse starts
  while (digitalRead(pin)==State) ; // pulse in progress, wait until finished
  return(millis()-timing);  // return pulse duration
}

Und dann rufst Du statt pulseIn() eben die selbstgeschriebene Funktion slowPulseIn() auf, die kein Timeout hat. Falls Du Dein Programm wirklich "unendlich lange" blockieren möchtest, während es auf den Impuls wartet und zwischendurch gar nichts anderes machen kann.

Hallo,

Du möchtest nur etwas machen wenn die LED an bzw. aus ist? Geht da nicht das auslesen des digitalen Pins an dem Du die LED anschließen kannst? Ggf. vorher die Pegel anpassen. Dann könnte man den Zustand des Eingangs abfragen (0 oder 1) und dann entsprechend Befehle abarbeiten lassen. Das würde ganze ohne Blockierung des µC funktionieren.

Hallo und vielen Dank für die Tipps.

leider kann ich nciht direkt an die Pins der LED. Ich möchte konkret meinen Ölbrenner überwachen. Bei Staus Änderung von Led an auf aus und umgekehrt möchjte ich einen json Request abgeben. Und da wäre eben pulseIn perfekt dafür.

LG Can

Hallo,

dann könntest eine Zusatzschaltung bauen mit Helligkeitssensor den Du direkt über der LED positionierst. Das Signal leitest du dann an Deinen µC weiter. Auf der anderen Seite der Platine baust wieder eine LED drauf womit man die eigentliche LED wieder ordentlich sieht. Wäre sonst verdeckt.

Ja, das ist kein Problem. GEnau soi messe ich ja auch den Zustand aus.

Aber meine Frage bezog sich auf pulseIn() Ich suche eine Funktion, die nur bei Zustandsänderungen aktiv ist, nur ohne time out. Das drum herum mit Leds etc. ist kein Problem.

laserbrain:
Aber meine Frage bezog sich auf pulseIn() Ich suche eine Funktion, die nur bei Zustandsänderungen aktiv ist, nur ohne time out.

Aber genau dazu sind ja bereits mehrere Lösungen gepostet worden!

Und, ich bin immer noch der Ansicht, dass pulseIn() NICHT das ist, was du brauchst.

Bei Status Änderung von Led an auf aus und umgekehrt

Hierfür ist pulseIn() nicht die Lösung! du brauchst "Change State".

Liest du dir die Antworten durch, die geschrieben wurden?

Zu meiner Schande muss ich gestehen, dass ich genau den wichtigsten Beitrag nicht gesehen habe. Aber genau so werde ich es lösen. Vielen Dank!