richting bepalen aan de hand van 2 tijdcodes

beste iedereen,

ik wil aan de hand van 2 contacten de richting van een trein kunnen bepalen:

dit zijn de tijdcodes van de contacten, op het moment dat het contact geactiveerd wordt schrijf ik Millis() weg in een array

Contact A:

7860,9362,9397,9398,10809,11998,12091,13137,14285,15427,16508,17517,18447,19499,19527,20435,21305,22195,22213,23157,24092,24111,25000,25018,25894,26737,27579,27595,27595,28430,29325,30161,31027,31045,31887,32698,33538,34500,34501,35313,35315,35328,36116,36993,37895,38659,39497,40268

Contact B:

7907,9498,10910,12063,13209,14355,15480,16558,17575,18505,19572,20489,21356,22242,23212,24148,25049,25948,26790,27630,28478,29373,30212,31075,31931,32742,33588,34547,35352,36182,37009,37980,38706,39544,40311,

op het moment kan ik alleen zien dat er een trein langs komt, en ik kan hier de snelheid van bepalen( door de lengte van het signaal te meten en te verrekenen met de lengte van het contact)

ik een perfecte situatie zou het gewoon array 1 - array 2 zijn, en kijken of de uitkomst positief of negatief is, maar in de praktijk mis ik wel eens een signaal, en zou dit dus niet gaan werken

in feite wil ik hetzelfde als het systeem wat ze gebruiken om autos mee te tellen, met 2 van die rubberen slangen over de weg( ik heb hier naar zitten zoeken, hier worden ook de tijdcodes opgeslagen, en het rekenwerk wordt achteraf gedaan, ik wil het realtime)

en hier is de code zoals ik hem nu gebruik:

void rc() {

  rcAval = digitalRead(rcA) ;
  rcBval = digitalRead(rcB) ;


  if (rcAval == 0  ) {

    if ( veiligO !=  veilig && SC == 0) {
      veiligO =  veilig;
      SC = 1 ;
    }
    T60000=millis();
    veilig = 0;
    if (WL==0){
      veiligL=0;
    }
    else if (WR==0){
      veiligR=0;      
    }


    if (rcAlast == 1 && rcAi <200) {
      rcAlast = 0 ;
      rcAtime = millis();
      if (rcAarr[rcAi] > 3){
        rcAi = rcAi + 1 ;
        assen = assen + 1 ;
      }     
    }
  }

  else if (rcAval == 1 && rcAlast == 0 ) {
    rcAlast = 1 ;
    rcAarr[rcAi] = rcAtime;
    float rcAs = (40.0/(float)(millis()-rcAarr[rcAi]));
    Serial.print("rcA m/sec: ");
    Serial.print(rcAs);
    Serial.print("  as nr: ");
    Serial.println(rcAi);

  }


  if (rcBval == 0  ) {

    if ( veiligO !=  veilig && SC == 0) {
      veiligO =  veilig;
      SC = 1 ;


    }
    T60000=millis();
    veilig = 0;
    if (WL==0){
      veiligL=0;
    }
    else if (WR==0){
      veiligR=0;      
    }


    if (rcBlast == 1 && rcBi <200) {
      rcBlast = 0 ;
      rcBtime = millis();
      if (rcBarr[rcBi] > 3){      
        rcBi = rcBi + 1 ;
        assen = assen + 1 ;
      }     
    }
  }

  else if (rcBval == 1 && rcBlast == 0 ) {
    rcBlast = 1 ;
    rcBarr[rcBi] = rcBtime;
    float rcBs = (40.0/(float)(millis()-rcBarr[rcBi]));
    Serial.print("rcB m/sec: ");
    Serial.print(rcBs);
    Serial.print("  as nr: ");
    Serial.println(rcBi);

  }


  if (veilig == 1 ) {
    rcAi = 0;
    rcBi = 0;
    assen = 0 ;
  }


}

Zodra een van de contacten aangaat kun je toch een timer starten? Daarna wacht je op de 2e totdat de tijd langer is dan in feite is toegestaan (timeout). Op dat moment is het een waardeloze meting omdat je de eerste cq de 2e heb gemist.

Daarnaast zou ik als tip commentaar toevoegen van de verschillende stappen. Het nodigt anderen niet uit om door de code te spitten (mij in ieder geval niet). Immers ik (wij) kennen jouw gedachtegang niet.

ik heb het even geprobeerd, en het werkt betrouwbaarder als dat ik gedacht had...
voor nu werkt het zo goed genoeg, bedankt voor de tip

op het moment ben ik bezig om de code werkend te krijgen, maar alles is nogal omslachtig en kan naar mijn idee simpeler ( door middel van library's enzo)
ik ga de code binnenkort opnieuw schrijven, en dan zal ik overal commentaar aan toevoegen :wink:

Het gebruik van functies en variabelen met eenduidige namen helpen vaak meer dan commentaar toevoegen.

Ook het gebruik van datatypes kan helpen. Ik denk hier met name aan het type boolean welke twee waarden kan hebben true en false.

if (veilig == 1) wordt dan if (veilig)

bedankt voor de tip,

ik probeer inderdaad om de namen van variabelen zo duidelijk mogelijk te houden,
op elke regel commentaar wordt er echt niet duidelijker van...

Ik heb voor mijzelf na zo'n 40 jaar ontwikkelen een manier waarop ik vind dat een programma een verhaal moet vertellen. De code is de invulling van het verhaal. In feite draai ik het om. Daarbij ook nog een sterke nadruk geven op orde en netheid (tot en met de = tekens onder elkaar). Daar mag je uiteraard alles van vinden. Het werkt voor mij perfect en de mensen die het jaren daarna mogen onderhouden zijn er erg blij mee. Ze snappen gelijk hoe het werkt.

die rubber slangen zijn alleen tellers, en kunnen geen snelheid signaal geven. (daar is het ook geen probleem om een puls te missen)

voor de snelheid van je treintje, hoef je alleen de eerste aanpuls op te slaan, en dan wachten tot de trein voorbij is. als je per ongeluk een pulsje mist in de trein dan heb je een probleem omdat de array dan niet meer klopt.
Met een ultrasound afstandsmeting heb je aan een sensor genoeg, twee keer meten en je weet de snelheid en de richting.
Je kunt wel preciezer meten door micros te gebruiken.