Dunkelzeitmessung LDR

Hallo Arduino Community,

ich möchte die Dunkelzeit eines LDR´s messen. Eine Murmel läuft auf einer Bahn durch die Lichtschranke und ich möchte wissen, wie lange die Murmel die Lichtschranke unterbrochen hat.

Ziel ist es, auf einer Bahn mit zwei Lichtschranken zwei verschiedene Dunkelzeiten zu messen.

Könnt ihr mir Ansätze liefern, wie der Code aussehen sollte? Die Geschwindigkeitsmessung über beide Lichtschranken hinweg funktioniert dank eurer Hilfe bereits :).

Vielen Dank und Grüße,
sYros2k

Die Geschwindigkeit hast du bereits? Wo ist dann das Problem?

Signal wird dunkel, Zeit merken.
Signal wird wieder hell, wieder Zeit merken.
Die Differenz der beiden Zeiten ist deine Dunkelzeit.

Sehr ähnlich musst du das doch auch schon bei der Geschwindigkeit gemacht haben. Wieso kannst du das dann nicht selber adaptieren?

Lieben Gruß,
Chris

Bei der einen Flanke die millis() merken und bei der Rückflanke von den dann aktuellen millis() den gemerkten Wert subtrahieren. Welche Flanke das ist, hängt von Deiner Schaltung ab.

Wenn Dir millis nicht ausreicht, kannst Du auch micros() nehmen. Die zählt auf AVR nach meiner Erinnerung aber nur in 4er-Schritten.

Gruß Tommy

Grundsätzlich ist mir das Vorgehen klar, ich schaffe es jedoch nicht in einen Code zu übersetzen. Das ist mein aktueller Stand (geht aber nicht…).

void loop()
{
  lcd.setCursor(0, 0);
  for (int i = 0; i < 1; i++){
    if (( analogRead(A0) < 600 )) {
        zeit1 = millis();
      }

    if (( analogRead(A0) > 600 )) {
        zeit2 = millis();
      }
    

  zeit3 = zeit2 - zeit1;


  lcd.print(zeit3);

Was soll die unsinnige for-Schleife da drin?

Gruß Tommy

das war der Versuch, bis zum Restart nur eine Messung zuzulassen.

der Versuch, bis zum Restart nur eine Messung zuzulassen

bool fertig=false;
void loop() {
   if (! fertig) {
      fertig= true; 
      // wird nur einmal ausgeführt bis reset
      // ...
    }
}

Man kann allerdings auch alles in setup() machen, und loop leer lassen.

void loop() {} // nichts mehr tun nach setup

sYros2k:
ich möchte die Dunkelzeit eines LDR´s messen.

Einen lichtempfindlichen Widerstand für eine Lichtschranke, bist Du Dir sicher? Ist der nicht zu träge?

Hallo
Mich wundert das du bisher noch nicht gemerkt hast das ein LDR zu langsam ist. Ich glaube eigendlich nicht das der die Murmel erkennen kann. Es sei denn die rollt da ganz langsam durch

Heinz

Ein LDR ist zu träge. Du brauchst einen Fototransistor zur Messung. Wenn die Murmel sehr schnell ist auch eine Fotodiode.

Grüße Uwe

Ich habe euch im Anhang ein Foto von der Apparatur angehängt. Genauigkeit ist so ein Thema… natürlich möchte man möglichst genaue Werte - ABER eine zu hohe Genauigkeit ist im Physikunterricht der Sekundarstufe eher ein Problem.

Ein Beispiel:

Angenommen ich lege eine Murmel(1) zwischen die beiden Lichtschranken, eine andere Murmel(2) lasse ich über eine Rampe (Höhenunterschied = wenige Zentimeter) beschleunigen. Beim Durchqueren der Lichtschranke 1 soll über die Dunkelzeit die Geschwindigkeit von Murmel(2) gemessen werden. Anschließend trifft Murmel(2) auf Murmel(1) und dank der Impulserhaltung bleibt Murmel(2) stehen und Murmel(1) rollt weiter und durchquert die Lichtschranke 2 wobei wieder die Geschwindigkeit über die Dunkelzeit gemessen werden soll.

Habe ich bei einem solchen Aufbau super genaue Sensoren, dann wird aufgrund der Reibung und einer niemals zu 100% horizontal ausgerichteten Bahn ein kleiner Unterschied der Geschwindigkeiten gemessen. Diesen Unterschied muss ich dann natürlich im Unterricht thematisieren - was ich aber in diesem Zusammenhang garnicht möchte. Ich muss mich in der Hauptschule auf einzelne Phänomene beschränken und diese abgeschottet betrachten.
Messfehlerdiskussionen sind zwar wichtig, aber nicht immer zielführend. In diesem Fall möchte ich einfach nur eine Apparatur die mir (annähernd richtige) gleiche und reproduzierbare Werte erzeugt. Die Geschwindigkeiten bewegen sich zwischen 0,1 und 1.5 m/s.

Wenn ihr mein Problem in diesem Licht betrachtet, würdet ihr mir dennoch zu anderen Sensoren raten?

Abgesehen von der Genauigkeit, warum funktioniert mein Code nicht?

Ich denke du interpretierst da etwas falsch.

Nur weil du den einen oder anderen Sensor benutzt kommt da nicht einmal was mit einer Nachkommastelle und einmal was mit drei Nachkommastellen bei raus. Das ist nur die Anzeigegenauigkeit. Die kannst du Programmtechnisch ja so gestalten wie du sie haben möchtest. Da kannst du die Nachkommastellen, auf oder abrunden, filtern und so weiter machen wie du möchtest.

Die Messgenauigkeit ist aber sehr wohl stark von den Sensoren abhängig. Ein Fototransistor ändert sein Ausgangssignal sehr viel schneller als ein LDR. Daher ist ein LDR besser für langsame Vorgänge geeignet. Ein Fototransistor ist für schnellere Vorgänge geeignet. Auch sind die Toleranzen bei LDR wesentlich höher als bei Fototransistoren. Das bedeutet, wenn deine Lichtschranken mit LDRs ausgerüstet sind, kann die gemessene Zeit stärker voneinander abweichen, als wenn du sie mit Fototransistoren ausgestattet hättest.

Das kannst du doch super selber ausprobieren.
Baue einfach noch zusätzlich zwei Fototransistoren ein und vergleiche die Ergebnisse. Ich wette da kommt was völlig anderes bei raus, mit dem du nicht gerechnet hättest.

Lieben Gruß,
Chris

sYros2k:
Wenn ihr mein Problem in diesem Licht betrachtet, würdet ihr mir dennoch zu anderen Sensoren raten?

Wo auch immer Du gerade bei Deinen Überlegungen steckst - ich bin gerade eben erst in diesen Thread gestolpert -, ein LDR ist deutlich zu träge. Nimm Fototransistoren.

Gruß

Gregor

PS:

Abgesehen von der Genauigkeit, warum funktioniert mein Code nicht?

Bitte poste einmal den vollständigen und aktuellen Code.

themanfrommoon:
Nur weil du den einen oder anderen Sensor benutzt kommt da nicht einmal was mit einer Nachkommastelle und einmal was mit drei Nachkommastellen bei raus. Das ist nur die Anzeigegenauigkeit. Die kannst du Programmtechnisch ja so gestalten wie du sie haben möchtest. Da kannst du die Nachkommastellen, auf oder abrunden, filtern und so weiter machen wie du möchtest.

Die Messgenauigkeit ist aber sehr wohl stark von den Sensoren abhängig. Ein Fototransistor ändert sein Ausgangssignal sehr viel schneller als ein LDR. Daher ist ein LDR besser für langsame Vorgänge geeignet. Ein Fototransistor ist für schnellere Vorgänge geeignet. Auch sind die Toleranzen bei LDR wesentlich höher als bei Fototransistoren. Das bedeutet, wenn deine Lichtschranken mit LDRs ausgerüstet sind, kann die gemessene Zeit stärker voneinander abweichen, als wenn du sie mit Fototransistoren ausgestattet hättest.

Das klingt logisch. Könnt ihr mir ein genaues Bauteil empfehlen? Kann ich dann trotzdem meine Laser weiter verwenden?

Der Code sieht aktuell so aus:

#include <LiquidCrystal.h> //LCD-Bibliothek laden

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const byte LS1 = A0; // "LS1" steht für "Lichtschranke1"
uint16_t sensorWert1 = 0; // Sensorwert der LS1
const byte LS2 = A1; // Lichtschranke2
uint16_t sensorWert2 = 0; // Sensorwert der LS2
const float a = 10; // Abstand zwischen LS1 und LS2 (in mm)

uint32_t zeit1 = 0; // Zeitpunkt Anfang LS1
uint32_t zeit2 = 0; // Zeitpunkt Ende LS1
uint32_t zeit3 = 0; // Dunkelzeit 1
uint32_t zeit4 = 0; // Zeitpunkt Anfang LS2
uint32_t zeit5 = 0; // Zeitpunkt Ende LS2
uint32_t zeit6 = 0; // Dunkelzeit 2
float v = 0;

void setup()
{
  lcd.begin(16, 2); //16 Zeichen in 2 Zeilen.
 
}
void loop()
{  lcd.setCursor(0, 0);


    if (( analogRead(A0) < 700 )) {
        zeit1 = millis();
      }
    else
    {
    }
    if (( analogRead(A0) > 700 )) {
        zeit2 = millis();
      }
zeit3 = zeit2 - zeit1;

  lcd.print(a/zeit3);


}

sYros2k:
Kann ich dann trotzdem meine Laser weiter verwenden?

Laser sind gebündeltes Licht, Phototransitoren reagieren auf Licht, also grundsätzlich ja.

Farbe: Laser geben häufig Licht einer bestimmten Farbe ab, genau bei dieser Wellenlänge sollte der Phototransitor auch empfindlich sein.

Modulation: Phototransitoren reagieren auch auf Sonnenlicht. Um diesem Fremdlicht die Wirkung zu nehmen, wird das gesendete Licht gerne moduliert. Bei IR-Fernbedienungen ist das der Fall. Da müssen die Modulationsfrequenzen von Sender und Empfänger zueinender passen. Da Murmeln möglicherweise Fremdlicht spiegeln und brechen, könnte eine Modulation sinnvoll sein.

Hallo,
meine Erfahrungen sind mit LDR-Lichtschranken auch überwiegend negativ: Von 100 Messungen funktionieren nur 5 und davon sind 3 seltsam, meine ist nämlich wesentlich schneller als 0.3 km/h. Aber ich hatte auf der anderen Seite der 2cm-breiten Lichtschranke nur einfache LEDs.

Wie gena sieht deine Hardware aus? So:

GND --- LDR --+-- [10kO] --- 5V
              |
             A0

Oder so:

5V --- LDR --+-- [10kO] --- GND
             |
            A0

Welchen Durchmesser haben die Kugeln und wie lange soll der Apparat ohne Reset laufen?

sYros2k:
Diesen Unterschied muss ich dann natürlich im Unterricht thematisieren - was ich aber in diesem Zusammenhang garnicht möchte. Ich muss mich in der Hauptschule auf einzelne Phänomene beschränken und diese abgeschottet betrachten.

Was ist daran das große Problem? “Da sich durch die Reibung und andere Einflüsse wie die Unebenheit der Bahn die Geschwindigkeit der Kugel mit der Zeit verringert, ist die Geschwindigkeit bei der zweiten Messstelle immer ein wenig geringer als die erste Geschwindigkeit.”, fertig, das reicht doch als Erklärung. Ich glaube nicht, dass von dir noch die Erklärung über “Energie kann nicht erschaffen oder vernichtet werden” verlangt wird.

So könnte das Programm aussehen:

#define PULLUP             0

#define AnalogSchranke1    A0
#define DigitalSchranke1   2

#define AnalogSchranke2    A1
#define DigitalSchranke2   3

bool schranke1 = true;
bool schranke2 = true;

int analog(int pin){
  #if PULLUP
    return 1023 - analogRead(pin);
  #else
    return analogRead(pin);
  #endif
}
void schranken(){
  digitalWrite(DigitalSchranke1, LOW);
  digitalWrite(DigitalSchranke2, LOW);
  
  delayMicroseconds(100);
  
  int wert1schranke1 = analog(AnalogSchranke1);
  int wert1schranke2 = analog(AnalogSchranke2);
  
  
  digitalWrite(DigitalSchranke1, HIGH);
  digitalWrite(DigitalSchranke2, HIGH);
  
  delayMicroseconds(100);
  
  int wert2schranke1 = analog(AnalogSchranke1);
  int wert2schranke2 = analog(AnalogSchranke2);
  
  int unterschied1 = wert2schranke1 - wert1schranke1;
  int unterschied2 = wert2schranke2 - wert1schranke2;
  
  if(unterschied1 < 50){
    schranke1 = false;
  }
  if(unterschied1 > 150){
    schranke1 = true;
  }
  
  if(unterschied2 < 50){
    schranke2 = false;
  }
  if(unterschied2 > 150){
    schranke2 = true;
  }
}

void setup(){
  Serial.begin(9600);
  pinMode(DigitalSchranke1, OUTPUT);
  pinMode(DigitalSchranke2, OUTPUT);
  int zeit;
  while(schranke1){
    schranken();
  }
  //uint64_t ist ein Datentyp für riesige Zahlen, denn bei
  //micros kommen sehr hohe Zahlen raus
  uint64_t aktuell = micros();
  while(!schranke1){
    schranken();
  }
  zeit = micros() - aktuell;

  Serial.println(zeit);
}

void loop(){
  //Nichts tun
}

Es werden die Daten über den seriellen monitor ausgegeben. Das setzt vorraus, dass bei AnalogSchranke1 der Pin, an dem der Sensor angeschlossen ist, und bei Digital der Pin für den Laser eingetragen ist.

Um mal eine alternative Meinung einzubringen: ich kann mir vorstellen, dass die LDRs die Aufgabe erfüllen können, wenn du dir die zeitliche Ableitung der Helligkeit anschaust. Auf die Art hab ich zwar ich nie Geschwindigkeiten gemessen aber zumindest die Reaktionsschnelligkeit deutlich verbessert.

Hi,

mal ein Ausschnitt aus einem PDF von LDRs wie sie einem Beutelweise vom freundlichen Chinesen über den Weg laufen.

Im übrigen muss man Effekte wie Reibung und sonstige Verluste nicht thematisieren, aber erwähnen schon.
In unserer Welt läuft nichts idealisiert ab.

Gruß André