Doel:€250.00
Donaties:€197.50

Per saldo:€-52.50

Steun ons nu!
Actie: steun €2.50 via de Wim Vink kalender 2021!

Laatst bijgewerkt
op 18-09-2020
Algemeen

De stichting

Recente berichten

De Hondsrugbaan, H0 door Reinier Z.
Vandaag om 12:53:30
Bouw Br 03 001 Borsig door puntenglijder
Vandaag om 12:43:42
DR rijtuigen halberstadt, reko, Y/B 70 door stefan88
Vandaag om 12:31:36
Uitlezen decoder met Twin-Center door Roofje59
Vandaag om 12:26:55
LS-Models 2020, nieuws van de fabrikant. door Sicco Dierdorp
Vandaag om 12:10:46
SSN Mitropa rijtuig van Tillig HO door Maurik
Vandaag om 12:09:28
Zimo sounddecoder, instellen maximum snelheid door Jeroen Water
Vandaag om 12:02:33
Baanbouw met Ecos besturing genaamd: Giessenstad Rbf door Esufreak
Vandaag om 12:02:33
De fabriek - Spoor 0 door Ronald Halma
Vandaag om 11:55:39
Doornvliet door cor_b
Vandaag om 11:55:05
Roco Vectron DC voorzien van schijnwerpers en cabineverlichting door Fritsprt
Vandaag om 11:47:52
Welke manier van handbediening op wissels? door Ronald Halma
Vandaag om 11:47:24
StoomStichtingNederland organiseert de 1,5 Meter Express - za. 24 oktober 2020 door spoorzeven
Vandaag om 11:39:51
Afsluitdoppen voor tankwagons? door Menno
Vandaag om 11:35:09
3D/RM: NS Sik 200/300 locomotor in schaal N 1:160 door Huib
Vandaag om 11:27:08
Projekt 083-338 door 44
Vandaag om 11:19:48
Een kleine baan in een grote schaal: Laden en lossen in 1:22.5 door NS1220
Vandaag om 10:49:51
Artitec CSA-1, stadsbus door Spoor010
Vandaag om 10:30:48
Bad Harzwald een fictieve havenbaan in spoor 0 door BartvD
Vandaag om 10:09:59
Tillig DDR DR Bme 2de klasse rijtuig type Y/B 70 H0 door stefan88
Vandaag om 09:55:06
Raadplaatje door Jelmer
Vandaag om 09:48:43
NS 5500 / HSM 700 spoor 0 / 1 door FritsT
Vandaag om 09:47:05
BNLS-module: "Grasland" door NS264
Vandaag om 09:34:45
Zelfbouw rails en wissels H0, waar te beginnen door Noordernet
Vandaag om 08:28:36
Frans loodsje et cetera door Noordernet
Vandaag om 08:23:36
Polderparade door JoopSpoort
21 september 2020, 23:52:27
De bouw van een modulebaan met Nederlands Landschap door AntonM
21 september 2020, 23:43:17
Beurs in Houten 10 oktober 2020 - de voor- en nabeschouwing door Martin Welberg
21 september 2020, 23:38:08
BNLS-Module: Grasland - de keerlussen met schaduwbakken door Edsko Hekman
21 september 2020, 22:55:12
Re: Beurs in Houten 10 oktober 2020 - de voor- en nabeschouwing door Modellbahnwagen
21 september 2020, 22:48:00
  

Auteur Topic: Pret met Arduino  (gelezen 32712 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: 609
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
  • Online Online
  • Berichten: 5625
  • 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: 609
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: 327
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

bask185

  • Offline Offline
  • Berichten: 783
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: 327
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

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: 327
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

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);
      }