Wat Klaas vertelde is de eenvoudigste manier, een lichtsluis A en een B, afstand is bekend, de tijd wordt dan vastgelegd en in Excel de omrekening van snelheid.Het enigste verschil dat ik doe is dat ik met IR reflectie werkt, en het rekenwerk laat doen door een microcontroller, geeft dan gelijk op een display de snelheid weer.
En of je nu lichtsluizen, IR reflectie, LDR's, stroomdetectie of drukknoppen gebruikt maakt in de basis ook niet uit. Je hebt gewoon twee inputs nodig die aangeven of de trein bij punt A of punt B is om de tijdmeting te kunnen starten/stoppen.
Stroom detectie ben je afhankelijk van blokken en je moet digitaal rijden, dus niet bruikbaar voor analoge rijders.
/*****************************************************************************test versie: Speedometer met LDR's*****************************************************************************/// libraries#include <Wire.h> #include "Adafruit_LEDBackpack.h"#include "Adafruit_GFX.h"Adafruit_7segment display = Adafruit_7segment();const int LDRleft = A0; // LDR leftconst int LDRright = A1; // LDR right const int Overflow = 10000;unsigned long curTime = 0;unsigned long preTime = 0;unsigned long runTime = 0;// speedometerbool timerRuns = false;bool fromLeft = false;bool fromRight = false;bool calcReady = false;int valLeft = 0; int valRight = 0; int refLight = 511; // 0 is geheel bedekt, 1023 is vol verlichtfloat distance = 98; // afstand tussen LDR's in mm.float scaleSpeed = 0; // in schaal km/h.// display schaalsnelheidunsigned long showTime = 5000; // tijd snelheid zichtbaar in msunsigned long showStart = 0;/****************************************************************************/void setup() { // set display display.begin(0x70); display.setBrightness(7); // 0..15 display.writeDisplay(); calibrateSpeedometer(); showStart = millis(); } // end setup/****************************************************************************/void loop() { speedometer(); displaySpeed(); } // end loop/****************************************************************************/void calibrateSpeedometer() { // check the light... valLeft = analogRead(LDRleft); valRight = analogRead(LDRright); refLight = (valLeft + valRight) / 4; // helft van gemiddelde display.println(refLight); display.writeDisplay(); delay(2500); display.println(Overflow); // display "----" display.writeDisplay(); }/****************************************************************************/void speedometer() { if (calcReady) return; // als berekening klaar is rest overslaan. valLeft = analogRead(LDRleft); valRight = analogRead(LDRright); if (!timerRuns) { // nog geen meting if (valLeft < refLight || valRight < refLight) { // links of rechts bezet? timerRuns = true; // meting loopt preTime = millis(); runTime = 0; if (valLeft < refLight) fromLeft = true; if (valRight < refLight) fromRight = true; } } else { // als de meting loopt... curTime = millis(); runTime = curTime - preTime; if (fromLeft && (valRight < refLight) || fromRight && (valLeft < refLight)) { // meting ten einde // bereken schaal snelheid scaleSpeed = ((distance * 3600) / runTime / 1000) * 87; calcReady = true; timerRuns = false; fromLeft = false; fromRight = false; showStart = millis(); } }}/****************************************************************************/void displaySpeed() { unsigned long timeNow = millis(); if (timerRuns) { // als snelheidsmeting gaande is... if ((runTime / 100) % 2) { // knipperen display display.println(Overflow); // display "----" } else display.clear(); // display " " } else { if (calcReady) { // als snelheidsmeting klaar is... if ((timeNow - showTime) < showStart) { display.print(scaleSpeed, 1); // display gemeten snelheid in km/h } else { calcReady = false; showStart = timeNow; display.println(Overflow); // display "----" } } } display.writeDisplay();}/****************************************************************************/