/*****************************************************************************test versie: Speedometer tbv Peter*****************************************************************************/// 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 uit, 1023 is aanfloat distance = 98; // afstand tussen meetpunten 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(); showStart = millis(); } // end setup/****************************************************************************/void loop() { speedometer(); displaySpeed(); } // end loop/****************************************************************************/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();}/****************************************************************************/
Dus inderdaad zoals je aangeeft:A0 en A1 beide geen spanning: geen trein/bezetmelding in beide secties;A0 gaat hoog: de trein rijdt de sectie binnen, dus start meting;A1 gaat hoog: de trein verlaat deze sectie en gaat de volgende sectie binnen: stop meting.Hoe lang A0 of A1 hoog blijven is m.i. niet belangrijk. Als er een heeeeele lang trein in dat blok rijdt (die heb ik overigens niet) kan in theorie zowel A0 alsook A1 hoog zijn.Maar een gegeven moment is de trein beide blokken uit en zijn beide melders dus weer laag en kan een nieuwe meting beginnen.
De regel:scaleSpeed = ((distance * 3600) / runTime / 1000) * 87;is voor Peter volledig valide. Voor een modelspoorder is het handiger als de 87 een constante wordt.Ik als N rijder kan hier dan 160 invullen, die dan automatisch via compileren goed gezet wordt.
Vraag van een niet Arduino bezitter:Doet analogRead(A0) een digitale read?
Ik zal de variabele 'distance' aanpassen aan mijn situatie, nl. 3660 mm.En als ik de weerstanden aanbreng en de verbinding van de BDL naar de Arduino, zou het moeten werken?
Doet analogRead(A0) een digitale read?