Accensione di tre LED con interruttore

Buona Sera
dopo aver deciso di abbandonare per ora il mio precedente progetto, ho pensato di iniziare con qualcosa di più semplice (ABC). Ora mi trovo difronte ad un problema al quale non ho saputo dare una soluzione dopo giorni di prove e continue ricerche e spero che Voi Guri di arduino possiate darmi una mano.
Il problema è questo: Giocando con i led sto cercando di simulare con la pressione di un interruttore l'avvio di un motore.
Il Progetto prevede l'accensione di 3 led in sequenza alla pressione di un interruttore.
I tre led citati stanno a simulare la presenza di alimentazione (LEDR), il lampeggio del LEDG (led giallo), che sta ad indicare l'avvio, e LEDV (led verde) che dovrebbe indicare l'entrata a regime del motore.
Ho scritto un picco programma che in parte funziona e cioè: all'avvio il LEDR è accesso, potando l'interruttore allo stato HIGH il LEDG lampeggia per 3 volte e poi si spegne. A questo punto dovrebbe accendersi il LEDV che indica che il "Motore" è andato a regime, ma questo è il mio problema non riesco a far accendere il LEDV.
Poi altro problema quando porto l'interruttore allo stato LOW, il LEDR si accende regolarmente ma in contemporanea si accende anche il LEDG che dovrebbe in questa fase essere spento.

PS. Qualcuno mi può anche indicare come inserire lo Skect???

Puoi copiarlo nel messaggio (basta che lo metti tra i tag code, che è il primo bottone in alto a sinistra, quello fatto così </>).

Oppure clicchi su "Attachments and other options" sotto al riquadro dove scrivi il post e lo alleghi.

Questo è lo Skect che ho scritto per il mio progetto

int LEDG = 2;//inizializzo il pin 2 al Led giallo
int LEDR = 5;//inizializzo il pin 5 al Led rosso
int PINP = 3;//inizializzo il pin 3 al Pulsante 
int LEDV = 4;//Associo il pin 4 al LED verde
int STATOP = LOW;//Variabile controllo dello stato del pulsante all'inio del programma
int STATOL = HIGH;//Variabile che pone lo stato del led Rosso High all'avvio.

int CONTATORE=0;//Variabile contatoreper il LED giallo

void setup() {
  // put your setup code here, to run once:
digitalWrite (LEDR, STATOL);//Farà in modo ch all'avvio il programma sia acceso
pinMode (LEDR, OUTPUT);
pinMode (PINP, INPUT);
pinMode (LEDG, OUTPUT);
pinMode (LEDV, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
int LETTURA = digitalRead (PINP);//Variabile locale per la lettura dello stato del Pulsante
if (LETTURA != STATOP and LETTURA == HIGH){//Condizione
  
  STATOL = !STATOL;//imposta lo stato del LEDR spento
  
  digitalWrite (LEDR, STATOL);
   
for(;CONTATORE<3;CONTATORE++){//Ciclo for per far lampeggiare il led giallo.
  digitalWrite(LEDG,HIGH);
  delay (1200);
  digitalWrite(LEDG,LOW);
  delay (1200);
 
  }
   CONTATORE =!CONTATORE;// Azzera il contatore
   }   
 
  
STATOP= LETTURA;//aggiorna la variabile STATOP 
 
delay (10);
  }

Spero non sia troppo incasinato.

Ma un semplice digitalWrite(LEDV, HIGH) dopo il for hai provato a metterlo?

(Ti anticipo da subito che se vuoi fare più di queste semplici accensioni lo sketch va rifatto totalmente)

Concordo con SukkoPera. Studiati innanzitutto il lampeggio di un LED utilizzando millis() invece di delay():

BlinkWithoutDelay

Il contatore lo si azzera nello stesso modo in cui l'hai inizializzato:

CONTATORE=0;

Intanto grazie a tt per i vostri consigli. In risposta a SukkoPera si il digital White lo messo ma il verde parte subito dopo la pressione dell interruttore e invece dovrebbe accendersi dopo il lampeggio del giallo. Alla funzione mill invece ancora nn lo studiata bene ma già era in programma di implementarla nello sketch non appena risolto il problema. Per ora mi basta fare queste accensione è solo una simulazione per capire e comprendere. Se avete altri consigli su come risolvere ve ne sarei grato.

Non l'hai messo nel punto giusto, evidentemente. Mettilo appena dopo la graffa chiusa del for.

Ok. Provo e ti dirò.

digitalWrite (LEDR, STATOL);//Farà in modo ch all'avvio il programma sia acceso

Perché replichi questa riga nel setup e nel loop? se non pianifichi di spegnere il LED per qualche ragione, puoi lasciare la riga solo nel setup e cancellarla dal loop.


for(;CONTATORE<3;CONTATORE++)

L'azzeramento del contatore conviene inserirlo all'inizio del for. Poi, a meno che non userai la variabile da altre parti, la renderei locale al for.

for(int contatore = 0;contatore < 3;contatore++)

Nota di stile: come vedi "contatore" l'ho scritto in minuscolo. Di solito le variabili si scrivono in minuscolo e le costanti in maiuscolo.


Questo test lo puoi semplificare da così:

LETTURA == HIGH

A così:

if(lettura != statop && lettura)
{
  istruzioni...
}

In C qualsiasi valore diverso da 0 viene considerato TRUE, quindi se la variabile è booleana, o usata come tale, risulta ridondante testare esplicitamente se è TRUE o FALSE. Se avessi voluto testare se la variabile è FALSE, avresti scritto: !lettura. L'operatore punto esclamativo è l'operatore logico NOT. Puoi leggerlo come: se NON ho variable, oppure ancora se la variabile è FALSE...
Le variabili che usi come booleane le puoi dichiarare di tipo bool: bool lettura = false;

Anche se sono consentite le scritture per esteso di "and" e "or" da relativamente poco tempo nel C++, i programmatori fin dagli albori dell'informatica moderna usano "&&" per "and" e "||" per "or". Non è sbagliato usare le novità, ma nel 99% dei programmi troverai i vecchi simboli ancora per un bel po' di tempo.

Cioa Krypton 18 e grazie per le tue osservazioni cercherò di metterle in pratica per la prossima volta. In risposta SukkkoPera ho fatto come hai detto e in parte funziona e cioè alla fine del ciclo "for" il LEDV si accende come dovrebbe. Però per ora il problema rimane in quanto alla successiva pressione dell'interruttore e quindi spegnere il tt, il LEDV rimane sempre acceso. Sto cercando di rivedere il codice aggiungendo all'inizio del ciclo "for" una nuova condizione.
Intanto di nuovo grazie.

al72:
Cioa Krypton 18 e grazie per le tue osservazioni cercherò di metterle in pratica per la prossima volta.

Ti consiglio caldamente di metterle in pratica fin da subito. Se segui fin dai primi esperimenti un corretto stile di programmazione, nei prossimi programmi che farai perderai meno tempo sia a scriverli prima che a correggerli poi.

Però per ora il problema rimane in quanto alla successiva pressione dell'interruttore e quindi spegnere il tt, il LEDV rimane sempre acceso. Sto cercando di rivedere il codice aggiungendo all'inizio del ciclo "for" una nuova condizione.

Non devi agire sul ciclo for, ma inserire un test dopo di esso. Devi fare un test del tipo:

if (!interruttore) {
LED VERDE SPENTO
}

Potresti evitare di usare abbreviazioni da SMS o meglio da WhatsApp (visti i tempi che corrono :D)?

In futuro eviterò abbreviazioni.

Buona sera. Seguendo i vostri consigli ho risolto il problema aggiungendo una seconda condizione "if" prima del ciclo "for". if (statol== LOW){//condizione di verifica sul pin del ledr .
Questa condizione prima del ciclo "for" mi permette di spegnere il led verde e ritornare allo stato iniziale.