Status einer externen LED ermitteln

Hallo,

ich würde gerne den Status einer LED ermitteln, welche sich an einem externen Gerät befindet. Wie ich diese LED auslese sei zunächst einmal dahingestellt. Ich gehe aber mal davon aus, dass ich mir die Spannung dieser LED irgendwie auf einen Eingangspin legen kann.

Drei mögliche "Zustände" dieser LED sollen differenziert werden können.

a) aus
b) an
c) blinkend

Die auszulesende LED geht, wenn sie blinkt, in einem Intervall von ca. einer halben Sekunde an und aus.

Ich möchte den Sketch von Anfang nicht zu kompliziert gestalten. Zudem soll es eine kleine Fehlertoleranz geben, sollte mal was nicht sofort richtig erkannt werden.

Die Zustandsdefinition muss nicht auf die Sekunde genau funktionieren.

Ich sag mal, wenn die LED an war und nun angefangen hat zu blinken, sollte spätestens das dritte Aufleuchten zu einer Statusänderung führen.

Mein Problem ist nun, dass ich nicht weiss, wo ich hierbei ansetzen soll.

Gruß Chris

Mein Problem ist nun, dass ich nicht weiss, wo ich hierbei ansetzen soll.

Bei der LED!
(z.B. durch einen Optokoppler ersetzen.)

Saubere 1 0 Zustände erzeugen.

Diese Bit Zustände durch einen endlichen Automaten scheuchen.

Chris72622:
Wie ich diese LED auslese sei zunächst einmal dahingestellt.

Der Tatsache, dass ich saubere Ausgangswerte brauche bin ich mir bewusst.

Gruß Chris

Und, wo ist jetzt dein Problem?

Blink Without Delay ist die Lösung für Dein Problem.

Das hast du ja auch schon erkannt.....

Danke.

Gruß Chris

Du gibst dir irgendwie immer die Lösung selber mit deiner Signatur :confused:

Desweiteren ist die Beschreibung der Auswertung sehr ungenau. Darf an dem externen Gerät etwas verändert werden (Optokoppler), darf etwas von aussen vorgeklebt werden. Das Abgreifen der Spannung ist in meinen Augen der falsche Weg.

Eine Alternative wäre es, eine Photodiode/Phototransistor vor die Led zu kleben. Diese sollte aber, um eine Einstreuung von ausserhalb zu vermeiden, entsprechend geschütz werden.

Die Auswertung ist wie beschrieben trivial.

PseudoCode

Zeit messen, wie lange Led an ist. Wenn Led > 450ms und < 550ms an ist, eine Variable aufaddieren. Erreicht der aufaddierte Werte einen bestimmten Zustand, so handelt es sich um ein Blinken. Variable zurücksetzen, wenn Led länger 550ms an, bzw länger 550ms aus ist.

sschultewolter:
Zeit messen, wie lange Led an ist. Wenn Led > 450ms und < 550ms an ist, eine Variable aufaddieren. Erreicht der aufaddierte Werte einen bestimmten Zustand, so handelt es sich um ein Blinken. Variable zurücksetzen, wenn Led länger 550ms an, bzw länger 550ms aus ist.

Sehr gut, danke!

Gruß Chris

sschultewolter:
Die Auswertung ist wie beschrieben trivial.

Na dann, auf ins Programmiervergnügen:

int sensorPin = 2;
unsigned long aktMillis;
unsigned long prevMillis;
const unsigned int intervall = 200;
const unsigned int messungen = 8;
unsigned int aktmessung;
unsigned int werthigh;
unsigned int wertlow;

void setup() {
  Serial.begin(9600);
  Serial.println("Programmanfang");
  pinMode (sensorPin, INPUT_PULLUP);
}

void loop() {
  if (millis() - prevMillis >= intervall) {
    prevMillis = millis();
    if (aktmessung < messungen) {
      if (digitalRead(sensorPin)) {
        werthigh++;
      } else {
        wertlow++;
      }
      aktmessung++;
    } else {
      if (werthigh == 0) {
        Serial.println("LED aus");
      } else if (wertlow == 0) {
        Serial.println("LED an");
      } else {
        Serial.println("LED blinkt");
      }
      werthigh = 0;
      wertlow = 0;
      aktmessung = 0;
    }
  }
}

Beim Wechsel von an nach aus kommt zwischenzeitlich blinkt. Stört das?

Beim Wechsel von an nach aus kommt zwischenzeitlich blinkt. Stört das?

Gefühlt würde ich Blinken erkennen, wenns das zweite mal an geht innerhalb tolerierbarer Grenzen.

Sonst war es nur "kurz mal an".

Allerdings, was soll bei "kurz mal an" ( bzw. "kurze Unterbrechung" ) passieren?
Und was bei "Flackert kürzer als die vorgesehene BlinkZeit" ???

Soll ja auch eine Herausforderung sein, diese Aufgabe.
Das Hauptproblem einer Aufgabenstellung ist immer, dass das meiste nicht definiert ist.

Hallo,

habs hinbekommen, so wie ich es mir vorgestellt habe.

Zum Test habe ich einfach einen Taster pulldownmäßig an Pin 2 gehängt.

Anbei der Code.

Gruß Chris

const byte wama = 2;  // Waschmaschinen-LED hängt am angegebenen Pin

byte wamaUdpState;  // Zustand, der via UDP gesendet werden soll

enum wamaState {  // Bezeichnung der einzelnen Zustände
  OFF, ON, BLINK
};

void setup()
{
  pinMode(wama, INPUT);
  Serial.begin(9600);
  Serial.println("Ready.");
}

void loop()
{
  stateCheck();
}

void stateCheck()
{
  static byte count = 0;
  static unsigned long lastTime = 0;
  static boolean lastLedState;
  boolean ledState;
  static byte lastWamaUdpState = 3;
  const int blinkTime = 600; // Muss je nach Intervall individuell angepasst werden.

  ledState = digitalRead(wama);

  if (ledState != lastLedState)
  {
    if (millis() - lastTime <= blinkTime)
    {
      if (count < 3) count++;
      if (count == 3)
      {
        // Serial.println("BLINK");
        wamaUdpState = BLINK;
      }
    }
    lastTime = millis();
  }

  if (millis() - lastTime > blinkTime)
  {
    if (ledState)
    {
      // Serial.println("ON");
      wamaUdpState = ON;
    }
    else
    {
      // Serial.println("OFF");
      wamaUdpState = OFF;
    }
    count = 0;
    lastTime = millis();
  }
  lastLedState = ledState;

  if (wamaUdpState != lastWamaUdpState)
  {
    Serial.println(wamaUdpState);
    lastWamaUdpState = wamaUdpState;
  }
}