Ho dei problemi sulla programmazione di arduino

Buongiorno a tutti, sono Federico e sono otto anni che non programmo più e mi sono dimenticato molte cose avrei bisogno di un aiuto a programmare Arduino uno perché da solo non riesco a fare quello che vorrei adeso vi spiego di cosa avrei bisogno.
ho due pulsanti collegati sul pin 5 e 6 che sono due entrate e dovrei andare a comandare 3 uscite. Se premo il primo pulsante si attiva l'uscita sul pin 9 e se premo il secondo si attiva l'uscita sul pin 10 e se premo tutti e due i pulsanti contemporaneamente mi si attiva luscita sul pin 11 lasciando il pin 9 e 10 disattivati.
vi lascio il codice che avrei scritto ma non funziona completamente:

int pin1 = 5;
int pin2 = 6;
int pin3 = 9;
int pin4 = 10;
int pin5 = 11;
int value1 = 0
int value2 = 0;

void setup ()
  {
    Serial.begin(9600); 
    pinMode (pin1, INPUT);
    pinMode (pin2, INPUT);
    pinMode (pin3, OUTPUT);
    pinMode (pin4, OUTPUT);
    pinMode (pin5, OUTPUT);
    digitalWrite (pin3, LOW);
    digitalWrite (pin4, LOW);
    digitalWrite (pin5, LOW);
  }

void loop ()
  {
    value1 = digitalRead (pin1);
    value2 = digitalRead (pin2);

    if (value1 == HIGH)
    {
      if (value2 == HIGH)
      {
        digitalWrite (pin5, HIGH);
      }
      
      else
      {
        digitalWrite (pin3,HIGH);
      }
    }
    
    else if (value2 == HIGH)
    {
      digitalWrite (pin4, HIGH);
    }
    
    else
    {
      digitalWrite (pin3, LOW);
      digitalWrite (pin4, LOW);
      digitalWrite (pin5, LOW);
    }
    
    Serial.print (value1);
    Serial.print (value2);
  }

ho notato anche che se rilascio il pulsante passano almeno 5 sec prima che si disattivi l'uscita invece che essere quasi immediato come dovrebbe essere. sapreste dirmi il perché?
se potete aiutarmi sarei felice.
Cordiali Saluti
Federico

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, (prestando molta attenzione al punto 15) e poi, come da suddetto regolamento, 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 ...

... infine, come richiesto al punto 7 del succitato regolamento, per favore edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione e sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte verrebbero temporaneamente nascoste), quindi ti consiglio di farla al più presto. :wink:

Ma i pin che vanno hai pulsanti, quando il pulsante NON è premuto, a cosa vengono collegati ?

Puoi mettere un piccolo schema, anche fatto a mano?

Guglielmo

devo andare a comandare 3 relè con i due pulsanti quando si preme il primo si attiva solo il primo relè, quando si preme il secondo si attiva solo il secondo relè e quando si premono tutti e due i pulsanti insieme si attiva solo il terzo relè

... si, non mi interessano le funzioni, mi interessa come li hai collegati e ... così proprio NON va bene.

Gli ingressi digitali di Arduino sono ad alta impedenza ed abbiamo detto e ripetuto molte volte, che NON debbono mai essere lasciati "volanti" (non collegati a nulla) perché la loro lettura divventa del tutto inaffidabile.

Hai due possibilità ...

  1. se vuoi verificare la chiusura verso Vcc, allora devi connettere i pin di Arduino (che usi come INPUT) ciascuno ad una resistenza verso massa da circa 10 KΩ così da tenere il pin normalmente a LOW e permettere di accorgersi quando va HIGH per la pressione del pulsante.

  2. se invece fai la chiusura verso GND, allora non ti serve altro, se non cambiare la definizione della pinMode trasformandola in pinMode (numeroPin, INPUT_PULLUP); così da attivare la resistenza di pull-up interna che terrà il pin normalmente HIGH mentre il pulsante lo porterà LOW.

In entrambi i casi di segnalo che hai anche un problema di "debouncing" visto che nessun pulsante reale chiude ed apre perfettamente in una condizione senza rimbalzi e quindi ... dovrai risolvere anche quella.

Guglielmo

vi lascio il codice che avrei scritto ma non funziona completamente

Ehi, è la stessa cosa che ho detto al meccanico: "puoi dare un'occhiata all'auto, non funziona completamente", vuoi sapere la risposta? :stuck_out_tongue:

Hai gestito correttamente la condizione pulsante1 E pulsante2, ma non hai fatto lo stesso con la condizione pulsante2 E pulsante1.

come faccio a risolvere il debouncing?

Intanto chiariamo il concetto ...

Quando premi (o rilasci) un pulsante, nella realtà, succede questo:

image

... che, alla velocità con cui gira il loop() di Arduino, ti darà NON una, ma una SERIE di aperture e chiusure del pulsante.

Per evitare il problema, due sono le soluzioni, una software, che usa dei delay() ed una hardware che usa una rete integratrice R/C ... io preferisco quella hardware che evita inutili rallentameneti del programma:

Guglielmo

quindi per risolvere il problema basta utilizzare il pullup interno e collegare il pulsante a massa e tra il pulsante e il PIN inserire una resistenza da 100 al +?

Ma lo hai guardato bene lo schema ? ? ? :open_mouth:

Io vedo una 100Ω in serie ed un condensatore da 22nF verso massa ... :roll_eyes:

Guglielmo

Già pure io vedo quello che hai descritto. :laughing:

Ciao.

ma allora il pulsante dove va collegato? prima della resistenza?

... beh ... dove c'è scritto "contatto" :slight_smile:

Guglielmo

Sì...

Contato lo ho contato, il pulsante...

Uno è

Adesso che lo ho contato, me lo dici dove va?

PS
Se mi sono meritato il ban procedi pure, ma in fretta, niente agonie, per cortesia

MyGod

... per questa battutaccia il BAN te lo meriteresti veramente ! :smiling_imp:

Guglielmo

si ok scusa. quindi se faccio così dopo dovrebbe andare il programma senza intoppi

... emmm ...

Guglielmo

Riguardando bene no, la logica gestisce tutte le combinazioni, mi sono confuso con le parentesi che sono pure scritte bene, per cui i problemi potrebbero dipendere in effetti solo dalla mancanza di pull-up/down.

Il debounce in questo caso specifico (semplice logica combinatoria senza stati che comanda lenti relé) potrebbe essere un falso problema per via dell'inerzia dei relé stessi.

Quindi nello schema iniziale mancano solo le resistenze di pull-down tra gli ingressi e GND.

ok grazie allora appena riaprono i negozi vado a comprare i condensatori e provo e vi faccio sapere. grazie