Problema corrispondenza tra led e pulsanti

Ciao a tutti,

essendo in procinto di utilizzare Arduino a livello hobbystico, un amico mi ha indicato questo forum e mi sono registrato da poco perchè ho già un problema :crazy_face: con uno sketch che semplicemente mette in relazione led e pulsanti.

In pratica, ho Arduino Uno che alimento con un alimentatore esterno a 5V , da cui ho prelevato i 5V e la massa, messi rispettivamente su Vin e uno dei due Gnd della sezione Power, quindi sono passato al collegamento di 5 led L0, L1, L2, L3, L4 con rispettive resistenze, connessi ai pin digitali da D2 a D6 (ho tralasciato D0 e D1 perchè ho letto che a volte ci possono essere conflitti vari ecc...) e quindi ho collegato i 5 pulsanti P0, P1, P2, P3, P4 agli ingressi analogici da A0 ad A4. Allego immagine dello schema che ho seguito.

Bene, se premo P0 o P4, i leds L0 e L4 si accendono correttamente ma non capisco perchè premendo


P2 raramente si accende L2, infatti quasi sempre e in modo random si accendono L1 o L3, poi...se tengo premuto P2 succede che L1, L2 ed L3 sono intermittenti, se tengo premuto P1 sono intermittenti L1 e L2 e se tengo premuto P3 sono intermittenti L2 ed L3. Io penso che lo sketch che ho messo su, non sia adeguato allo scopo infatti ho controllato più volte i collegamenti di resistenze, led e pulsanti e non mi sembra che ci siano delle stranezze. Allego il codice e lo schema :

int pulsante[] = {A0,A1,A2,A3,A4};   
int leds[] =    {2,3,4,5,6};                                                               


void setup()

{

      for (int i=0; i<5; i++)
      {                                   
          pinMode(pulsante[i],INPUT);                             // definisce input e output
          pinMode(leds[i],OUTPUT);                                 
      }                       
  
      for (int i=0; i<5; i++) digitalWrite(leds[i],LOW);          // spegne tutti i Led

}


void loop()                                     
{
      for (int i=0; i<5; i++)                                     // check quale pulsante viene premuto    
      {                          
           if (digitalRead(pulsante[i])==HIGH)                        
                {                                                                                           
                  for (int i=0; i<5; i++) digitalWrite(leds[i],LOW);              // spegni tutti i led
                  digitalWrite(leds[i],HIGH);                                     // accendi il led corrispondente al pulsante premuto              
                  delay(50);                                                      // anti rimbalzo
                }
       } 
  
}

Ciao ciao

Ritiro tutto

Non ho più idee

Ritiro tutto

Il sistema più semplice, salvo usare PORT, è questo:

int pulsante[] = {A0,A1,A2,A3,A4};   
int leds[] =    {2,3,4,5,6};                                                               

void setup()
{
      for (int i=0; i<5; i++)
      {                                   
          pinMode(pulsante[i],INPUT); // In realtà, tutti i pin sono già definiti come ingressi.
          pinMode(leds[i],OUTPUT); // E' utile vedere anche la definizione degli ingressi,
      }                            // ma sarebbe sufficiente definire le uscite.
}   // E' inutile mettere le uscite a livello basso, perché già viene fatto dal pinMode.

void loop()                                     
{
for (int i=0; i<5; i++) 
  {
  digitalWrite (leds[i], digitalRead (pulsante[i]));
  }
}

P.S.: ma il for senza parentesi graffe funziona???...


Esegue solo la prima istruzione ma funziona

Funziona anche col solo ;

Esegue solo se stesso, ma funziona

Anche così funziona:

for (int i=0; i<5; digitalWrite(leds[i++],LOW));

E anche altre cose pure più "perverse"...

Oh, niente, il bottone </> non andava
Ho dovuto esplicitare i tag [ c o d e ]

Chissa perché

Grazie ma ho appena verificato che anche con il tuo esempio mi si presenta l'anomalia dell'accensione contemporanea, con la differenza che, al rilascio del pulsante, il led si spegne e infatti grazie al tuo esempio mi sono ricordato che non ho specificato che il led deve rimanere acceso per tutto il tempo che il pulsante rimane premuto e anche dopo il rilascio del pulsante, fino alla pressione di un nuovo switch, al che si spengono tutti i led e si accende quello interessato.

Al di la di tutto, non si può alimentare a 5V il pin Vin.
O sul pin Vin si entra con 9V, o se si hanno a disposizione 5V si entra direttamente sui pin 5V.

Credo (ma non sono sicuro) che l'errore sia dovuto all'abuso della variabile "i" che nel loop viene inizializzata e usata dai due cicli for

ciao

Qualche resistenza da 10k non fa contatto.
Toglile, attiva le pullup interne nel setup (pinMode... INPUT_PULLUP anziché INPUT), metti i pulsanti verso massa e adegua il codice mettendo un punto esclamativo prima di digitalRead.

Ho provato a sostituire l'indice i con j e il "for" con 5 "if" uno dopo l'altro ma non cambia niente.

Resistenze a posto. Perché punto esclamativo prima di digitalread ? Per negare la lettura, cioè non leggerlo ? Se così, non sarebbe lo stesso di eliminare direttamente il comando ?

Negare la lettura significa invertire il valore letto, non evitare l'azione...

sì certo, mi sono espresso male, intendevo dire che una volta che metto l'esclamativo davanti al digitalread, mi sembra di capire che invertirebbe sempre, cioè anche se il valore sarebbe corretto o no ?

Non esiste il valore corretto

Esiste il valore letto

Usare i pin in pullup richiede di invertire il valore letto

Ah adesso ho capito perchè Datman ha scritto "adegua".....quindi il "!" nel caso usassi il pullup, ok ok. Scusa Datman, mi sembravano due suggerimenti distinti e invece sono uno conseguenza dell'altro. Buono a sapersi :wink:

Ho fatto come dicevi, i pin analogici li ho definiti come pullup e messo il (!) prima del digitalread, ma purtroppo non è cambiato niente. Ho anche voluto fare una verifica diretta senza for e senza led, stampando sul monitor seriale il pulsante premuto, tipo se premo A0, appare A0 e cosi via anche per gli altri, ma niente da fare nemmeno in questo caso, infatti finchè premo A0 e A4, sul monitor stampa correttamente A0 e A4 ma appena premo, per esempio, A2 mi stampa A1, poi A2 poi A1 poi A3 e cosi random per gli altri pulsanti, come se i 3 pulsanti centrali non li riconoscesse. Se invece tolgo il punto esclamativo, li stampa correttamente cioè A0 A1 A2 A3 A4, come se con la logica invertita li riconoscesse, e ho anche provato il tutto su un altro Arduino Uno, stessa roba. Non capisco come sia possibile che se metto in corto il pulsante A2, per esempio, è come se Arduino vrdesse in corto A1 o A3 o A2. Non ha senso questa roba, per di più se si ripete su un secondo Arduino. Inserisco il codice

int pulsante[] = {A0,A1,A2,A3,A4};  



void setup() 

{
  
Serial.begin(9600);

      for (int i=0; i<5; i++) 
        {                                   
          pinMode(pulsante[i],INPUT_PULLUP);  
        }

}


void loop() 

{

  
  if (!digitalRead(A0)==1)
{ Serial.println("A0");
delay(500);
   }



   if (!digitalRead(A1)==1)
{Serial.println("A1");
delay(500);
   }



   if (!digitalRead(A2)==1)
{Serial.println("A2");

delay(500);
   }



   if (!digitalRead(A3)==1)
   
{Serial.println("A3");

delay(500);
   }



   if (!digitalRead(A4)==1)
{Serial.println("A4");

delay(500);
   }

}

Vero, sistemato anche questo. Grazie

Hai cambiato modo di funzionamento, programma e Arduino

Rimangono da cambiare cablaggio dei pulsanti e OP....

Scherzi a parte...
Fai foto dei pulsanti

E prova questo programma:

byte pulsante[] = {7,8,9,10,11};  
#define NUM sizeof pulsante / sizeof pulsante[0]

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

      for (int i=0; i<NUM; i++) 
        {                                   
          pinMode(pulsante[i],INPUT_PULLUP);  
        }
}

 void loop() 
{
  for (int i=0; i<NUM; i++) 
        {                                   
          if (!digitalRead(pulsante[i]))
             {
                 Serial.println(i);
                 delay(500);
             }
       }
}

Usando differenti pulsanti e diversi pin

Grazie, proverò anche a cambiare pin, non l'ho fatto perché volevo capire se fosse un problema di codice, lo farò. I pulsanti sono degli ON-OFF momentanei come questo, sono nuovi di pacca perfettamente funzionanti, collegati adesso in pullup... un polo a massa e l'altro al pin