ich habe mal folgende französische Seite gefunden:
Code: Alles auswählen
// Konstanten (weil sie sich nicht ändern)
const int IRDetectorPin = 2; // pin du detecteur IR
const int ledPin = 13; // pin de la LED
32 / 5000
Übersetzungsergebnisse
// Variablen (weil sie sich ändern)
int ledState = LOW; // led eteinte
int IRState; // Aktueller Status des IR-Detektors
int lastIRState = LOW; //vorheriger Zustand des IR-Detektors (um eine Änderung zu erkennen)
// Zeitvariable in Millisekunden
long lastDebounceTime = 0; // Das letzte Mal wurde der Detektor gewechselt
long debounceDelay = 1000; // eine Sekunde Verzögerung, um eine Änderung zu validieren
//------------------- SETUP ----------------
void setup() {
pinMode(IRDetectorPin, INPUT);
pinMode(ledPin, OUTPUT);
// initialisation de la led
digitalWrite(ledPin, ledState);
}
//-------------------- LOOP ----------------
void loop() {
// Lesen des IR-Detektors in einer lokalen Variablen
int reading = digitalRead(IRDetectorPin);
// wenn der Strahl geschnitten ist (Lesen == HIGH oder 1)
// Wir warten lange genug, um die parasitären Erkennungen zu ignorieren
// und insbesondere die Intervalle zwischen den Wagen
// le detecteur a-t-il change
if (reading != lastIRState) {
// armement du timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// Wenn das Zeitlimit erreicht ist, ist die Änderung gültig
// sonst wird die Änderung ignoriert (Parasit oder Inter-Wagon)
// gültige Änderung
if (reading != IRState) {
IRState = reading;
//Wir geben das Wechselgeld an die LED weiter
ledState = IRState;
digitalWrite(ledPin, ledState);
// Wenn IRState HIGH ist, ist es der Kopf des Zuges
// *** rufe hier die Headend-Verarbeitung auf
// zum Beispiel: die Einfahrt des Zuges in einen Block
// Wenn IRSate LOW ist, ist dies das Ende des Zuges
// *** rufe hier die Tail-End-Verarbeitung auf
// zum Beispiel: der effektive Ausgang des Blocks
}
}
// Wir speichern den Status des Detektors für die nächste Schleifenrunde
lastIRState = reading;
// also die geringste Änderung vor dem Ende der debounceDelay-Verzögerung
// setzt diese Verzögerung zurück
}
Aber Du wirst das sicherlich schon kennen.Ein weiterer Tipp für die Wartung der Detektoren
Ich benutze einen analogen Eingang des Arduino. So kann ich per Software entweder eine analoge Messung (0.1023) oder eine digitale Messung (0 oder 1) des Sensorausgangs durchführen.
Da die Sendedioden mit einer konvergenten Linse ausgestattet sind, die einen sehr schmalen Strahl ergibt, und da man mit bloßem Auge nichts sieht, kann es schwierig sein, eine gute Ausrichtung der LED und des Sensors zu erreichen. Wenn man eine analoge Wiedergabe macht, erhält man einen Wert, der von der Ausrichtung abhängt. Dieser Wert muss so niedrig wie möglich sein, wenn die 2 Dioden zu sehen sind. Das muss dem logischen Level 0 entsprechen.
Wenn das Licht nicht durchkommt, ist der Wert maximal, oder parasitäres Licht stört den Sensor!
In meiner Ausführung habe ich den analogen Wert (0.1023) durch 100 geteilt und ihn auf einem 7-Segment-Display oder LCD in einem Kalibrierungsmodus angezeigt. Dann bewege ich die ausstrahlenden Diode, um einen Wert von 2 oder weniger zu finden. So bin ich mir sicher, dass die digitale Wiedergabe dann richtig sein wird.
Dieser Trick wird sich als sehr nützlich erweisen, da die Dioden manchmal während des Baus des Dekors gestört werden und eine einfache Wartung der Sensoren ermöglicht werden muss.
Schöne Ostern und viele Grüße an Euch alle
Wolfgang
.