Lichtschranke

Hallo,
ich brauche Hilfe. Bin ein absoluter Programmierneuling und möchte zwei Lichtschranken zur Geschwindigkeitsmessung verwenden. Ich habe die zwei Lasermodule extern mit einer Batterie an die Stromversorgung angeschlossen. Es müssen also nur zwei Photosensoren über die analoge Schittstelle ausgelesen werden. Die Zeitdifferenz zwischen den beiden Auslösungen der Lichtschranke sollen dann die Geschwindigkeit liefern. Der Abstand zwischen den beiden Sensoren beträgt 1m. Der Wert den der Sensor mit Licht liefert ist ca. 1023 und ohne Licht etwa 985.
Diesen Code habe ich mit meinem kaum Vorhandenem Wissen über Programmierung zusammengeschustert und er funktioniert nicht. Der Timer wird nicht ausgelöst. Habe mir auch schon mal die sensorValue jeweils anzeigen lassen um zu sehen ob es an der Hardware lag. Die funktioniert aber. Was muss ich anders machen?
Bin für jeden Hinweis dankbar, da ich ca. 100 verschiede Tutorials nun durchgelesen habe und immer noch nicht weiß was der Grund ist.

int sensorPin1= 0;
 int sensorValue1= 0;
 int sensorPin2= 1;
 int sensorValue2= 0;
 long startzeit= 0;
 long dauer= 0;
 long endzeit= 0;
 float spd = 0;
 
 
void setup() {
 Serial.begin(9600);
 pinMode(sensorPin1,INPUT);
 pinMode(sensorPin2,INPUT);
 Serial.println("YourSpeed");
 
}
long messen(){
 sensorValue1=analogRead(sensorPin1); //Auslesen der Sensoren
 sensorValue2=analogRead(sensorPin2);
 if (sensorValue1 < 1000){
     startzeit= micros(); //Wenn 1 unterbrochen wird startzeit gespeichert

   }
     
 if(sensorValue2 < 1000){
       endzeit= micros(); //wenn 2 unterbrochen wird stopzeit gespeichert
 }
 dauer=endzeit-startzeit; //zeitdifferenz
 if (dauer!=0){
   spd=(1/(dauer*10^6))*3,6; //speed in km/h
 }
  return spd;
}
void loop(){
 messen();
 if (spd!=0){
   Serial.println(spd);
 }
  
  
}

Versuche mal die Formel richtig zu schreiben:

    spd=(1e6/dauer)*3.6; //speed in km/h

Die Analog-Eingänge müssen nicht per pinMode() gesetzt werden, ein analogRead() reicht. Verwende die Namen der Pins (A0, A1), nicht die Nummern, damit der Code für alle Plattformen funktioniert.

Habe mir auch schon mal die sensorValue jeweils anzeigen lassen um zu sehen ob es an der Hardware lag. Die funktioniert aber. Was muss ich anders machen?

Wenn Du die Werte ausgegeben hast und wirklich welche unter 1000 bekommen hast, dann sollte Dir ein Speed angezeigt werden, auch wenn der völlig falsch ist. Welche Ausgabe hast Du denn bekommen?

Vielen lieben Dank schon mal. Mit deinen Tips kommen nun zumindest schon mal Werte für die Geschwindigkeit raus. Allerdings spuckt er unzählige Geschwindigkeiten aus. Ich will aber sich nur eine! Wie kann man das lösen?
Die werte für die sensoren schwanken an/aus nur zwischen 1023 und ca 1009. Das wundert mich auch. Habe aber einfach durch ausprobieren den code angepasst. Woran könnte das liegen, dass es nicht stärker schwankt. Habe auch schon mit diversen Widerständen versucht das etwas zu beeinflussen, hat nicht funktioniert

Welchen Sensor hast Du denn in Deinen Lichtschranken? LDR sind recht langsam, dafür aber (großflächig) einfach mit einem Laser zu treffen. Ein Lichtpunkt auf einer großen Fläche ändert den Widerstand nur wenig. Photodioden oder -transistoren sind schneller. Du kannst versuchen, Fremdlicht durch eine Blende (Röhrchen...) vom Sensor abzuhalten, um einen größeren Spannungshub zu erreichen.

nana_lin:
Vielen lieben Dank schon mal. Mit deinen Tips kommen nun zumindest schon mal Werte für die Geschwindigkeit raus. Allerdings spuckt er unzählige Geschwindigkeiten aus. Ich will aber sich nur eine! Wie kann man das lösen?
Die werte für die sensoren schwanken an/aus nur zwischen 1023 und ca 1009. Das wundert mich auch. Habe aber einfach durch ausprobieren den code angepasst. Woran könnte das liegen, dass es nicht stärker schwankt. Habe auch schon mit diversen Widerständen versucht das etwas zu beeinflussen, hat nicht funktioniert

Das bedeutet dann wohl du bekommst in der Ausgabe eine ganze Liste mit Geschwindigkeiten ?
Und du willst aber das er dir nur eine ausgibt ?
Verstehe ich das richtig ?

Es sind LDR sensoren. Eine Blende habe ich bereits drumrum gebastelt, aber vielleicht muss ich dann umsteigen auf andere sensoren. HAbe dann aber Angst nicht mehr zu treffen mit dem Laser. Das ist jetzt schon schwierig. Möchte die Schranken verwenden um meine Geschwindigkeit beim sprinten zu messen. Dh licht und sensor müssen auch ca 1m auseinander stehen. Gibt es Lichtquellen/sensoren, die allgemein für diesen Zweck weniger fehleranfällig sind?

Ja es wird eine ganze Liste mit Geschwindigkeiten ausgespuckt.

Mit einer IR Fernsteuerung muß man kaum noch zielen, und die Auflösung sollte für Deine Zwecke ausreichend sein.

nana_lin:
Ja es wird eine ganze Liste mit Geschwindigkeiten ausgespuckt.

Dann darfst du deine Abfrage keine weiteren Male durchlaufen, ein "return" könnte helfen.

nana_lin:
Hallo,
ich brauche Hilfe. Bin ein absoluter Programmierneuling und möchte zwei Lichtschranken zur Geschwindigkeitsmessung verwenden. Ich habe die zwei Lasermodule extern mit einer Batterie an die Stromversorgung angeschlossen. Es müssen also nur zwei Photosensoren über die analoge Schittstelle ausgelesen werden. Die Zeitdifferenz zwischen den beiden Auslösungen der Lichtschranke sollen dann die Geschwindigkeit liefern. Der Abstand zwischen den beiden Sensoren beträgt 1m. Der Wert den der Sensor mit Licht liefert ist ca. 1023 und ohne Licht etwa 985.
Diesen Code habe ich mit meinem kaum Vorhandenem Wissen über Programmierung zusammengeschustert und er funktioniert nicht. Der Timer wird nicht ausgelöst. Habe mir auch schon mal die sensorValue jeweils anzeigen lassen um zu sehen ob es an der Hardware lag. Die funktioniert aber. Was muss ich anders machen?

......Bin für jeden Hinweis dankbar, da ich ca. 100 verschiede Tutorials nun durchgelesen habe und immer noch nicht weiß was der Grund ist.

Na dann auf zur 101.

  1. Lichtschranke mit LDR geht nicht bei einer Zeitnehmung - der LDR ist zu träge.
  2. Lichtschranke mit readanalog geht nicht da analogread selbst schon langsam ist.
  3. LDR darf nicht auf einen festen Grenzwert programmiert sein sondern auf die Änderung der Helligkeit - egal mit einem LDR wird das nichts.

Wie lange ist der Lichtschranken unterbrochen - also wie schnell bist du und wie dick ist dein Bein ?
Das kannst du nur mit einem Lichtschranke mit einem Phototransistor erfassen.

In dem Fall ist es eine Überlegung wert 2 Lichtschrankenbausätze zu kaufen (idealerweise Reflektorlichtschranken).

Dann kannst du dich an die Software machen. Deine Software wird auch noch andere Dinge erledigen sollen z.B. ein Display ansteuern. D.h. deine Software muss so geschrieben sein, dass die Unterbrechung des LS sicher erkannt wird.
Für dich bedeutet das dich mit den Interupt Funktionen zu beschäftigen (und "delay" ist was böses)

LG
Viktor

nana_lin:
Ja es wird eine ganze Liste mit Geschwindigkeiten ausgespuckt.

Versuche mal dies (bezogen auf das Programm in #0):

void loop(){
 messen();
 if (spd!=0){
   Serial.println(spd);
   spd = 0;
 }
}