Pulsanti in serie

Buonasera ,nella ottica dello studio e di apprende mi sono cimentato nella realizzazione di pulsanti in serie modificando uno sketch che ho trovato in rete aggiungendo la difficoltà di aggiungere un ulteriore pulsante ebbene funziona tutto o quasi infatti premendo il 4 pulsante si accende lo stesso led del terzo mi aiutate a capire ricordandovi che

1 ho 50 anni e mi sono avvicinato da 20 di giorni
2 non sono diplomato ma so lavorare la terra
3 già sono stato richiamo dal programma “Avete scoperto il Borges che c’è in voi”

segue lo sketch modificato per le mie necessita…

/* Sergio & Adriano Prenleloup

18 /04/ 2013
Pulsanti con Anolog Read V. 2.0
Pulsanti con Anolog Read V. 2.0

con questo sketch si utilizzano 3 pulsanti(----io ne ole
con un solo pin analogico.

Si realizza un partitore di tensione con quattro reistenze resistenze
e con la pressione di un pulsante sul piedino analgico
si presenterà una tensione diversa a seconda di quale pulsante è stato premuto
Il programma quindi attiverà la funzione voluta dal pulsante premuto

In questo caso accenderemo dei led diversi.
E’ possibile estendere il sistema a più pulsanti ed attivare funzioni diverse.

*/


// pin digitali per accendere i led
int Led_Rosso  = 12;
int Led_Giallo = 11;
int Led_Verde = 8;
int Led_Bianco = 6;

// pin analogico
int analogPuls = A1;

// pulsante numeri
// i numeri sotto si riferiscono ai valori di tensione
// previsti VPulsante/(5V/1024) = Numero compreso fra 0 e 1023
// I valori sono indicativi da aggiustare con i veri valori
// dipendenti dalle tolleranze delle resistenze e dalla tensione
// effettiva sul pin 5V.

//  valori centrali della tensione sul pin A1
int V_Rosso =  445;   
int V_Giallo = 347;   
int V_Verde  = 207;   
int V_Bianco  = 0;   

//stato corrente dei bottoni
int stato_bottoni[3];     // vettori per il controllo bottoni
boolean stato_switch[3];  


// variabili di controllo  letture
int PulsRosso =  0;  
int PulsGiallo = 0;   
int PulsVerde  = 0;
int PulsBianco  = 0;   
int val = 10;
int dev = 20;   // Valore che viene aggiunto e sottratto al valore
               // centrale di tensione dei singoli pulsanti
               // tale valore può essere più piccolo per aumentare
               // il numero dei pulsanti

void setup ()
{
// pin analogico che legge i 4 pulsanti
pinMode( analogPuls, INPUT);

// pin digitali dei led
pinMode (Led_Rosso, OUTPUT);
pinMode (Led_Giallo, OUTPUT);
pinMode (Led_Verde, OUTPUT);
pinMode (Led_Bianco, OUTPUT);

stato_bottoni[0] = 0;
stato_bottoni[1] = 0;
stato_bottoni[2] = 0;
stato_bottoni[3] = 0;


digitalWrite (Led_Rosso, LOW);
digitalWrite (Led_Giallo, LOW);
digitalWrite (Led_Verde, LOW);
digitalWrite (Led_Bianco, LOW);



}


// questo codice sostituisce la "digitalRead" 
// dopo la lettura analogica si assegna
// il valore 1 al pulsante che è stato premuto
// e si mettono a 0 i pulsanti non premuti

void LeggiPulsante()  
  {
    val = 0;
    PulsRosso = 0;
    PulsGiallo = 0;
    PulsVerde = 0;
    PulsBianco = 0;
    
    val =  analogRead (analogPuls);      

         if ((val <= (V_Rosso + dev)) && (val > (V_Rosso - dev)))   
          { PulsRosso = 1;}
   
         if ((val <= (V_Giallo + dev)) && (val > (V_Giallo - dev)))
           { PulsGiallo = 1;}
    
         if ((val <= (V_Verde + dev)) && (val > (V_Verde - dev)))
           { PulsVerde = 1;} 
         
         if ((val <= (V_Bianco + dev)) && (val > (V_Bianco - dev)))
           { PulsVerde = 1;}  

}   


void aggiornaStato(int bottone, int& statoBottoneVecchio, boolean& statoSwitch)
{
//Si legge lo stato corrente del bottone (se premuto o no)
  int statoBottoneCorrente = bottone;   // qui non si usa digitalRead in quanto i
                                        // pulsanti sono stati letti dalla LeggiPulsante
 
//Se lo stato corrente del bottone è cambiato (diverso dal vecchio stato)
//si deve gestire il nuovo stato
if (statoBottoneCorrente != statoBottoneVecchio)
{
    //se stiamo passando da rilasciato a premuto allora gestiamo la 
    //logica antirimbalzo e attiviamo/disattiviamo lo swith
   if (statoBottoneCorrente == HIGH)
   {
     delay(15);
     statoSwitch = !statoSwitch;
   }
   //il nuovo stato diventa lo stato corrente
   statoBottoneVecchio = statoBottoneCorrente;  
}
}

void controllaPulsante()
{
  aggiornaStato(PulsRosso, stato_bottoni[0], stato_switch[0]);
  aggiornaStato(PulsGiallo, stato_bottoni[1], stato_switch[1]);
  aggiornaStato(PulsVerde, stato_bottoni[2], stato_switch[2]);
  aggiornaStato(PulsBianco, stato_bottoni[3], stato_switch[3]);
}


void EseguiComandi()
{
 //**** Gestione Led Rosso, con Pulsante Rosso

if (stato_switch[0] == 1)

{  
  digitalWrite(Led_Rosso, HIGH);   
}   
else
{  
  digitalWrite(Led_Rosso, LOW);    
}  

//**** Gestione Led Giallo, con Pulsante Giallo

if (stato_switch[1] == 1)

{  
  digitalWrite(Led_Giallo, HIGH); 
}   
else
{  
  digitalWrite(Led_Giallo, LOW);    
}  

//***** Gestione Led Verde con Pulsante Verde

if (stato_switch[2] == 1)

{  
  digitalWrite(Led_Verde, HIGH);   // accende il led  
}   
else
{  
  digitalWrite(Led_Verde, LOW);    //spegne il led  
}  
 //***** Gestione Led bianco con Pulsante bianco

if (stato_switch[3] == 1)

{  
  digitalWrite(Led_Bianco, HIGH);   // accende il led  
}   
else
{  
  digitalWrite(Led_Bianco, LOW);    //spegne il led  
}  
}
  

void loop()
{
  
 LeggiPulsante();
 controllaPulsante();
 EseguiComandi();
 
 delay (100);

}

Grazie
Giuseppe

Lodevole il fatto che a 50 anni e senza alcuna esperienza tu voglia affrontare questo mondo.

Se vuoi partire in modo corretto, devi studiare qualche libro non solo su Arduino e la sua programmazione, ma anche di elettronica di base.

Tornando al tuo sketch, ti ricordo che devi inserirlo il codice con il tag “</>” in alto a sinistra.

E’ piuttosto dispersivo e non è il massimo per imparare.

Inoltre, il metodo del partitore di tensione per rilevare la pressione di un pulsante presenta un difetto: non puoi rilevare la pressione contemporanea di più pulsanti.

Il problema da te rilevato potrebbe essere causato dai valori di trigger assegnati ai pulsanti, che potrebbero essere sbagliati:

  int V_Rosso =  445;   
  int V_Giallo = 347;   
  int V_Verde  = 207;   
  int V_Bianco  = 0;

In particolare, gli ultimi due: prova a cambiare i valori da 200 a 250 per il terzo e da 0 a 50 per il quarto.

**>SanGiuseppe: **ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (in basso a destra del post, bottone More → Modify) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

Grazie,libri tutorial elettronica li sto divorando il problema e che alla mia età l’acquisizione di informazioni e gap scolastico non aiuta detto cio tali valori le recuperati da questo

sketch

/*
AnalogReadSerial
Reads an analog input on pin 0, prints the result to the serial monitor.
Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

This example code is in the public domain.
*/

void setup() {
Serial.begin(9600);
}

void loop() {
int sensorValue = analogRead(A1);
Serial.println(sensorValue);
delay(500);
}

e mi da li ho prelevato i valori che ho indicato
nel frattempo ho provato quanto suggerito sono una sequenza di 10 ma nulla da fare anzi no i tasti 3 4 non accendo nesun led

cosa intedi inserirlo il codice con il tag “</>” in alto a sinistra. io ide
come da foto allegata prima verifico e poi invio

Grazie della pazienza

Giuseppe

SanGiuseppe:
cosa intedi inserirlo il codice con il tag “</>” in alto a sinistra. io ide
come da foto allegata prima verifico e poi invio

Intendo esattamente quello che ho scritto nel post #2 … il codice DEVE essere racchiuso negli appositi tag CODE … nel post ti ho spiegato come fare … fallo per entrambi i post in cui hai messo del codice.

Il risultato deve essere questo:

riga di codice
riga di codice
riga di codice
...

Guglielmo

Cosi spero di si e un po presto per sbattermi fuori :(

SanGiuseppe: Cosi spero di si e un po presto per sbattermi fuori :(

:D :D :D ... Si, così va bene ;)

Guglielmo

Sarebbe necessario vedere lo schema di collegamento.

ok in serata provo ad usare il friz cosi faccio bella figura :)

Meglio anche un semplice schema disegnato a mano…