IR-Lichtschranke für Streckenmessung

Moin!

ich möchte auf der Modelleisenbahn eine Geschwindigkeit messen mit einer Start und einer Zielstrecke.

Bisher habe ich die Messung am Start und Ziel über einen Taster ausgelöst (Hardware war noch nicht da). Das funktionierende Sketch habe ich angehängt.

Nun habe ich mir ein IR-Hinderniserkennungsmodul zugelegt (3 x IR Infrarot Hindernis Erkennung Abstandssensor Sensor Modul Arduino Raspb... | eBay)

Die Stromversorgung habe ich angeschlossen und den Output-Pin im Board in 7 bzw. 8 direkt gesteckt. Die LED für die Stromversorgung leuchtet und wenn ich die Hand vor den LED bewege zeigt die Kontroll-LED auch an, dass da was ist.

Aber meine Schaltung reagiert nicht. Irgendwie wird immer so getan als wenn gleich eine Auslösung statt gefunden hat.

Kann mir einer weiterhelfen.

Ergänzende Frage: kann man die LED auslöten und ein 5-10cm Kabel verlängern? oder macht soetwas Probleme?

Gruß Jan

lichtschranke.ino (4.17 KB)

Setze deinen Sketch bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar, auch mobile Geräte.

Vielleicht mußt Du ja nur den aktiven Zustand von HIGH auf LOW ändern?

Moin

erst einmal danke für die Rückmeldung.

Soll ich so lange Sketche auch direkt posten? Deshalb als Anlage angehängt.

Gruß Jan

Solange Du die Code Tags </> benutzt, erscheint der Code in einem scrollbaren Fenster. Da ist es erst mal egal, wie lang der Code ist.

// Lichtschranke für Zugeschwindigkeit in Verbindung mit Seriellen Monitor
//
// Einbinden der LCD-Funktionen derzeit noch inaktiv
// #include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C lcd(0x27, 16,2) // ?????
//
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
/*-----( Declare Variables )-----*/
//NONE
unsigned long start, finished, elapsed;
int PS = -1; // Kennung für Programmstart
int act = 0; // Messung aktiv 1 / nicht aktiv 0
int T1 = 7; // 1. Taster #7
int T2 = 8; // 2. Taster #8
int P1 = A0; // ANALOG für Poti
// Werteabfrage
// Taster
// aktueller Status
int cT1 = -1; // Status Taster 1
int cT2 = -1; // Status Taster 2
// vorheriger Status
int oT1 = -1; // Status Taster 1
int oT2 = -1; // Status Taster 2
int maxTime = 0; // Kennung für die Zeitüberschreitung
// Poti
int cP = 0; // Wert am Poti
// Werte für die Messstrecke (1/10mm)
int Svon = 5000; // 50 cm
int Sbis = 6000; // 60cm
int oDist = 0; // alter Streckenwert
void setup() {
  // Hier fehlt die Initalisierung des LCD
  Serial.begin(9600); // öffnen der Seriellen Schnittstelle für die Überwachung
  pinMode(T1, INPUT); // EINGANGSpin für den Taster-#1
  pinMode(T2, INPUT); // EINGANGSpin für den Taster-#2

  lcd.begin(16, 2); // initialize the lcd for 16 chars 2 lines, turn on backlight
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("Lichtschranke");
  lcd.setCursor(0, 1);
  lcd.print("aktiv ...");
  delay(2000);

  Strecke();
}
void loop() {
  // put your main code here, to run repeatedly:
  if (PS == -1) {
    lcd.clear();
    lcd.setCursor(0, 0); //Start at character 4 on line 0
    lcd.print("Lichtschranke");
    lcd.setCursor(0, 1); //Start at character 4 on line 0
    lcd.print("bereit ...");
    Serial.println("Programm gestartet");
    //lcd.begin(16,2); // initialize the lcd for 16 chars 2 lines, turn on backlight
  }
  Strecke();
  PS = 1;
  if (act == 0) {
    cT1 = digitalRead(T1); // Auslesen TASTER - #1
    if (cT1 == HIGH) {
      start = millis();
      lcd.setCursor(0, 0); //Start at character 4 on line 0
      lcd.print("Messung aktiv");
      lcd.setCursor(0, 1); //Start at character 4 on line 0
      lcd.print("erwarte Ziel ...");
      Serial.println("gestartet ...");
      act = 1;
      maxTime = 0;
    }
  }

  if (act == 1) {
    cT2 = digitalRead(T2); // Auslesen TASTER - #2
    if (cT2 == HIGH && maxTime == 0) {
      Serial.print("act ...");
      Serial.println(act);
      if (act == 1) {
        lcd.setCursor(0, 0); //Start at character 4 on line 0
        lcd.print("Zeitmessung erfolgt");
        lcd.setCursor(0, 1); //Start at character 4 on line 0
        lcd.print("Auswertung läuft ...");
        delay(1000);
        showResult();
        act = 0; // damit wird die Messung als beendet erklärt
        // }else{
        // Serial.println("ungültiger Messwert!");
      }
    } else {
      if (calTime() > 10.0 && maxTime < 1) {
        Serial.println("** Zeitüberschreitung **");
        maxTime = 1; // Zeitüberschreitung wurde ausgegeben
        act = 0; // damit der Start wieder ausgelesen werden kann
      }
    }
  }

  writeStatus();

  // Status merken
  oT1 = cT1;
  oT2 = cT2;
}

// Berechnen des Ergebnis
void showResult() {
  // Serial.print(calTime());
  Serial.print("Dauer: ");
  Serial.print(calTime());
  Serial.println(" sek");
  lcd.clear();
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("Dauer: ... sek");
  lcd.setCursor(0, 1); //Start at character 4 on line 0
  lcd.print("Speed... km/h");
}
float calTime() {
  unsigned long over;
  finished = millis();
  elapsed = finished - start;
  // over = elapsed % 3600000;
  // over = over % 60000;
  return (elapsed / 1000.0);
}
// Ausgabe der Statusangaben
void writeStatus() {
  // liegt eine Veränderung in den Tastern vor?
  if (oT1 != cT1 || oT2 != cT2) {
    Serial.print(cT1);
    Serial.print(" - ");
    Serial.print(cT2);
    Serial.print(" -> ");
    Serial.println(act);
  }
}
// Definieren der Strecke für die Ausmessung in MM
void Strecke() {
  int cDist = map(analogRead(P1), 0, 1023, Svon, Sbis);
  // Serial.print("oDist - cDist: ");
  // Serial.print(cDist);
  // Serial.print(" - diff: ");
  // Serial.println((oDist - cDist));

  if (abs(oDist - cDist) > 20) {
    Serial.print("diff: ");
    Serial.print(abs(oDist - cDist));
    Serial.print(" - Dist: ");
    Serial.println(cDist);
    oDist = cDist;
  }
}

Eingehängt mit Einrückungen (Bitte Strg+T drücken vor dem Posten).

Wie gesagt:

    cT1 = digitalRead(T1); // Auslesen TASTER - #1
   if (cT1 == HIGH) {

stimmt da HIGH?

Wie sind die "Taster" angeschlossen, stimmt da

  pinMode(T1, INPUT); // EINGANGSpin für den Taster-#1

ohne Pullup?

Moin!

dann weis ich mit der Formatierung bescheid.

Was High/Low betrifft muss ich heute Abend nochmal testen.

Der funktionierende Code ist der, den ich gepostet habe - also mit pinMode

Gruß Jan

Jan999:
Aber meine Schaltung reagiert nicht. Irgendwie wird immer so getan als wenn gleich eine Auslösung statt gefunden hat.

Leider sind bei solchen Angeboten wie dem verlinkten oftmals die technischen Daten ziemlich geheim. Da der auf dem Foto erkennbare Komparator einen open-Collector Ausgang hat, ist recht naheliegend, dass der aktive Zustand LOW ist.
D.h. im Ruhezustand ist der Ausgang HIGH, und nur wenn ein Objekt in der Nähe ist, geht der Ausgang auf LOW. Das wäre dann genau umgekehrt wie bei deinen Tastern und würde das Verhalten erklären.

Man müsste es mal Testen mit dem pinMode(Pin,INPUT_PULLUP);
dann siehst du es am besten ohne "Belegung" des Sensors HIGH bei Belegung "LOW".
Gruß
DerDani