Primo post, mi presento e chiedo il supporto per un circuito con LED

Ciao a tutti, innanzitutto mi presento.
Mi chiamo Vincenzo e studio ingegneria dell’automazione. Sto seguendo e ho dato esami di informatica(programmazione) ed elettronica, quindi ho una conoscenza “universitaria” sull’elettronica e sulla programmazione.

Premetto che ho comprato e letto il “Getting started with Arduino” di Banzi e fino ad adesso ho “giocato” con il solito “Hello word” dell’elettronica. Non nego che anche sui primi test ho avuto difficoltà con le resistenze, infatti nonostante abbia capito come leggere una resistenza, ho avuto ed ho problemi a scegliere quella adatta.

Inoltre ho comprato lo “Starter kit” con arduino UNO nel quale era anche presente il “Arduino Projects Book” dal quale ho preso le informazioni riguardo le resistenze utilizzate nel seguente circuito

Passando adesso al corpo di questo Post.
avevo l’idea di usare ciò che ho imparato dai libri sopracitati; cioè costruiro un circuito con 4 led e 4 “switch”.
L’idea è la seguente:

1)fare accendere il dispositivo premendo il tasto 1 accendendo i led contemporaneamente per 5 secondi e nel caso questo fosse premuto per la seconda volta i led lampeggiano facendo capire che il dispositivo è andato in “errore”.

2)Se il dispositivo è “acceso”(tasto 1 “on”), premendo il tasto 2 i 4 led iniziano a fare Kit di “superkar”(si acendono e si spengono in sequenza), altrimenti i led vengono spenti tutti contemporaneamente.

3)Sempre se il dispositivo è acceso, premendo il tasto 3 i led vengono accesi tutti e 4 come se fossero una “lampadina” colorata, altrimenti se il tasto 3 è “off” vengono spenti.

4)Se il dispositivo è acceso, premendo il tasto 4 verrà effettuato un “fade out” spegnendo il dispositivo.

Logicamente parlando il sistema è molto semplice.

Questo è il codice che ho scritto utilizzando la forma del codice del “Getting Started With Arduino”:

// super car

const int led_R = 11;    //sono tutti led PWM per il tasto 4
const int led_B = 10;
const int led_G = 9;
const int led_Y = 6;

const int botton_1 = 2;  //premere per accendere il dispositivo
const int botton_2 = 3;  //super car
const int botton_3 = 4;  //accende tutti i led
const int botton_4 = 5;  //premere per spegnere il dispositivo



int val_1 = 0;
int old_val_1 = 0;
int state_1 = 0;

int val_2 = 0;
int old_val_2 = 0;
int state_2 = 0;

int val_3 = 0;
int old_val_3 = 0;
int state_3 = 0;

int val_4 = 0;
int old_val_4 = 0;
int state_4 = 0;


void setup()
{
  pinMode(led_R, OUTPUT);
    pinMode(led_B, OUTPUT);
      pinMode(led_G, OUTPUT);
        pinMode(led_Y, OUTPUT);
        
    pinMode(botton_1, INPUT);
        pinMode(botton_2, INPUT);
            pinMode(botton_3, INPUT);
                pinMode(botton_4, INPUT);
}

void loop()



{
  val_1 = digitalRead(botton_1);
    val_2 = digitalRead(botton_2);
      val_3 = digitalRead(botton_3);
        val_4 = digitalRead(botton_4);
  
  
  //        TASTO 1    premere per accendere il dispositivo
  
  if((val_1 == HIGH) && (old_val_1 == LOW))
  {
    state_1 = 1 - state_1;
    delay (10);
  }
  old_val_1 = val_1;
  
  if(state_1 == 1)     //accende i led per 5 secondi se è acceso
  {
    digitalWrite(led_R, HIGH);
        digitalWrite(led_B, HIGH);
            digitalWrite(led_G, HIGH);
                digitalWrite(led_Y, HIGH);
                
                delay(5000);
                
    digitalWrite(led_R, LOW);
        digitalWrite(led_B, LOW);
            digitalWrite(led_G, LOW);
                digitalWrite(led_Y, LOW);
  }
  else    //va in errore, cioè lampegga per 100 volte, se premi 2 volte il tasto di accensione, c'è il tasto di spegnimento fatto apposta per poter spegnere il dispositivo
  {
    for(int i = 0; i < 100; i++)
    {
        digitalWrite(led_R, LOW);
           digitalWrite(led_B, LOW);
              digitalWrite(led_G, LOW);
                  digitalWrite(led_Y, LOW);
                  
                  delay(1000);
                  
        digitalWrite(led_R, HIGH);
            digitalWrite(led_B, HIGH);
                digitalWrite(led_G, HIGH);
                    digitalWrite(led_Y, HIGH);
                    
                    delay(1000);
    }
  }
  
  //        TASTO 2     premere per superCar
  
  
    
  if((val_2 == HIGH) && (old_val_2 == LOW))
  {
    state_2 = 1 - state_2;
    delay (10);
  }
  old_val_2 = val_2;
  
  if((state_2 == 1) && (state_1 == 1))
  {
    for(int s = 0; s < 50; s++)
    {
      
        digitalWrite(led_R, HIGH);
        delay(50);
            digitalWrite(led_B, HIGH);
            digitalWrite(led_R, LOW);
            delay(50);
                digitalWrite(led_G, HIGH);
                digitalWrite(led_B, LOW);
                delay(50);
                    digitalWrite(led_Y, HIGH);
                    digitalWrite(led_G, LOW);
                    delay(50);
                    
                    
                        digitalWrite(led_G, HIGH);
                        digitalWrite(led_Y, LOW);
                        delay(50);
                            digitalWrite(led_G, LOW);
                            digitalWrite(led_B, HIGH);
                            delay(50);
                                digitalWrite(led_B, LOW);
    }
  }
else      //spegne tutti i led
  {
        digitalWrite(led_R, LOW);
           digitalWrite(led_B, LOW);
              digitalWrite(led_G, LOW);
                  digitalWrite(led_Y, LOW);
                  
                  
    
  }
  
  
  //tasto 3    premere per tenerli accesi tutti contemporaneamente
  
  if((val_3 == HIGH) && (old_val_3 == LOW))
  {
    state_3 = 1 - state_3;
    delay (10);
  }
  old_val_3 = val_3;
  
  if((state_3 == 1) && (state_1 == 1))
  {
    
          digitalWrite(led_R, HIGH);
            digitalWrite(led_B, HIGH);
                digitalWrite(led_G, HIGH);
                    digitalWrite(led_Y, HIGH);
  }
  else
  {
        digitalWrite(led_R, LOW);
           digitalWrite(led_B, LOW);
              digitalWrite(led_G, LOW);
                  digitalWrite(led_Y, LOW);
  }
  
  //tasto 4    spegne il dispositivo, si accendono e cala la luminosità
  
  
  if((val_4 == HIGH) && (old_val_4 == LOW))
  {
    state_4 = 1 - state_4;
    delay (10);
  }
  old_val_4 = val_4;
  
  if((state_4 == 1) && (state_1 == 1))
  {
    

    
    for(int b= 255; b > 0; b--)
    {   
    analogWrite(led_R, b);
    analogWrite(led_B, b);
    analogWrite(led_G, b);
    analogWrite(led_Y, b); 

    }
  
  delay(20);            
  }
}

Il programma in sé per sé compila, ma quando lo vado ad integrare con il circuito qui sotto riportato non funziona. sì+ solo un continuo lampeggiare del led blu.


Per il circuito credo che il mio più grande problema siano le resistenze.

Come descritto nel “Arduino Projects Book” ho utilizzato resistenze da 220 Hom tra il catodo del led e il GND(terra) dell’arduino;
mentre per i tasti ho utilizzato delle resistenze da 10K Hom collegati come potete vedere nelle fotografie sottoriportate.

Più che un aiuto, avrei bisogno del consiglio di qualcuno più esperto che mi indichi se la via intrapresa è quella giusta; sia per lo sketch sia per il circuito.

Grazie mille in anticipo.

Prova a controllare con un tester ai capi dei led spenti per vedere se ci sia tensione oppure no. Se c'è tensione è un errore di calcolo della resistenza, i vari colori possono avere tensioni di soglia diverse. Con che frequenza si accende il blu? continua a lampeggiare all'infinito? Ciao Carlo.

Ciao Valisi,

oggi pomeriggio quando potrò controllerò le tensioni ai capi dei LED così da capite se il roblema principale sono le resistenze.

Per quanto riguarda la parte software, è giusta? o almeno la strada instrapresa è giusta?

La strada intrapresa è giusta... :) toglierei l'else e le sue istruzioni altrimenti, all'accensione, senza premere alcun pulsante, andrà subito in loop "errore", perchè l'else l'hai messo su un if che controlla se il tasto sia premuto, e se il tasto non è premuto, entra nel loop di lampeggio e ci rientra continuamente ad ogni ciclo del loop di arduino. Poi devi mettere un flag di accensione avvenuta (e mettere il controllo con un && anche nell'if) altrimenti continua ad accenderti il led per 5 secondi ad ogni loop di arduino dopo che sia stato premuto il pulsante. PS ricordati di mettere delle resistenze di pull down ai pulsanti. Ciao. Carlo.