Aiuto per un vecchio appassionato

Ecco, mi sembra che ci sia tutto. Questa è la versione finale, con tutti gli aggiornamenti di cui abbiamo discusso nei messaggi seguenti questo tranne il for() per l'avviamento progressivo.
Ho velocizzato il lampeggìo della croce di S. Andrea, poiché mi sembra di capire che tu preferisca così.

/* Descrizione: 
- Parte il treno e si lampeggia la croce di S. Andrea, finché il treno entra nella galleria.
- In galleria, il treno chiude il contatto reed e il treno si ferma. Si spegne la croce di S. Andrea.
- Dopo 2 minuti, riprende a lampeggiare la croce di S. Andrea e il treno riparte.
*/
const byte    REED = 8;  // pin di input a cui è collegato il contatto reed verso massa.
const byte  LED_A = 13; // led A della croce di S. Andrea
                                    // N.B.: Il pin 13 lampeggia all'accensione per la presenza del bootloader.
const byte  LED_B = 11; // led B della croce di S. Andrea
const byte TRENO = 10; // Treno pilotato dal pin digitale 10


// Variabili globali
byte statoReedPrec = 0; // stato precedente del contatto reed
byte marcia=0; // Stato del treno.
unsigned long t1; // millis() per i 2 minuti di attesa.

void setup()
{
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(TRENO, OUTPUT); digitalWrite (TRENO, HIGH); marcia=1; // Il treno parte.
pinMode(REED, INPUT);
pinMode(REED, INPUT_PULLUP); // Resistenza di pullup interna per mettere il pulsante verso massa.
            // Il contatto reed verso massa è anche comodo perché non devi portare fuori il +V.
            // Metti un condensatore da 1uF (meglio se con 100 ohm in serie) tra il pin di ingresso e 
}          // massa come antirimbalzo (un contatto reed fa meno rimbalzi).

void loop() 
{
if(!digitalRead(REED) && statoReedPrec==1) // Nel momento in cui il treno arriva sul reed
  {
  statoReedPrec=0;
  digitalWrite (TRENO, LOW); marcia=0; // Ferma il treno.
  t1=millis(); // prende il tempo.
  }
if(digitalRead(REED)) statoReedPrec=1;
if(millis()-t1>120000) // Se sono passati 2 minuti
  {
  digitalWrite (TRENO, HIGH); marcia=1; // Riparte il treno.
  }

if(marcia) // Se il treno è in movimento, la croce di S. Andrea lampeggia.
  {
  if(millis()%1000<500) {digitalWrite(LED_B, LOW); digitalWrite(LED_A, HIGH);} // spegne il LED B e accende il LED A.
  else                  {digitalWrite(LED_A, LOW); digitalWrite(LED_B, HIGH);} // spegne il LED A e accende il LED B.
  }
else {digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW);}
} // END loop()

In realtà, per fare tutto questo sarebbe sufficiente un timer per le luci delle scale con uscita a scambio, che quando viene chiuso un interruttore (deve essere non retriggerabile, cioè se il pulsante rimane premuto alla fine del tempo impostato deve commutare comunque) toglie alimentazione al treno e alla croce di S. Andrea (che deve avere un proprio lampeggatore) per 2 minuti... Qui, però, lo facciamo con Arduino! :slight_smile: