Lichtschranke_in C_Dämpfung

Gast #5279089
Lesenswert?

Hallo Team,

ich habe zwei Lichtschranken. Diese kann ich auch perfekt einlesen.
Mein "Programm in C" besteht Grundsätzlich aus if-Schleifen in der ich 
Und-Oder Befehle verarbeite.

Ich habe es so programmiert: Wenn beide Lichtschranken unter einem Wert 
X liegen, passiert etwas. Wenn mindestens eine Lichtschranke über den 
Wert X liegt, passiert etwas anderes.

Nun folgendes Problem: Den Bereich den meine Lichtschranken einlesen, 
ist nicht immer zu 100% spiegelnd (Unebenheiten). Quasi, dass zum 
Beispiel eine Lichtschranke für eine sehr kurze Zeit über dem Wert X 
ist.

Ich will es nun so Programmieren, dass die Lichtschranken mindestens 
eine Zeit T(zum Beispiel mindestens 100ms) betätigt/unbetätigt sein 
müssen, damit meine if-Schleifen erst reagieren.

Ich habe gar keine Ahnung, wo nach ich "googlen" müsste oder wie ich es 
Anstellen könnte.
(Ich hoffe ich habe es nicht zu allgemein geschrieben, dass man nichts 
mehr versteht:/)
Danke für mögliche Antworten!:D
#5279103
Lesenswert?

@ programmiernoob (Gast)

>ich habe zwei Lichtschranken. Diese kann ich auch perfekt einlesen.

Aha.

>Mein "Programm in C" besteht Grundsätzlich aus if-Schleifen

Das wage ich zu bezweiflen.

http://www.if-schleife.de/

> in der ich
>Und-Oder Befehle verarbeite.

Nennt sich Bitmanipulation.

>Ich habe es so programmiert: Wenn beide Lichtschranken unter einem Wert
>X liegen, passiert etwas. Wenn mindestens eine Lichtschranke über den
>Wert X liegt, passiert etwas anderes.

Komisch. Lichtschranken sind im Normalfall digital, genauer, binär. Da 
gibt es nur 1 oder 0 und keine Zwischenstufen.

>Ich will es nun so Programmieren, dass die Lichtschranken mindestens
>eine Zeit T(zum Beispiel mindestens 100ms) betätigt/unbetätigt sein
>müssen, damit meine if-Schleifen erst reagieren.

Nennt sich Entprellung und ist vermutlich besser in der Hardware 
aufgehoben.
#5279111
Lesenswert?

a)
"if" bildet keine Schleife in C, im Gegensatz zu "for", "do" oder 
"while"

b)
Der Ansatz mit zeitlichen Verzögerungen zu arbeiten ist bei diese 
Problemstellung (verrauschtes Eingangssignal) nicht unbedingt das Beste.

Besser ist es mit einer Hysterese bei den Eingangsdaten zu arbeiten.
D.h. du definierst nicht nur einen Schwellwert "X", sondern zwei, die 
einen gewissen Abstand voneinander haben ("threshold_high", 
"threshold_low").

Das ganze sieht dann exemplarisch so aus:
1
if (adc_value > threshold_high)
2
  state = 1;
3
else if (adc_value < threshold_low)
4
  state = 0;

Im Bereich zwischen "threshold_high" und "threshold_low" behält "state" 
also erstmal den vorherigen Wert, und toggelt nicht wild hin und her.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren