Doel:€250.00
Donaties:€177.50

Per saldo:€-72.50

Steun ons nu!

Laatst bijgewerkt
op 16-06-2021
Algemeen

De stichting

Recente berichten

Onlangs gespot - gefotografeerd, de foto's door raymond erdtsieck
Vandaag om 00:24:35
Mijn eerste H0-modeltreinbaan in aanbouw door Wim Vink
Vandaag om 00:20:04
Hoe ziet de ultieme handregelaar er uit? door Lolke Bijlsma
Vandaag om 00:13:56
Schorumdijk Gem. Vaagburg 1940-1960. (Jaren ‘40-‘60 baan met haventje) door Aford
Vandaag om 00:02:13
BMB 00-Modulebaan, BMB-Rijdagen en BMB-Deelname aan Beurzen & Evenementen door nighttrain1
24 juli 2021, 23:45:12
The Intercontinental Railroad Company door clickmaniac
24 juli 2021, 23:27:48
Toon hier je nieuwe (model-) spooraanwinst(en)... door MarkSpoor
24 juli 2021, 23:23:18
Van Swarzach naar Swarzburg door MOVisser
24 juli 2021, 23:16:05
Kortsluiting wissel en vaste kruising door Klaas Zondervan
24 juli 2021, 23:05:01
Prijsdifferentiatie in Oostenrijk door Thom
24 juli 2021, 22:49:03
DR5000 centrale, update software 1.6.0. Nu update 1.6.1, per 19 juli 2021 door Hans van de Burgt
24 juli 2021, 22:02:06
BNLS-Module: "Rvbr-Btk, Ringvaartbrug Haarlemmermeer nabij Buitenkaag" NS H0 door Marcel112
24 juli 2021, 21:46:19
Raadplaatje door dennie
24 juli 2021, 21:14:05
Show je werkplek door Tomasso
24 juli 2021, 20:44:21
Kranenberg, een exercitie in code 70 door Tomasso
24 juli 2021, 20:41:01
Line-up foto's van modellen door ceuleer
24 juli 2021, 19:28:06
NS wil slaaptrein samen met Oostenrijkers nieuw leven inblazen door R v/d Hoven
24 juli 2021, 19:05:21
GVBA 396 messing model door skiptram
24 juli 2021, 18:17:07
NCS 7/8 tot NS 61 62 Maffei lok in spoor 0 door Dave.......
24 juli 2021, 17:22:31
NS 5500 / HSM 700 spoor 0 / 1 door Eric B
24 juli 2021, 17:07:03
Fleischmann oude naar nieuwe antislipband nummers door VictorPM
24 juli 2021, 16:53:48
The revival of "The Shop"! door Ronald Halma
24 juli 2021, 16:31:16
Draaischijf Spoor 0 (werkend onder iTrain) door peterha
24 juli 2021, 16:04:41
Modeltreinverzameling en waterschade door bosje77
24 juli 2021, 15:59:03
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
24 juli 2021, 15:17:25
Albert's fantasie in schaal 0e door Scratchbuilt
24 juli 2021, 14:42:17
Werkplaats - (Baanplan H0) door martijnhaman
24 juli 2021, 14:36:25
Nederdam, H0 1970 - 1990 door Pascal77
24 juli 2021, 12:39:46
"Litter Bin" voor Brits spoor en Britse modelspoorprojecten door Hans van de Burgt
24 juli 2021, 11:44:57
Wie is Hans Reints door BartvD
24 juli 2021, 09:46:12
  

Auteur Topic: Pret met Arduino  (gelezen 37947 keer)

Timo

  • Team encyclopedie
  • Offline Offline
  • Berichten: 4656
Re: Pret met Arduino
« Reactie #150 Gepost op: 17 september 2019, 12:41:02 »
Hoi Ad,

Leuk is dat hè!  ;D

En ik kijk weer even naar de error, doet me toch geloven dat je niet de goede driver hebt.

Klein stappenplan dat je even zou kunnen doen:
- Laat de Nano even los
- Open "Device manager" (apparaatbeheer)
- Vouw "Ports (COM & LPT)" (Poorten) uit (als je deze hebt)
- Verbind de Nano, onder "Ports" moet er nu een (extra) apparaat verschijnen
- Is dat COM9?
- Open dan de Properties (Eigenschappen)
- Ga naar tabblad Driver
- Plaats daarvan een screenshotje hier (tip, gebruik Windows Snipping Tool)


Timo
Verzonden vanaf mijn desktop met Firefox

Ad Cleijsen

  • Offline Offline
  • Berichten: 658
Re: Pret met Arduino
« Reactie #151 Gepost op: 17 september 2019, 21:10:19 »
Timo,

Ick vermaeck me kostelyck. Lering ende vermaeck.
Al het commentaar gegeven sla ik over en met de adviezen puzzel ik verder. In ieder geval, langzaam maar wel vooruit. Ben aan video 3 begonnen.

Zoals het er nu uit ziet ga ik met het volste vertrouwen verder. Stapjes vooruit, stapje terug. Prima toch.

Groet Ad

RudyB

  • Offline Offline
  • Berichten: 550
  • EMV
    • RudysModelRailway
Pret met Arduino 40 Station Platform Departure Display with Analog Clock
« Reactie #152 Gepost op: 23 september 2019, 11:39:19 »
In de vorige video hebben we een OLED display aangestuurd en een tekst en wat lijnen getoond. Die zelfde functies gebruiken we in deze video om een NS vertrekbord na te bootsen, waarbij het leuke is dat er een echt werkende analoge klok op zit.

Veschillende vertrekberichten kunnen getoond worden, afhankelijk van digitale inputs, die via een drukknop binnen kunnen komen, of via een DCC decoder.

De klok loopt hier nog op een random tijd, hiervoor is alleen een Arduino en een OLED nodig. In de volgende video voegen we een Real Time Clock module toe zodat ie de werkelijke tijd aangeeft.

Link naar Fun with Arduino 40 Station Platform Departure Display with Analog Clock




Reinout van Rees

  • Team forummoderators
  • Offline Offline
  • Berichten: 6158
  • Forummoderator
    • Persoonlijke website + weblog
Re: Pret met Arduino
« Reactie #153 Gepost op: 17 november 2019, 22:52:02 »
Ik heb een paar mardec-vragen naar het mardec draadje verplaatst.
De vragen daaromtrent horen hier niet thuis, want dit gaat over Rudy's leuke video's.

Reinout-als-moderator
« Laatst bewerkt op: 17 november 2019, 23:07:02 door Reinout van Rees »
Bouw v/d EifelBurgenBahn (h0, zijlijn in de Eifel)
Eifelgeschiedenis (verhalen en video's over de Eifelburgenbahn)

Ad Cleijsen

  • Offline Offline
  • Berichten: 658
Re: Pret met Arduino
« Reactie #154 Gepost op: 29 december 2019, 17:47:37 »
Hoi Rudy, Nico,

Even uit geweest, wat dingen die ik niet begreep en twijfel. Afgelopen week weer gestart en huppekee, I'm on track. Loopt en gaat vooruit.
Nico bedankt voor de uitleg
Rudy bedankt voor de filmpjes.

Groeten Ad
« Laatst bewerkt op: 30 december 2019, 18:52:39 door Ad Cleijsen »

RudyB

  • Offline Offline
  • Berichten: 550
  • EMV
    • RudysModelRailway
Pret met Arduino 41 Real Time Clock DS1307
« Reactie #155 Gepost op: 24 februari 2020, 12:06:06 »
De stationsklok van de vorige video loopt, maar hij start op een random tijd. We kunnen een Real Time Clock module toevoegen om de werkelijke tijd aan te geven. Er zijn diverse RTC modules verkrijgbaar. Deze video gaat over het aansluiten en het gebruik van de DS1307 RTC, met een prijskaartje van minder dan een euro.
 
Link naar Fun with Arduino 41 Real Time Clock DS1307



guy1846

  • Nieuwe gebruiker
  • Offline Offline
  • Berichten: 6
Re: Pret met Arduino
« Reactie #156 Gepost op: 19 juni 2020, 18:05:23 »
 goede dag.
de railway crossing all together, ik heb een kleine aanpassing gedaan, nml bij het open gaan van de slagboom blijven de signalen nu ook 3 sec
door blinken als hij al helemaal open is.dat was vroeger niet zo. ik werk nog aan de detektie van de laatste wagon.bij mij gaan de slabomen te vroeg open. opmerking, ik weet niet waarom hier opeens een aantal woorden met rood zijn onderlijnd.
voor het geval je hier iets moest aan hebben.
vr gr guy noels

    #define GATE_SPEED   50 // [ms] lower number is higher servo speed
    #define GATE_DELAY  3000 // [ms] delay time before gate closes
    #define GATE_OPEN     50 // servo angle
    #define GATE_CLOSED  145 // servo angle
    #define BLINK_SPEED  400 // [ms] smaller number is faster blinking
    #define SERVO_PIN      8 // outp pin 8
    #define LED1_PIN       10  // outp pin 10
    #define LED2_PIN       11  // outp pin 11
    #define SENSOR1_PIN   2  // input pin 2
    #define SENSOR2_PIN   3  // input pin 3

    byte state = 1, transition;
    byte led1, led2, blink_enabled;
    byte angle    = GATE_OPEN;
    byte setpoint = GATE_OPEN;
    unsigned long time_to_blink;
    unsigned long time_to_close_gate;
    unsigned long time_to_open_gate;
    unsigned long time_for_servo;

    #include <Servo.h>
    Servo gate_servo;

    void setup() {
    pinMode(SENSOR1_PIN, INPUT_PULLUP);
    pinMode(SENSOR2_PIN, INPUT_PULLUP);
    pinMode(LED1_PIN, OUTPUT);
    pinMode(LED2_PIN, OUTPUT);
    gate_servo.attach(SERVO_PIN);
    gate_servo.write(angle);
    Serial.begin(9600);
    Serial.println("Railway Crossing Control Ready");
    Serial.println();
    Serial.println("Waiting for train");
    led1 = 1;
    led2 = 1;
      }
    void loop() {
   
    switch(state) {
    case 1: // idle
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
    break;
 
    case 2: // blinking, gate still open
      if (millis() > time_to_close_gate) transition = 23;
    break;
 
    case 3: // blinking, gate closing
      if(digitalRead(SENSOR2_PIN) == LOW) transition = 34;
    break;
 
    case 4: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 45;
    break;

    case 5: // gate open , but still blinking
        if (millis() > time_to_open_gate) transition = 51;
      }

    switch(transition) {
    case 12: //
      Serial.println("Train detected, start blinking");
      blink_enabled = 1;
      time_to_close_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 2;
    break;
 
    case 23: //
      Serial.println("Time to close the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_CLOSED;
      transition = 0;
      state = 3;
    break;
 
    case 34:
      Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_OPEN;       
      transition = 0;
      state = 4;
    break;
 
    case 45:
      Serial.println("Gate is open, still blinking");
      Serial.println();
      Serial.println("Waiting for train");
      time_to_open_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 5;
    break;
   
    case 51:
      blink_enabled = 0;
      led1 = 1;
      led2 = 1;
      gate_servo.detach(); // to avoid servo flutter
      transition = 0;
      state = 1;
    break;
      }

      if (millis() > time_for_servo) {
    time_for_servo = millis() + (unsigned long)GATE_SPEED;
    if (angle < setpoint) angle++;
    if (angle > setpoint) angle--;
    gate_servo.write(angle);
      }
   
      if(blink_enabled == 1) {
    if(millis() > time_to_blink) {
      time_to_blink = millis() + (unsigned long)BLINK_SPEED;
      led1 = !led1;
      led2 = !led1;
       }
      }
    digitalWrite(LED1_PIN, led1);
    digitalWrite(LED2_PIN, led2);
      }

RudyB

  • Offline Offline
  • Berichten: 550
  • EMV
    • RudysModelRailway
Re: Pret met Arduino
« Reactie #157 Gepost op: 19 juni 2020, 18:24:29 »
Trigger op eind van de trein is mogelijk door nadat het sensor signaal is weggevallen een tijdje later weer te kijken. Is het signaal nog steeds weg dan was dit het einde van de trein. Is het signaal weer aanwezig dan was dit het gat tussen twee wagons. De methode is niet fail safe ... als de trein heel langzaam rijdt of stil staat kan onterecht het eind van de trein worden aangegeven.

Patrick Smout

  • Offline Offline
  • Berichten: 346
Re: Pret met Arduino
« Reactie #158 Gepost op: 19 juni 2020, 19:26:00 »
De manier hoe er getest wordt op het aflopen van timers lijkt me ook nog een verborgen probleem te hebben. Als de ms timer de overgang maakt van de maximale naar de minimale tijd zal de tijd niet correct zijn. Een manier om dit op te lossen is door de code te herschrijven naar

If( something)
    Starttijd = millis();

If ( millis() - Starttijd > BLINK_SPEED )
  ... Do something

En Starttijd is van het type unsigned long

Mvg, Patrick Smout
Met vriendelijk groeten,

Patrick Smout

bask185

  • Offline Offline
  • Berichten: 1536
Re: Pret met Arduino
« Reactie #159 Gepost op: 19 juni 2020, 23:50:47 »
Een trein detectie sensor ding kan je niet zomaar samplen met een vaste interval. Je moet het volgende doen als je een detector goed wilt debouncen.

Je neemt ca elke 5ms ofzo een sample. Je kan varieren hiermee, 20 volstaat waarschijnlijk maar vaker is in principe beter.

Elke keer als je detector (lichtsluis, reflectie sensor, LDR, whatever) een trein ziet, dan zet je een aftellende timer op een bepaalde timeOut. Laten we 2000ms of 2s nemen. Dus bij elke waargenomen flikkering van de sensor, stop je opnieuw de timeout waarde in de timer.

Dan... deze timer laat je dus continu aftellen naar 0. Indien de timer 0 bereikt. Dan is er zeker weten geen trein. Als je timer niet 0 is, dan is er een trein.


Stel dat je een heel slechtziende reflectie sensor of andere slecht detecterend rot apparaat heb die niet meer dan 10% van de trein waarneemt, dan lost deze code dat op.

De loop is heel simpel. Die laat een led branden als er een trein is, en anders is de led uit.
void loop() {
  if( readDetector() == occupied ) digitalWrite( 13, HIGH );
  else                             digitalWrite( 13, LOW );
}
Duidelijke syntax, niet?

De functie readDetector regelt de terugmelder.
Dit stukje van de functie regelt het interval. Ik maak geen gebruik van unsigned longs omdat dat simpelweg niet nodig is.  De timeOut tijd wordt elke sampleInterval  afgeteld naar 0 toe. Een berekening van de timeOut waarde houdt rekening mee met de sampleInterval tijd

const int sampleInterval = 5;
const int timeOut = 2000 / sampleInterval ; //          // 2 second timeout, kan je ook 10 of 20s maken, net wat je wilt

uint8_t readDetector() {
    static uint16_t timeCounter = 0;
    static uint16_t prevTime = 0;                 // op deze wijze hebben we geen long nodig
    uint16_t currentTime;

    currentTime = millis() & 0x0000FFFF;            // ( and masker is eigenlijk overbodig. Hij staat er om te illustreren dat we alleen de laatste 16 bits gebruiken van millis)

    if( currentTime - prevTime > sampleInterval ) {      // elke 5ms
        prevTime = currentTime;

Direct hieronder staat de code die bijhoudt of er een trein is of niet. Nogmaals, als er een trein gedetecteerd wordt, dan stop ik een vaste timeout waarde in een counter die hier timeCounter heet (bij gebrek aan beter). Dit gebeurt dus bij de minste flikkering van de sensor. Als de sensor alleen al een trein ruikt, dat is het blok voor minimaal 2 seconde bezet.

if( digitalRead( sensor ) == LOW ) {         // if train is detected
            timeCounter = timeOut;                    // force the counter again to 2 seconds
        }

        if( timeCounter > 0 ) timeCounter--;        // start counting down time

        if( timeCounter == 0) {
            return freed;
        }
        else {
            return occupied;
        }
Als deze timeCounter gelijk is aan 0, dan betekent dat er gedurende de timeOut tijd geen trein is gezien. Dan weet je zeker dat de trein weg is (Onder voorbehoud dat je net geen trein stil zet op de sensor op precies een plek dat de sensor hem niet zien). Als deze timeCounter nog geen 0 is geworden dan is de trein nog op het blok.

De hele code in 1 snippet:
const int ledPin = 13;
const int sensor = 3; // ??

enum blockStates {
    occupied,
    freed,
};

void setup() {
  pinMode( 13, OUTPUT );
  pinMode( sensor, INPUT_PULLUP );
}

void loop() {
  if( readDetector() == occupied ) digitalWrite( 13, HIGH );
  else                             digitalWrite( 13, LOW );

}

const int sampleInterval = 5;
const int timeOut = 2000 / sampleInterval ; //          // 5 second timeout

uint8_t readDetector() {
    static uint16_t timeCounter = 0;
    static uint16_t prevTime = 0;                 // op deze wijze hebben we geen long nodig
    uint16_t currentTime;

    currentTime = millis() & 0x0000FFFF;            // ( and masker is eigenlijk overbodig, we hebben zo geen long nodig )

    if( currentTime - prevTime > sampleInterval ) {      // elke 5ms ofzo
        prevTime = currentTime;

        if( digitalRead( sensor ) == LOW ) {         // if train is detected
            timeCounter = timeOut;                    // force the counter again to 3 seconds
        }

        if( timeCounter > 0 ) timeCounter--;        // start counting down time

        if( timeCounter == 0) {
            return freed;
        }
        else {
            return occupied;
        }
    }
}
Ik heb het getest en het werkt zoals uitgelegd!

Ik hoop dat ik er iemand mee kan helpen. Denk dat ik deze maar verwerk in een library formaat voor arduino.

Mvg,

Bas

RudyB

  • Offline Offline
  • Berichten: 550
  • EMV
    • RudysModelRailway
Re: Pret met Arduino
« Reactie #160 Gepost op: 20 juni 2020, 09:41:42 »
Dat is wel een heel wetenschappelijke aanpak. Dit werkt ook:

if(!digitalRead(SENSOR_PIN)) {
  train_detected = 1;
  end_of_train_time = millis() + 2000UL; // wachttijd in [ms]
}
if(millis() > end_of_train_time) train_detected = 0;

Complete werkende sketch:
#define WAIT_TIME   2000 // [ms]
#define SENSOR_PIN     8

byte train_detected;
unsigned long end_of_train_time;

void setup() {
  pinMode(SENSOR_PIN, INPUT_PULLUP);
  pinMode(13, OUTPUT); // on board LED
  digitalWrite(13, LOW);
}

void loop() {
  if(!digitalRead(SENSOR_PIN)) {
    end_of_train_time = millis() + (unsigned long)WAIT_TIME;
    train_detected = 1;
  }
  if(millis() > end_of_train_time) train_detected = 0;
  digitalWrite(13, train_detected);
}
...
« Laatst bewerkt op: 20 juni 2020, 09:54:55 door RudyB »

Patrick Smout

  • Offline Offline
  • Berichten: 346
Re: Pret met Arduino
« Reactie #161 Gepost op: 20 juni 2020, 10:04:35 »
Dat is wel een heel wetenschappelijke aanpak. Dit werkt ook:
if(!digitalRead(SENSOR_PIN)) {
  train_detected = 1;
  end_of_train_time = millis() + 2000UL; // wachttijd in [ms]
}
if(millis() > end_of_train_time) train_detected = 0;
Een sterk voordeel van de wetenschappelijke aanpak is dat het ook blijft werken op lange termijn (24/24 en 7/7 onder spanning).
Van het betere hobbywerk kan dit niet altijd gezegd worden (maar je zal er ook niet tegenaan lopen als je na een aantal uren je baan telkens spanningsloos brengt)

mvg, Patrick Smout
Met vriendelijk groeten,

Patrick Smout

RudyB

  • Offline Offline
  • Berichten: 550
  • EMV
    • RudysModelRailway
Re: Pret met Arduino
« Reactie #162 Gepost op: 20 juni 2020, 10:08:14 »
Als je bedoelt dat deze code elke 49 dagen een keer fout zou kunnen gaan door overflow van de millis() ... ja, klopt. :)

Patrick Smout

  • Offline Offline
  • Berichten: 346
Re: Pret met Arduino
« Reactie #163 Gepost op: 20 juni 2020, 12:26:51 »
Inderdaad maar zoals gezegd maakt het in deze toepassing niet veel uit.
Nu is het wel zo dat, als iemand besluit om dit soort code te lenen om thuis een domotica systeem te bouwen, het plots wel belangrijk wordt. Hij of zij kan dan beter in de juiste richting vertrekken want, zoals wij techneuten allemaal ondervonden hebben, het afleren van foute gewoontes is knap lastig. ;)

Mvg, Patrick Smout
Met vriendelijk groeten,

Patrick Smout

guy1846

  • Nieuwe gebruiker
  • Offline Offline
  • Berichten: 6
Re: Pret met Arduino
« Reactie #164 Gepost op: 28 juni 2020, 18:08:50 »
 Goede dag Rudy
misschien zijn er forumleden die hier iets aan hebben.
het is een volledig ontwerp geworden met bijhorende interface die ik nog probeer door te sturen.
uitvoerig getest en goed bevonden.


     //sketch_railw-cross-4-3-test
    //Slagbomen werken in beide richtingen.
    //Slagbomen gaan pas open als laatste wagon gepasseerd is
   
    #define GATE_SPEED   50 // [ms] lower number is higher servo speed
    #define GATE_DELAY  1000 // [ms] delay time before gate closes
    #define GATE_OPEN     50 // servo angle
    #define GATE_CLOSED  145 // servo angle
    #define BLINK_SPEED  400 // [ms] smaller number is faster blinking
    #define SERVO_PIN      8 // outp pin 8
    #define LED1_PIN       10  // outp pin 10
    #define LED2_PIN       11  // outp pin 11
    #define SENSOR1_PIN   2  // input pin 2
    #define SENSOR2_PIN   3  // input pin 3

    byte state = 1, transition;
    byte led1, led2, blink_enabled;
    byte angle    = GATE_OPEN;
    byte setpoint = GATE_OPEN;
    unsigned long time_to_blink;
    unsigned long time_to_close_gate;
    unsigned long time_to_open_gate;
    unsigned long time_for_servo;

    #include <Servo.h>
    Servo gate_servo;

    void setup() {
    pinMode(SENSOR1_PIN, INPUT_PULLUP);
    pinMode(SENSOR2_PIN, INPUT_PULLUP);
    pinMode(LED1_PIN, OUTPUT);
    pinMode(LED2_PIN, OUTPUT);
    gate_servo.attach(SERVO_PIN);
    gate_servo.write(angle);
    Serial.begin(9600);
    Serial.println("Railway Crossing Control Ready");
    Serial.println();
    Serial.println("Waiting for train");
    led1 = 1;
    led2 = 1;
      }
    void loop() {
       switch(state) {
    case 1: // idle
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 12;
      if(digitalRead(SENSOR2_PIN) == LOW) transition = 17;
      break; 
    case 2: // blinking, gate still open
      if (millis() > time_to_close_gate) transition = 23;
    break;
    case 3: // blinking, gate closing
      if(digitalRead(SENSOR2_PIN) == LOW) transition = 34;
    break;
    case 4: //blinking waiting last wagon
      if(digitalRead(SENSOR2_PIN) == HIGH) transition = 45;
    case 5: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 56;
    break;
    case 6: // gate open , but still blinking
        if (millis() > time_to_open_gate) transition = 61;
       }
         switch(transition) {
    case 12: //
      Serial.println("Train detected, start blinking");
      blink_enabled = 1;
      time_to_close_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 2;
    break;
 
    case 23: //
      Serial.println("Time to close the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_CLOSED;
      transition = 0;
      state = 3;
    break;
 
    case 34:
      Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      //setpoint = GATE_OPEN;       
      transition = 0;
      state = 4;
    break;
    case 45:
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_OPEN;       
      transition = 0;
      state = 5;
    break;
    case 56: 
      Serial.println("Gate is open, still blinking");
      Serial.println();
      //Serial.println("Waiting for train");
      time_to_open_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 6;
    break;
    case 61:
      blink_enabled = 0;
      led1 = 1;
      led2 = 1;
      gate_servo.detach(); // to avoid servo flutter
      transition = 0;
      state = 1;
    break;
      }
     if (millis() > time_for_servo) {
      time_for_servo = millis() + (unsigned long)GATE_SPEED;
      if (angle < setpoint) angle++;
      if (angle > setpoint) angle--;
      gate_servo.write(angle);
      } 
      if(blink_enabled == 1) {
      if(millis() > time_to_blink) {
      time_to_blink = millis() + (unsigned long)BLINK_SPEED;
      led1 = !led1;
      led2 = !led1;
       }
     
    digitalWrite(LED1_PIN, led1);
    digitalWrite(LED2_PIN, led2);
      }
       
     switch(state) { 
    case 7: // blinking, gate still open
      if (millis() > time_to_close_gate) transition = 78;
    break;
 
    case 8: // blinking, gate closing
      if(digitalRead(SENSOR1_PIN) == LOW) transition = 89;
    break;
    case 9: // blinking,waiting last wagon
      if(digitalRead(SENSOR1_PIN) == HIGH) transition = 9,10;
 
    case 10: // blinking, gate opening
      if(angle == GATE_OPEN) transition = 10,11;
    break;

    case 11: // gate open , but still blinking
        if (millis() > time_to_open_gate) transition = 11,1;
      }
      switch(transition)  {
    case 17: //
      Serial.println("Train detected, start blinking");
      blink_enabled = 1;
      time_to_close_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 7;
    break;
    case 78:
      Serial.println("Time to close the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_CLOSED;
      transition = 0;
      state = 8;
    break;
    case 89:
      //Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      //setpoint = GATE_OPEN;       
      transition = 0;
      state = 9;
    break;
    case 9:10,
      Serial.println("Train detected, open the gate");
      gate_servo.attach(SERVO_PIN);
      setpoint = GATE_OPEN;       
      transition = 0;
      state = 10;
    break;
    case 10:11,
      Serial.println("Gate is open, still blinking");
      Serial.println();
      Serial.println("Waiting for train");
      time_to_open_gate = millis() + (unsigned long)GATE_DELAY;
      transition = 0;
      state = 11;
    break;
    case 11:1,
      blink_enabled = 0;
      led1 = 1;
      led2 = 1;
      gate_servo.detach(); // to avoid servo flutter
      transition = 0;
      state = 1;
    break;
      }
    if (millis() > time_for_servo) {
    time_for_servo = millis() + (unsigned long)GATE_SPEED;
    if (angle < setpoint) angle++;
    if (angle > setpoint) angle--;
    gate_servo.write(angle);
      }
   
      if(blink_enabled == 1) {
    if(millis() > time_to_blink) {
      time_to_blink = millis() + (unsigned long)BLINK_SPEED;
      led1 = !led1;
      led2 = !led1;
       }
      }
    digitalWrite(LED1_PIN, led1);
    digitalWrite(LED2_PIN, led2);
      }