Forum: PC-Programmierung Erkennen von Videoaufnahme anhand LED-Blinken


von Helge (Gast)


Lesenswert?

Hallo.

ich möchte an einer Kamera überprüfen, ob sie aufnimmt. Hierzu habe ich 
die Led der Kamera angezapft, die bei Aufnahme blinkt. Das funktioniert 
soweit.
Die Led blinkt im 1.Sekunden Takt. Bleibt das blinken aus, wird 
is_recording = false gesetzt.

Nun kommt allerdings als Schweirigkeit dazu, dass wenn das Ladekabel an 
der Kamera hängt, die Led ebenfalls blinkt.
Ich müsste jetzt herausfinden, ob die LED mindestens zweimal blinkt und 
dann erst is_recording = true; setzen. Momentan wird es sobald einmal 
Blinken erkannt wird, gesetzt.

Kann mir jemand einen Anstoß geben wie man das lösen könnte?
Ich sitze gerade davor und sehe den Wald vor lauter Bäumen nicht..

ich müsste irgendwie einen zähler inkrementieren und dann auswerten zb
if (blinken>2) is_recording=true
1
void loop_check_is_recording() {
2
  if (digitalRead(PIN_KAMERA_STATUSLED) == 0) {
3
    is_recording = true;
4
    lcis_previousMillis = millis();
5
  }
6
  if (millis() - lcis_previousMillis >= 1500) {
7
    is_recording = false;
8
  }
9
}

von Achim M. (minifloat)


Lesenswert?

Du musst für einmal Blinken die Flanke LED-aus zu LED-an als Referenz 
hernehmen. Dazu mit dem im letzten Zyklus erfassten Zustand vergleichen.

Damit kannst du deinen Blinkzähler "blinken" inkrementieren, wenn er 
noch nicht 3 erreicht hat.

Timeout geht wie bisher, nur dass er auch "blinken" nullt. Danach dann 
wie von dir vermutet,

Helge schrieb:
> if (blinken>2) is_recording=true

...fertig ist die Laube.
mfg mf

von Helge (Gast)


Lesenswert?

Hallo Achim,

danke für deine Erläuterung. Ich hatte gehofft, dass es damit klickt 
macht bei mir. aber ich bin noch nicht dahinter gestiegen wie du meinst 
mit der Flanke?
Könntest du mir da mit einem kurzem Pseudocode auf die Sprünge helfen?

Ich muss dazu noch sagen, dass digitalRead(PIN_KAMERA_STATUSLED) == 0 
bedeutet, dass die Led hier an wäre. Der Eingang ist per pull-up hoch 
gezogen und wenn die Led der Kamera leuchtet wird er auf GND gezogen.

Grüße und schöne Weihnachten
Helge

von Rolf M. (rmagnus)


Lesenswert?

Helge schrieb:
> Hallo Achim,
>
> danke für deine Erläuterung. Ich hatte gehofft, dass es damit klickt
> macht bei mir. aber ich bin noch nicht dahinter gestiegen wie du meinst
> mit der Flanke?

Aktuell prüfst du nur den Status aus oder an. Du musst den Wechsel von 
aus nach an erkennen. Dazu musst du dir den vorherigen Zustand der LED 
merken und mit dem aktuellen vergleichen. Immer wenn der vorherige "aus" 
war und der neue nicht, startet ein neues Blink-Intervall. Damit kannst 
du dann auch ganz einfach zählen, wie oft geblinkt wurde.

von Achim M. (minifloat)


Lesenswert?

Vielleicht so?
1
int led_old = HIGH; // normally, low-active LED is off
2
int blinken = 0;
3
unsigned long lcis_previousMillis = 0;
4
bool is_recording = false;
5
6
void loop_check_is_recording()
7
{
8
  int led_new = digitalRead(PIN_KAMERA_STATUSLED);
9
10
  // check for negative edge on LED-pin
11
  if(  (led_old == HIGH)
12
     &&(led_new == LOW ))
13
  {
14
    // count negative edges
15
    // limit blink counts to prevent overflow
16
    if(blinken < 2)
17
    {   
18
      blinken++;
19
    }
20
    
21
    // store timestamp of neg. edge
22
    lcis_previousMillis = millis();
23
  }
24
25
  // if there was no neg. edge the last 1.5sec ...
26
  if (millis() - lcis_previousMillis >= 1500)
27
  {
28
    // ... there's no blinken
29
    blinken = 0;
30
  }
31
32
  // of there was more than one blink...
33
  if (blinken > 1)
34
  {
35
    // ... we're recording ...
36
    is_recording = true;
37
  }
38
  else
39
  {
40
    // ... otherwise we're not recording
41
    is_recording = false;
42
  }
43
44
  // store LED-pin status for next cycle
45
  led_old = led_new;
46
}

mfg mf

von Achim M. (minifloat)


Lesenswert?

Besser:
1
int led_old = HIGH; // normally, low-active LED is off
2
int blinken = 0;
3
unsigned long lcis_previousMillis = 0;
4
bool is_recording = false;
5
6
void loop_check_is_recording()
7
{
8
  int led_new = digitalRead(PIN_KAMERA_STATUSLED);
9
10
  // check for negative edge on LED-pin
11
  if(  (led_old == HIGH)
12
     &&(led_new == LOW ))
13
  {
14
    // count negative edges
15
    // limit blink counts to prevent overflow
16
    if(blinken < 2)
17
    {   
18
      blinken++;
19
    }
20
    
21
    // store timestamp of neg. edge
22
    lcis_previousMillis = millis();
23
  }
24
  else if (millis() - lcis_previousMillis >= 1500)
25
  {
26
    // if there was no neg. edge the 
27
    // last 1.5sec there's no blinken
28
    blinken = 0;
29
  }
30
  else
31
  {
32
    // nothing to do
33
  }
34
35
  // if there was more than one blink...
36
  if (blinken > 1)
37
  {
38
    // ... we're recording ...
39
    is_recording = true;
40
  }
41
  else
42
  {
43
    // ... otherwise we're not recording
44
    is_recording = false;
45
  }
46
47
  // store LED-pin status for next cycle
48
  led_old = led_new;
49
}

von Helge (Gast)


Lesenswert?

Hallo,

danke euch Beiden. Das sieht gut aus, werde das gleich mal einbauen und 
testen.Warum ist das zweite Bespiel noch besser?

von Achim M. (minifloat)


Lesenswert?

Helge schrieb:
> Warum ist das zweite Bespiel noch besser?

Wenn eine Flanke erkannt wurde, muss ich im selben Zyklus nicht den 
Timeout prüfen...

mfg mf

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.