Accensione di due led gestiti da due pulsanti

Buonasera a tutti.
Premetto di essere nuovo del forum (e spero di non aver gia sbagliato categoria) :slight_smile:
Sono anche appena entrato a far parte del mondo arduino.
Ho creato questo semplice Sketch in cui si accende un led con un pulsante per 3 secondi, un altro led con un altro pulsante per 3 secondi e entrambi gli stessi led con un interruttore finche lo stesso non viene riaperto.
Non riesco a trovare il modo per aggiungere queste funzioni:
Quando il led 1 è acceso, vorrei che premendo il pulsante che gestisce il led 2, il led 1 si spegnesse e viceversa.
Se il led 1 o 2 sono accesi e chiudo il pulsante, i led si devono accendere entrambi interrompendo la funzione dei 3 secondi con il pulsante. Quest'ultima cosa la fa, solo che attende che finisca l'accensione del led (i 3 secondi).
Se l'interruttore è chiuso i due led devono rimanere accesi e quindi se si preme il pulsante collegato al led non deve accadere nulla. Anche quest'ultima viene già fatta in automatico.
Spero di essere riuscito a spiegarmi e grazie in anticipo.
Ecco il codice:

int pulsante1;
int pulsante2;
int interruttore;

void setup() {
pinMode(6, INPUT); // pulsante 1
pinMode(7, INPUT); // pulsante 2
pinMode(5, INPUT); // interruttore
pinMode(10, OUTPUT); // led 1
pinMode(11, OUTPUT); // led 2
}

void loop() {
pulsante1 = digitalRead(6);
pulsante2 = digitalRead(7);
interruttore = digitalRead(5);

if (pulsante1 == HIGH) {
digitalWrite(10, HIGH);
delay(3000); // 1" = 125 on Attiny85
digitalWrite(10, LOW);
}

if (pulsante2 == HIGH) {
digitalWrite(11, HIGH);
delay(3000); // 1" = 125 on Attiny85
digitalWrite(11, LOW);
}
  
if (digitalRead (5) == 1) {
    digitalWrite(10, HIGH);
  	digitalWrite(11, HIGH);
  }
  else{
    digitalWrite(10, LOW);
    digitalWrite(11, LOW);
  }
}

Buongiorno e benvenuto nella sezione Italiana del forum,

:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... cortesemente, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15) e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Ciao, pensavo che avrei sicuramente fatto qualche disastro. Ti chiedo scusa e ti ringrazio per aver spostato il mio post nella sezione giusta. Ho fatto la presentazione.
Buona domenica delle Palme

2 Likes

Devi evitare di usare dei delay() cosi lunghi se vuoi che il tuo software sia "reattivo" (anzi in linea di principio, evita i delay() a prescindere).

La stessa cosa che hai fatto con il delay() la puoi implementare in modo non bloccante con qualche istruzione in più usando la funzione millis().

unsigned long pushTime;
....

  if (digitalRead(6)) {
    pushTime= millis();
    digitalWrite(10, HIGH);
  }

  if( millis() - pushTime> 3000) {
    digitalWrite(10, LOW);
  }

@gaquilano: come ti suggerisce "cotestatnt", conviene che studi bene la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che poi ti sarà tutto più chiaro :wink:

Guglielmo

La logica potrebbe essere:

P1 accende il LED 1, che rimane acceso fino allo scadere del tempo, e fa scadere immediatamente il tempo del LED 2, spegnendolo.

P2 si comporta allo stesso modo per LED 2, spegnendo LED 1.

L'interruttore li accende entrambi direttamente e fa scadere entrambi i tempi. Quando viene riaperto, li spegne entrambi.

Impostata la logica, puoi scrivere il programma.

Dipende se con il pulsante opposto vuole solo spegnere, o va bene che si riaccenda subito il LED corrispondente.

Ulteriore caso non specificato: cosa deve succedere se uno tiene un pulsante premuto per più di tre secondi?

Grazie del consiglio cotestatnt, non avevo sentito solo parlare del millis() ma ora cercherò di studiare questa funzione visto lo "sconsiglio" di "delay".

Grazie! Almeno così avrò dei link a portata di mano da leggere senza cercare le cose giuste quà e là come ero solito fare :slight_smile:

"Imposta la logica... scrivi il programma" qualcuno me l'aveva già detta :slight_smile: grazie mille

Si, nel mio schema spegnendo il led 1 si dovrebbe riaccendere subito il led corrispondente... e non avevo neanche pensato al fatto di dover inserire una funzione in caso in cui venisse premuto per più di 3 secondi, credevo non succedesse nulla... almeno su tinkercad non succedeva nulla, che è quello che vorrei. Grazie anche di questo consiglio!

Ragazzi, vi chiedo scusa se rispondo in ritardo, ma sono molto impegnato tra casa lavoro ed altro... invece ringrazio voi che mi avete risposto praticamente in tempo reale! Complimenti per quello che avete creato in questo forum! Siete tutti gentilissimi. Grazie ancora. E appena ho qualche novità su questo basic code vi faccio sapere! PS non vi nego che oltre a studiare scopiazzerò qualche codice in giro :rofl:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.