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
Das problem ist derart allgemein und unkonkret formuliert das eine Hilf unmöglich ist. Meine Glaskugel sagt: Gugst Du Timer.
Oder guckst du "Zustandsautomat" oder "FSM" und liest über Timer gesteuert regelmäßig den Zustand (was auch immer X ist, Zeit oder Pegel?) deiner Lichtschranken ein.
@ 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.
:
Bearbeitet durch User
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.
Rechnest du eigentlich das störende Umgebungslicht heraus (oder filterst es analog)?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.