problema con la programmazione di un semaforo con chiamata pedonale

ho scritto questo programma il problema è che quando premo il tasto non viene letto a meno che non stia ricominciando il ciclo come posso risolvere questo problema grazie in anticipo per le risposte :slight_smile:

int v1 = 13;                    
int g1 = 12;
int r1 = 11;
int p1 = 2;
int v2 = 9;
int g2 = 8;
int r2 = 7;
void setup() { 
pinMode(v1,OUTPUT);
pinMode(g1,OUTPUT);
pinMode(r1,OUTPUT);
pinMode(p1,INPUT);
pinMode(v2,OUTPUT);
pinMode(g2,OUTPUT);
pinMode(r2,OUTPUT);
}
void  leggi(int p1){
  digitalRead(p1);  //controlla pulsante//
  delay (12);}
  void loop() {  //inizio ciclo semaforo//
if (digitalRead(p1)== LOW){                  //se lo stato è basso esegui questo//
 digitalWrite(v1,HIGH);           //verde acceso //
digitalRead(p1);
 digitalWrite(g1,LOW);
 digitalWrite(r1,LOW);
 digitalWrite(v2,LOW);
 digitalWrite(g2,LOW);
 digitalWrite(r2,HIGH);
 delay(4000);                     //tempo in cui il verde è acceso//
 digitalWrite(v1,LOW);
 digitalRead(p1);
 digitalWrite(g1,HIGH);           //giallo acceso//
 digitalWrite(r1,LOW);
 digitalWrite(v2,LOW);
 digitalWrite(g2,LOW);
 digitalWrite(r2,HIGH);
 delay(2000);                     //tempo in cui il giallo è acceso//
 digitalWrite(v1,LOW);
 digitalRead(p1);
 digitalWrite(g1,LOW);
 digitalWrite(r1,HIGH);           //rosso acceso//
 digitalWrite(v2,LOW);
 digitalWrite(g2,LOW);
 digitalWrite(r2,HIGH);
 delay(4000);                     //tempo in cui il rosso è acceso//
 }
else {                            //se lo stato è alto esegui questo//
  delay (1000);
  digitalWrite(v1,LOW);
digitalWrite(g1,LOW);
  digitalWrite(r1,HIGH);
  digitalWrite(v2,HIGH);
  digitalWrite(g2,LOW);
  digitalWrite(r2,LOW);
  delay(4000);
  digitalWrite(v1,LOW);
  digitalWrite(g1,LOW);
  digitalWrite(r1,HIGH);
  digitalWrite(v2,LOW);
  digitalWrite(g2,HIGH);
  digitalWrite(r2,LOW);
  delay(2000);
  digitalWrite(v1,LOW);
  digitalWrite(g1,LOW);
  digitalWrite(r1,HIGH);
  digitalWrite(v2,LOW);
  digitalWrite(g2,LOW);
  digitalWrite(r2,HIGH);
}
}

Stop using the delay() function. Look at the BlinkWithoutDelay example in the IDE

Davide96, ti prego di rispettare il regolamento, nello specifico devi includere il codice usando gli appositi tag e devi postare usando la lingua appropriata alla sezione in cui pubblichi i tuoi messaggi.
Il tuo post è stato spostato perché hai scritto in italiano nella sezione internazionale dove si deve usare l'inglese.

Davide benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Come detto da @UKHeliBob, non puoi usare la delay(), in quanto è bloccante.
Prova a vedere l'esempio BlinkWithoutDelay che usa la millis()

Dovresti usare quel che si dice "Macchina a stati finiti"
www.lucadentella.it/2013/04/30/macchina-a-stati-finiti-e-arduino/
Lo stato del semaforo è il colore e normalmente passa da un o stato all'altro in base al tempo trascorso (in questo la millis() ti può aiutare). Ma anche la pressione del tasto può variare lo stato.
Tenendo conto che se premo il tasto quando il semaforo è già rosso o giallo, non devi sentirlo.
Il semaforo per il pedone dovrebbe seguire un pò quello delle auto. Io però inizierei con un semaforo.

Solo un appunto, questi:

int v1 = 13;

puoi scriverli:

const byte v1 = 13;

Scusa Nid, ma gliel'ho già detto io 3/4 d'ora fa di leggersi il regolamento :wink:

Il semaforo a tre luci o due, non mi ricordo.

Comunque comincia con il creare 3 (o 2) funzioni che accendono il led.

esempio:

const byte PIN_REDLAPM = 11; // pin a cui è connesso il led rosso    

enum { RedStateEnter, RedState, RedStateExit
            , GreenStateEnter, GreenState, GreenStateExit
            , YellowStateEnter, YellowState, YellowStateExit
            };

byte semaphorePreviousStare = GreenState;     // salva lo stato precedente del semaforo
byte semaphoreCurrentState = GreenState;      // salva lo stato corrente del semaforo

void setRedLamp( boolean tf ) 
{
     digitalWrite(PIN_REDLAMP, tf);
} 

// crea tu l'altre due funzioni 
void setGreen....

Questo modo di procedere si chiama sviluppo dal basso verso l'alto.
Prima di scrivere il codice si deve analizzare il problema al fine di trovare un algoritmo
flessibile oltre che funzionale. Se chiedo ad un semaforo di cambiare stato, esso conosce lo stato in cui si trova
e conosce qual'è lo stato successivo. Esempio se il semaforo si trova nello stato GreenState allora la luce verde è
accesa, nel cambiamento di stato richiesto esso sa che deve passare da GreenState passando gli stati GreenStateExit, YellowStateEnter, YellowState e rimanere in questo stato fino alla nuova richiesta di cambio stato.

I nomi assegnati alle variabili devono essere significativi per chi legge il programma:
Se scrivi v1 per verde1 mica si capisce come scrivere greenLed per riferirsi in modo generico al led verde.
Se ci riferiamo al pin a cui è connesso il led verde allora pinNumberGreenLed.

Prova a seguire i consigli, sistema il codice al fine di renderlo pi√Ļ leggibile e comprensibile.

PS: non ho il codice pronto e funzionante per un semaforo, in pi√Ļ il codice per realizzare un semaforo
può essere realizzato in tantissimi modi.

Ciao.