Zeitmessung mit Lichtschranke

Hallo Jungs,
ich möchte gern eine Zeitmessung mittels einer Lichtschranke verwirklichen.
Lichtschranke funktioniert, ich kann den analogen Wert der Photodiode auslesen.
Zeitmessung über einen Taster hab ich ich schon hinbekommen.
Nur beides zusammen, START wenn die Lichtschranke durchbrochen wird und STOP wenn die Lichtschranke wieder durchbrochen wird funktioniert irgendwie nicht.
START geht irgendwie, nur STOP und die Anzeige wie lang ich gebraucht habe funktioniert nicht.
Der Schaltwert der Photodiode beträgt 70, spielt aber glaub ich keine Rolle.

Ich habe hier mal meinen bisherigen CODE, könnte mal jemand drüberschauen und mir Hilfe anbieten!

//Lichtschranken-Zeitmessung

int LEDrot=5; //Led wenn Lichtschranke nicht durchbrochen
int LEDblau=6; //Led wenn Lichtschranke durchbrochen
int LEDsender=7; //IR Led
int LEDempf=0; //Analoger Eingang der Photodiode
int val=0; //Messdaten
long start;
float dauer;
float zeit;

void setup() {
Serial.begin(9600);
pinMode(LEDrot, OUTPUT);
pinMode(LEDblau, OUTPUT);
pinMode(LEDsender, OUTPUT);
pinMode(LEDempf, INPUT);
digitalWrite(LEDsender,HIGH); //einschalten der IR Diode
Serial.println("Serial-Monitor ist bereit");
}

void loop() {
val=analogRead(LEDempf); //Photodiode auslesen
if(analogRead(val)<70) {
  Serial.println("Start der Rundenmessung Messung");
  digitalWrite(LEDblau, HIGH);
  digitalWrite(LEDrot, LOW);  
  start = millis();
  while(val<70) {
    1;

}
     dauer = millis() - start;
     zeit = dauer/1000;
     Serial.println("Ende der Runden Messung");
     Serial.print("Deine Rundenzeit betrug genau ");
     Serial.print(zeit,2);
     Serial.print(" Sekunden");
    
  }
  else
  {
digitalWrite(LEDblau, LOW);
digitalWrite(LEDrot, HIGH);
}
{ Serial.println(val); //Photodiode AnalogWert zum Serial Monitor senden
delay(150); 
}
}

Im Moment lese ich alles nur am Serial-Monitor ab, bis alles funktioniert.
Die LED`s sind nur zur Information, ob die Lichtschranke geschalten hat, die haben sonst keinen weiteren Einfluss.

 while(val<70) {
    1;
}

Das ist eine Endlosschleife, sobald die Bedingung erfüllt ist.
Denn das Ergebnis (val<70) ändert sich innerhalb der Schleife niemals mehr, so daß gilt: Einmal erfüllt, immer erfüllt.

Zuerstmal würde ich keine Fotodode verwenden sondern einen Fototransistor oder wennschon eine Fotodiode und einen Komparator um ein digitales Signal zu erhalten.

Dann würde ich den start und stop auf Flanken (Zustandsänderung des digitalen Eingangs) triggern. Dazu brauchst Du eine Statusvariable.

byte status =0;
byte lichtschranke;
byte messung =0;
...
setup: pinMode(lichtschranke, Eingang)
...
loop:

if (digitalread(lichtschranke)==1 && status ==0&& messung ==0) //Lichtschranke unterbrochen, Zeitmessung läuft nicht; START
{
millis() abspeichern
messung =1;
status =1; //Lichtschranke unterbrochen
}
if (digitalread(lichtschranke)==1 && status ==0&& messung ==1) //Lichtschranke unterbrochen, Zeitmessung läuft; STOP
{
Differenz abgespeicherte millis und aktuelle millis()
messung =0;
status =1; //Lichtschranke unterbrochen
}
if (digitalread(lichtschranke)==0 && status ==1) //Lichtschranke wird wieder geöffnet
{
status =0; //Lichtschranke offen
}

Grüße Uwe

Das mit analogRead() zu machen ist nicht so toll, da eine Messung ca. 125µs dauert und man ständig messen muss. Es geht vielleicht, aber besser ist wie gesagt ein Komparator oder ein Schwellenwert-Schalter.

Der UNO hat auch einen internen Komparator, den man dafür verwenden kann wenn man nur eine Lichtschranke hat: http://www.gammon.com.au/forum/?id=11916 http://www.leonardomiliani.com/2012/analogcomp-una-libreria-per-gestire-il-comparatore-analogico/?lang=en

Hallo, welche Komponenten genau verwendest du ? (Lichtquelle, Fotodiode) Wie liest du die Fotodiode analog ein? (Schaltung) Wie groß ist der Unterschied im Messwert zwischen hell und dunkel? Vielleicht kann man mit den gegebenen Mitteln optimieren. Ein Transistor zusätzlich wäre nicht schlecht - Fotodiode + Transistor = Fototransistor, und damit mehr Signal evtl direkt zur digitalen Ansteuerung über Interrupt. Gruß Reinhard

Danke für die vielen Antworten in der kurzen Zeit.

Ich habe nur Bauteile verwendet die ich im Moment auch zu Hause hatte. Das eine Fotodiode nicht so toll für dieses Projekt ist, hab ich nicht gewusst. Ich konnte aber mittels meiner Fotodiode auch LED`s an und ausschalten.

Mir ist schon klar das eine digitale Version besser ist. Ich schau mich mal nach einem Transistor um. Also ist ja ein Transistor nur ein normaler Schalter "AN-AUS" den man per Lichteinfall schalten kann?

Lies dir mal das durch: http://www.mikrocontroller.net/articles/Lichtsensor_/_Helligkeitssensor

Fotodioden sind schneller als Fototransistoren, aber komplizierter zu handhaben. Vor allem wenn man wirklich das Maximum herausholen will. Außerdem brauchst du bei dieser Anwendung nicht die Geschwindigkeit. Der Fotostrom ist sehr gering, deshalb braucht man einen sehr hohen Arbeitswiderstand wenn man sie nur mit einem Vorwiderstand betreibt (das sieht man bei dir auch da 70 * 4,88mV ~ 480mV). Außerdem sind sie dann auch nicht besser als Fototransistoren was die Grenzfrequenz betrifft. Das ist hier aber irrelevant, da das alles im ms-Bereich abläuft.

Fototransistoren sind da der ideale Kompromiss aus Geschwindigkeit und einfacher Handhabung. Es sind allerdings immer noch analoge Bauteile! Also entweder man schaltet noch ein IC dazwischen, oder man verlässt sich auf die Hysterese der µC-Eingänge. Das geht vielleicht auch. Der Controller erkennt ab einem bestimmten Wert Low und ab einem anderen Wert High.Dazwischen wird der alte Zustand behalten. Mit einem Komparator hat man aber volle Kontrolle über die Schaltschwelle. z.B. so: http://microcontroller.circuitlab.org/2012/11/control-basic-phototransistor-detector.html http://3.bp.blogspot.com/_Z-vTfpcyEAE/TGq_xrH0ndI/AAAAAAAAAGI/QHEOV_i1e4A/s400/5.JPG