Doel:€250.00
Donaties:€50.00

Per saldo:€-200.00

Steun ons nu!

Laatst bijgewerkt
op 03-01-2024

Vacature: secretaris bestuur
Algemeen

De stichting

Recente berichten

NS 8400 van Werps door Ivo tB
Vandaag om 00:08:14
De (3d) knutsels van Ronald. door Jan-Peter
Vandaag om 00:04:32
U-vorm beperkte ruimte (H0 C-rails) door hmmglaser
28 maart 2024, 23:42:04
Onlangs gespot - gefotografeerd, de foto's door GerardvV
28 maart 2024, 23:37:18
US diorama in H0 door Wim Vink
28 maart 2024, 23:31:57
Al mijn goede ideeën... door bask185
28 maart 2024, 23:12:12
Gebruik je Arduino zonder te "programmeren" ;) door bask185
28 maart 2024, 22:51:58
21 april Het stoomgenootschap door bloemenvelden door Seinhuis
28 maart 2024, 22:46:29
7 april De Karel on tour door Seinhuis
28 maart 2024, 22:44:31
Raadplaatje door Magic
28 maart 2024, 22:23:21
LokSound 4 decoders, files verbeteren (voor Roco b.v. TEE RAm, NS2400, etc) door Biesje
28 maart 2024, 22:06:44
Geluid NS Mat'46 vs NS Mat'54 door Rob Bennis
28 maart 2024, 21:54:12
Engelse wagon uit 1930 opgegraven in Antwerpen door willem2
28 maart 2024, 21:52:45
NS GLY omspuiten en opschriften door Rob Ellerman
28 maart 2024, 21:45:55
De Hondsrugbaan door cor_b
28 maart 2024, 21:40:07
welk jaar ging Marklin OVP voor wagons van blauw naar wit door Railman
28 maart 2024, 21:36:50
Mallnitzer Tauernbahnstrecke ÖBB N Spoor door Schachbrett
28 maart 2024, 21:22:18
Mijn eerste H0-modeltreinbaan in aanbouw door puntenglijder
28 maart 2024, 21:15:13
Bouw van materieel 40 treinstellen door Rob Bennis
28 maart 2024, 21:09:04
30 maart Modelspoorbeurs Houten & HCC Kennisdag door basjuh1981
28 maart 2024, 20:54:43
Hengelo in 1981-1982, maar dan anders: Kassenberg in N door 1200blauw
28 maart 2024, 20:32:41
Welke Vallejo kleur voor drijfstangen van een DB stoomlocomotief? door Ronald69
28 maart 2024, 20:00:39
Toon hier je nieuwe (model-) spooraanwinst(en)... door arnout
28 maart 2024, 19:53:27
Punt- en hartstukken door Klaas Zondervan
28 maart 2024, 19:41:21
MARDEC, de Multifunctionele ARduino dcc DECoder. door bord4kop
28 maart 2024, 19:34:37
Piko NS 2015 stroomafname probleem door Ben
28 maart 2024, 19:08:30
Bauarbeiten im gange door ruudns
28 maart 2024, 18:50:26
HSM D1715 door vpeters1984
28 maart 2024, 17:34:25
Beekdaelen in H0 door Stieven76
28 maart 2024, 17:17:41
Ombouw/Pimpen Bolle neuzen door bollen neus
28 maart 2024, 15:58:15
  

Auteur Topic: Pret met Arduino  (gelezen 52742 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: 943
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: 630
  • 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: 7361
  • 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: 943
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: 630
  • 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

  • Offline Offline
  • Berichten: 16
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: 630
  • 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: 416
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: 4009
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
Train-Science.com
Train-Science github
It ain't rocket science ;-)

RudyB

  • Offline Offline
  • Berichten: 630
  • 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: 416
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: 630
  • 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: 416
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

  • Offline Offline
  • Berichten: 16
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);
      }