[Risolto]semaforo con fotocellule e conto alla rovescia

ciao a tutti, possiedo arduino 1, sto realizzando una piccola centralina per dei semafori, l idea e quella di fare in modo che arduino esegua una riga di codice solo se le fotocellule ( o pulsante), e rimasto premuto per piu di 3 secondi, non so propio come fare il conto allarovescia,gentilmente mi potreste aiutate?
grazie a tutti

il codice che ho realizzato e il seguente:
#define verde1 13
#define rosso1 12
#define verde2 11
#define rosso2 10
#define pulsante 7

int val = 0; // conserva lo stato del pin di input

void setup(){
pinMode (verde1, OUTPUT);
pinMode (rosso1,OUTPUT);
pinMode (verde2,OUTPUT);
pinMode (rosso2,OUTPUT);
pinMode (pulsante, INPUT);
digitalWrite(pulsante,HIGH);

}

void loop(){
val = digitalRead(pulsante); // legge

if (val==LOW){
digitalWrite(verde2, LOW);
digitalWrite(rosso2, HIGH);
digitalWrite(rosso1, HIGH);
delay (5000);
digitalWrite(verde1, HIGH);
digitalWrite(rosso2,HIGH);
digitalWrite(rosso1,LOW);
delay(8000);
}
else{
digitalWrite(rosso1,HIGH);
digitalWrite(verde2,HIGH);
digitalWrite(verde1,LOW);
digitalWrite(rosso2, LOW);

}
}

Devi usare la funzione millis, che restituisce il numero di millisecondi dall'avvio di Arduino.
Quando rilevi il passaggio dalla fotocellula (o la pressione del pulsante), imposti una variabile con il contenuto di millis sommato all'intervallo che vuoi misurare, metti una variabile booleana a trueed entri in un ciclo while. All'interno del ciclo devi leggere costantemente il pin a cui hai collegato il sensore/pulsante. Nel momento in cui cambia di stato, esci dal while con break.
Altrimenti la condizione di chiusura del ciclo while è che millis sia maggiore del valore di millis sommato all'intervallo. Al di fuori del while controlli la variabile booleana: se è false, allora sei uscito dal ciclo per disattivazione della lettura (vuol dire che l'utente ha tolto il dito dal pulsante), se è true, significa che il sensore/pulsante è rimasto attivato per più dell'intervallo.

In pseudocodice:

uscita_programmata = millis + intervallo
pressione_continua = true
do
  if (lettura_sensora != stato_programmato)
    pressione_continua = false
    break
  endif
while (millis <= uscita_programmata)
if (pressione_continua == true) 
  ....sensore interrotto per tutto l'intervallo
else
  ....dito staccato prima del tempo
endif

Te l'ho messo in pseudo codice perché devi essere tu a riportarlo in linguaggio Arduino, altrimenti non impari

Ciao, grazie per l aiuto! Solo non riesco a capire lostesso, sono alle prime armi, ad esempio nel setup devo mettere qual cosa? E nel loop? Grazie

Il controllo lo devi inserire nel loop al posto del tuo attuale check dello stato del pin collegato al sensore/pulsante. Poi la logica di lampeggio la metti successivamente.

ci sto provando in tutte le maniere prendendo spunto dai link di millis ecc, solo non riesco :fearful:
potresti aiutarmi un po di piu?
grazie

Modifichi il loop così:

void loop() {
  unsigned long uscita_programmata = millis() + 3000; //3 secondi
  boolean pressione_continua = true;
  do {
    if (digitalRead(pulsante) == HIGH) { //oppure LOW, dipende dalla logica di funzionamento del tuo pulsante
      pressione_continua = false;
      break;
    }
  } while (millis() <= uscita_programmata);
  if (pressione_continua == true) {
    //  ....sensore premuto per tutto l'intervallo
  } else {{
    //  ....dito staccato prima del tempo
  }

}

``arrivo fino a qui ma credo sia un gran casino

#define verde1 13
#define rosso1 12
#define verde2 11
#define rosso2 10
#define pulsante 7

int val = 0; // conserva lo stato del pin di input

void setup(){
pinMode (verde1, OUTPUT);
pinMode (rosso1,OUTPUT);
pinMode (verde2,OUTPUT);
pinMode (rosso2,OUTPUT);
pinMode (pulsante, INPUT);
digitalWrite(pulsante,HIGH);
}

void loop(){
val = digitalRead(pulsante);
// legge
if (val==LOW){
uscita_programmata = millis + 3000;
pressione_continua = false
do
if (lettura_sensora != stato_programmato)
break
endif
while (millis <= uscita_programmata)
if (pressione_continua == true)
digitalWrite(verde2, LOW);
digitalWrite(rosso2, HIGH);
digitalWrite(rosso1, HIGH);
delay (5000);
digitalWrite(verde1, HIGH);
digitalWrite(rosso2,HIGH);
digitalWrite(rosso1,LOW);
delay(8000);

}
else{
digitalWrite(rosso1,HIGH);
digitalWrite(verde2,HIGH);
digitalWrite(verde1,LOW);
digitalWrite(rosso2, LOW);

}
}

GRAZIE GRAZIE GRAZIE MILLE per l enorme aiuto che mi hai, da solo non credo proprio che c e l avrei fatta,
funziona benissimo

se potesse tornare utile ad altri utenti:

 #define verde1 13
 #define rosso1 12
 #define verde2 11
 #define rosso2 10
 #define pulsante 7
 
 int val = 0; // conserva lo stato del pin di input
 
 void setup(){
   pinMode (verde1, OUTPUT);
   pinMode (rosso1,OUTPUT);
   pinMode (verde2,OUTPUT);
   pinMode (rosso2,OUTPUT);
   pinMode (pulsante, INPUT);
   digitalWrite(pulsante,HIGH);
 }
 

void loop() {
  unsigned long uscita_programmata = millis() + 3000; //3 secondi
  boolean pressione_continua = true;
  do {
    if (digitalRead(pulsante) == HIGH) { //oppure LOW, dipende dalla logica di funzionamento del tuo pulsante
      pressione_continua = false;
      break;
    }
  } while (millis() <= uscita_programmata);
  if (pressione_continua == true) {
     digitalWrite(verde2, LOW);
     digitalWrite(rosso2, HIGH);
     digitalWrite(rosso1, HIGH);
     delay (5000);
     digitalWrite(verde1, HIGH);
     digitalWrite(rosso2,HIGH);
     digitalWrite(rosso1,LOW);
     delay(8000);
    //  ....sensore premuto per tutto l'intervallo
  } else {digitalWrite(rosso1,HIGH);
     digitalWrite(verde2,HIGH);
     digitalWrite(verde1,LOW);
     digitalWrite(rosso2, LOW);
    //  ....dito staccato prima del tempo
  }
}

Ti ringrazio per i... ringraziamenti :sweat_smile:

Ti chiedo però di editare il tuo messaggio e racchiudere il codice all'interno degli appositi tag CODE che compaiono cliccando sull'icona "#" sopra alle faccine, almeno è più leggibile.

Scusa l ignoranza ma come devo fate per editare?
Per il codice credo di aver capito

Modifichi il tuo post, cliccando su "modify" proprio sopra ad esso. E poi racchiudi il codice come ti ho detto.