Lasergetriggerte Rundenzeit-GLCD-Anzeige von Slotcars
Komponenten und Verbrauchsmaterialien
![]() |
| × | 1 | |||
| × | 1 |
Apps und Onlinedienste
![]() |
|
Über dieses Projekt
Einführung
Ich kaufte ein Paar KY008-Lasermodul und einen passenden Sensor und wusste, dass ich damit ein cooles Projekt machen musste. Also haben die beiden ein elektrisches Zeitmesstor für die Slotcar-Strecke geschaffen, das bereits für mein selbstfahrendes Slotcar-Projekt auf dem Tisch lag.
Die Hardware
Die 3 Hauptkomponenten sind das Lasermodul, der Laserempfängersensor und der GLCD-Bildschirm.
Ich benutze GLCD sehr gerne, Infos zur Pinbelegung findest du hier:https://playground.arduino.cc/Code/GLCDks0108/
Und Sie können die Bibliothek hier herunterladen:
https://bitbucket.org/bperrybap/openglcd
Ich habe dafür einen schönen und einfachen Anschluss erstellt, wie im Bild unten gezeigt.

Das KY008 Lasermodul hat 3 Pins, -, + und S, ich kürze einfach sowohl das S als auch das + auf die 5V. Wenn Sie nicht möchten, dass der Laser die ganze Zeit eingeschaltet ist, verbinden Sie den S-Pin mit einem digitalen Pin des Arduino. Immer wenn Sie ihn hoch einstellen, schaltet sich der Laser ein.
Der Sensor hat auch 3 Pins, GND, VCC und SIGNALE. Verbinden Sie sich mit der Stromversorgung und dem Eingangspin des Arduino.
Die schwierigste Herausforderung in diesem Build bestand darin, alles in Einklang zu bringen.

Das Endergebnis könnt ihr euch in diesem Clip anschauen.
Code
- Unbenannte Datei
Unbenannte DateiArduino
/** Zeitmessung digitales Tor* Code von:Tal Ofer* [email protected]*/#include "openGLCD.h"// laps infounsigned long currentRunStartMillis;unsigned long lastRunInMillis;unsigned long bestRunInMillis;int currentLap;unsigned lang gespeichertMillis;gText t1; // definiert die Laufzeit latergText t2; // wird die Laufzeit definieren latergText t3; // wird die Laufzeit später definieren // global für displayint sec_val, milli_val; // Lasergate const int gateSensorPin =2; // die Nummer des Torsensors pinint gateSensorState; // der aktuelle Messwert vom Sensorint lastgateSensorState =LOW; // der vorherige Messwert von sensorunsigned long lastDebounceTime =0; // das letzte Mal, als der Sensorstift toggledint debounceDelay =50 war; // die Entprellzeit; erhöhen, wenn der Ausgang flickersvoid setup () {// Pin-Modus PinMode (gateSensorPin, INPUT); Verzögerung (50); // zu spät der Sensor und der Laser arbeiten, damit wir die Runde nicht auslösen. // GLCD starten GLCD.Init(NON_INVERTED); // Bereiche definieren t1.DefineArea(textAreaTOP, lcdnums14x24); t2.DefineArea(0, GLCD.CenterY, 8, 2, feste Nums7x15); t3.DefineArea(GLCD.CenterX, GLCD.CenterY, 8, 2, feste Nums7x15); t3.SetFontColor(WEISS); // Schriftfarbe setzen t3.ClearArea(); // Text ausgeben GLCD.SelectFont(System5x7); GLCD.CursorTo(1, 4); GLCD.print("LAST"); GLCD.CursorTo(11, 4); GLCD.print("BEST"); // Parameter zurücksetzen currentRunStartMillis =0; lastRunInMillis =0; bestRunInMillis =0; currentLap =0;}void loop () {// den Zustand des Lasersensors lesen:int reading =digitalRead (gateSensorPin); // Wenn sich der Schalter aufgrund von Rauschen oder Drücken geändert hat:if (reading !=lastgateSensorState) { // Zurücksetzen des Entprell-Timers lastDebounceTime =millis (); aufrechtzuerhalten. // Ende if // wenn die Entprellzeit passiert if ((millis() - lastDebounceTime)> debounceDelay) { if (reading!=gateSensorState) { gateSensorState =Reading; // Wenn wir niedrig gingen, bedeutete dies, dass der Strahl unterbrochen wurde if (gateSensorState ==LOW) { // Speichern Sie die Millis, damit die gesamte Mathematik mit dem gleichen Wert durchgeführt wird. gespeichertMillis =millis(); // wenn es nicht die erste Runde ist if (currentLap> 0) { // den letzten Lauf speichern lastRunInMillis =savedMillis - currentRunStartMillis; // wenn die letzte Ausführung schneller ist als die beste Ausführung if (lastRunInMillis0) { calcResultFromMillis(savedMillis - currentRunStartMillis, &sec_val, &milli_val); } else { calcResultFromMillis(0, &sec_val, &milli_val); } // Ende if // AKTUELLER LAUF t1.CursorTo(3, 0); // Spalte &Zeile ist relativ zum Textbereich t1.Printf(F("%02d.%03d"), sec_val, milli_val); // LETZTER RUN calcResultFromMillis(lastRunInMillis, &sec_val, &milli_val); t2.CursorTo(1, 1); // Spalte &Zeile ist relativ zum Textbereich t2.Printf(F("%02d.%03d"), sec_val, milli_val); // BESTER RUN calcResultFromMillis(bestRunInMillis, &sec_val, &milli_val); t3.CursorTo(1, 1); t3.Printf(F("%02d.%03d"), sec_val, milli_val);} //wnd loop// berechne Millis in 2 Werte, Sekunden und Millis für displayvoid calcResultFromMillis(unsigned long value, int *sec_val, int * milli_val) { *sec_val =int (Wert / 1000); *milli_val =Wert - *sec_val * 1000;}
Herstellungsprozess