Aiuto per un vecchio appassionato

Considera che quel programma l'ho scritto tutto di seguito senza fare alcuna prova... :slight_smile:

Inoltre ti ho detto "per quello che ho capito", perché non avevo capito esattamente come avrebbe dovuto funzionare. Soprattutto non ho capito che cosa dovrebbe accadere ogni volta che premi il pulsante: non vuoi che faccia tutto di seguito da solo?

Per quanto riguarda l'arrivo, non l'ho ancora inserito.

Ciao,

il treno deve rimanere nascosto in una galleria per l'effetto sorpresa, uscire dopo circa 2/3 min e quando esce sarebbe bello far partire la segnalazione led lampeggianti croce di S.Andrea, quando torna c'è un contatto reed che viene sollecitato (in galleria) e far ricominciare il ciclo.

Marco

Ciao

Per come l'ho scritto, la croce lampeggia per 3 minuti, poi parte il treno!

La croce la facciamo lampeggiare più velocemente, con mezzo secondo per ciascuna luce?

Continuo a non capire il pulsante... Lo togliamo e mandiamo tutto in automatico?...

Quindi:

  • tutto fermo per 2~3 minuti
  • parte il treno
  • dopo un po' (10s?) comincia a lampeggiare la croce di s. Andrea (per 30 secondi?)
  • torna in galleria e resta fermo per 2~3 minuti

Rieccomi,

stasera ho festeggiato anche un compleanno! :slight_smile:

L'ideale sarebbe, 1:partenza treno (punto reed o tasto) dopo 2/3 min con lampeggio, torna al punto di partenza e si arresta ( eccita il reed o tasto) e si spengono le luci, dopo 2/3minriparte da solo.

La croce di S.Andrea segue lo stato di accensione treno.

Aggiungo uno spriz! Marco

:slight_smile:
Perdonami, ma non capisco. Scrivi le varie fasi in sequenza, una per riga, ad esempio:

Setup:

  1. Accendi tutto e lampeggia la croce di S. Andrea per 10 secondi, poi si spegne.

Loop:
2. Parte il treno.
3. Arriva in galleria e il reed lo ferma per 2 minuti, poi
4. Si accende la croce di s. Andrea.
5. Dopo 10 secondi si torna al punto 2.

Credo che quello che intende lui (credo, ripeto), sia che la croce debba iniziare a lampeggiare nel momeno in cui il treno parte dell'interno della galleria (tipo. per avvisare che arriva), poi il treno dopo aver fatto il suo giro (che non so se preveda delle soste in stazione o altro), una volta rientrato in galleria, chiuda un reed che gli fa fare un ciclo di attesa di 2/3 minuti fermo in galleria ...

Quello che non e' chiaro e':

  1. il pulsante serve per far ripartire il treno prima dei 2/3 minuti, annullando il ciclo di attesa in galleria ?

  2. oppure per far partire il treno dall'esterno della galleria quando lo disponi, inizializzando il programma ?

  3. oppure entrambe le cose ? ( un generico "inizia ciclo" ? )

  4. se la croce deve iniziare a lampeggiare quando il treno parte, poi per quanto tempo deve lampeggiare, per tutto il tempo in cui il treno e' in movimento (e quindi spegnersi insieme al treno quando rientra in galleria), oppure solo per "tot" secondi (e quindi spegnersi mentre il treno ancora gira, e riaccendersi solo quando riparte dall'interno della galleria) ?

  5. (eventuali) hai altre cose sul tracciato, passaggi a livello, semafori, stazione in cui fermare il treno, eccetera, che richiedano altre azioni o altri comandi ? (perche' sarebbe meglio saperlo subito :wink: )

Ah! Vedo ora che ha scritto che la croce di s. Andrea deve lampeggiare per tutto il tempo che il treno cammina. Temo, però, che oggi non potrò lavorare sul programma.

Provo a essere più chiaro.

Setup:
avvio del treno e 2 led segnale. Spene tutto all' arrivo al pulsante.

Loop:
1 avvio treno e avvio dei led lampeggianti
2 arrivo al pulsante e si spegne tutto
3 avvio contatore che fà ricomingiare tutto dopo 2/3min.

Ancora grazie a tutti. Marco
P.S. il percorso del treno è un'ovale.

Ma il "pulsante" è l'interruttore reed???

Mi sa di si

Si,

il pulsante/tasto/reed, per ora ho tutto sulla bread bord con tasto del kit arduino. :slight_smile:

Marco

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:

Rieccomi,

ho anche pensato al timer scale, ne avevo uno in "cantina" ma gestire tutto in 220V non mi piaceva, avevo Arduino e la mia "saccenza"...

P.S. Lo sketch, non funziona mi dice alla verifica che alla riga :

if(digitalRead(BUTTON)==1) lastStatoBUTTON=1; // Se il pulsante viene lasciato, ne prende nota.

mi dice : 'BUTTON' was not declared in this scope

Secondo me ho una versione dell' IDE tarocca, "Sanno" che sono un somaro e mi "hanno" fatto
scaricare la versione per i ciucci! :o

Marco

No, no! :slight_smile:
Prendi l'ultima versione del programma. L'ho aggiornato un minuto fa.
In questo momento non posso provare con l'IDE il programma che ho scritto.

Datman: correggimi se sbaglio, ma ... statoReedPrec lo metti a zero per evitare che il reed chiuso continui ad azzerare il tempo, e qui e' corretto, ma ho l'impressione che poi quando il treno riparte ed il reed si apre, non lo riporti allo stato precedente ... per cui probabilmente il ciclo te lo fa una sola volta e poi basta ... oppure mi e' sfuggito ?

EDIT: inoltre c'e' qualcosa di strano nell'if dei led ... se il treno non e' in marcia in teoria dovrebbero essere entrambi spenti, in quel modo anche se smettono di lampeggiare, uno dei due non rimane sempre acceso ? (e poi, perche' "millis()%1000" ?)

L'ho modificato. Considerate che lo sto facendo in qualche ritaglio di tempo! :slight_smile:

millis()%1000<500 fa lampeggiare i LED a 1Hz, accendendoli o spegnendoli in opposizione a seconda che il resto sia minore o maggiore di 500.

Ti torna, Etemenanki? Dovrebbe funzionare...
17.42: ho corretto un "MARCIA" in "marcia".

ArTex:
ho anche pensato al timer scale, ne avevo uno in "cantina" ma gestire tutto in 220V non mi piaceva, avevo Arduino e la mia "saccenza"...

Hai ragione. Non mi sono posto il problema pensando che esistessero anche a 12V (e serve anche con lo scambio in uscita, perché deve lavorare al contrario e, come detto, deve essere non ripristinabile). In effetti, però, non ne sono sicuro...

Eccezzionale!

E' perfetto, ti ringrazio molto ora posso finire e fare la vetrina.

Una delle cose per me più difficili da capire sono uso di questo comando:

if(!digitalRead(REED) && statoReedPrec==1)

ho un paio di libri che mi sono letto e riletto più letture sui vari forum, ma proprio non riesco a farli miei, è anche vero che non è il mio campo per mè è uno hobby...

Grazie mille a Voi che vi siente impegnati per me che alla fine sono un "rompibolle".

Se posso e vi fà piacere vorrei condividere questo sketch con i miei amici appassionati fermodellisti, così magari possono usarlo anche loro.

Saluti e a questo punto vi posto appena riesco a fare il video e la foto del lavoro fatto.

Auguri in anticipo Marco.