Regolazione intensità di tre led con un pulsante

Ciao a tutti,
sto sviluppando un programma che regoli la luminosità di tre led (tramite un trimmer) che si vanno a selezionare tramite un pulsante.
Start led spenti, premendo il pulsante si accende led 1, tramite trimmer si regola la luminosità, premendo una seconda volta il pulsante si passa a regolare la luminosità del secondo led e così via.

ho provato con questo sketch ma non funziona a dovere

int Valore_Button;//Variabile dello stato del pulsante.
int Stato_Sistema=0;//Variabile dello stato del sistema.
// variabile in cui verrà memorizzato il valore presente sul pin A0
int misura=0;

int pinLed=11;

int val=0;

int inputVal=0;
void setup() {
  pinMode(7, INPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
}

void loop() {
  
  val=analogRead(misura);

  inputVal = map(val, 0, 1023, 0, 254);

  analogWrite(pinLed,inputVal);
  
  Valore_Button = digitalRead(7);
  if (Valore_Button == HIGH){
    Stato_Sistema=Stato_Sistema+1;
    }
  delay(150);

  switch(Stato_Sistema){
    
     case 1: 
            analogWrite(9,0);
            analogWrite(10,0);
            analogWrite(11,0);
            delay(50);
            break;
    case 2: 
            analogWrite(9,inputVal);
            analogWrite(10,0);
            analogWrite(11,0);
            delay(50);
            break;
    case 3: 
            analogWrite(9,0);
            analogWrite(10,inputVal);
            analogWrite(11,0);
            delay(50);
            break;
    case 4: 
            analogWrite(9,0);
            analogWrite(10,0);
            analogWrite(11,inputVal);
            delay(50);
            break;
    
    }

}

>disne: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra) e NON in una tabella come hai fatto !!!

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

la prima cosa che fai nel loop qual'è?

leggi il potenziometro e accendi il ledpin (11)

poi leggi la pressione del pulsante (senza debounce il valore minimo che hai su stato_sistema sarà 8 -10)

esegui lo switch fermandoti al 4 senza aggiungere un default

e non azzeri mai stato_sistema....

Ciao, nel loop() fai una analogWrite(pinLed,inputVal);, questo significa che il pinLed avrà sempre un valore perché questa istruzione sarà eseguita continuamente nel loop(), quindi non puoi spegnere il led se il potenziometro non è a zero.

Usi una macchina stati finiti, una variabile che assume valori diversi e uno switch(), devi prevedere di riportare a valore iniziale la variabile quando supera il valore massimo.

if (Stato_Sistema>4){
    Stato_Sistema=1;
}

Mi chiedo se fosse possibile semplificare lo sketch, magari utilizzando un vettore per la gestione dei led :roll_eyes:

Non mi viene in mente un modo in cui un array possa semplificare questo codice :slight_smile: fai una sequenza di tre istruzioni, se usi un array è probabile che dovrai usare un iterazione un ciclo, per cui mi sa che con un array puoi solo complicare il codice e senza avere benefici in cambio :wink:

Ci sto lavorando ma ancora non mi viene fuori corretto

Scusa ma per come hai descritto la casistica di funzionamento il tuo codice non può funzionare, se non erro hai detto che tu vorresti settare luminosità indipendenti per i tre led am utilizzi una sola variabile (inputVal) quindi quando cambi la luminosità lo fai per tutti i led.
il led collegato a pinLed a cosa serve?
Per iniziare ti proporrei la seguente modifica, definisci una variabile uguale a Stato_Sistema e chiamala ad esempio Stato_Sistema_Precedente e una variabile inputValOld come inputVal ma con valore differente, nel setup la inizializza con un valore differente da Stato_Sistema, ad esempio:

Stato_Sistema=1;
Stato_Sistema_Precedente=0;
inputValOld = 0;

poi nel loop

if(Stato_Sistema!=Stato_Sistema_Precedente || inputValOld!=inputVal)
{
  if(Stato_Sistema!=Stato_Sistema_Precedente)
  {
    for(byte idx=9; idx<12; idx++)
    {
       analogWrite(idx,0);
    } 
  }
  if(Stato_Sistema>1)
  {
    analogWrite(8+Stato_Sistema,inputVal);
  }
  Stato_Sistema_Precedente=Stato_Sistema;
  inputValOld=inputVal;
}

In questo modo solo se premi il pulsante o cambi il potenziometro modifichi lo stato dei pin, se premi il pulsante allora spegni tutti i led e poi attivi il solo led in base allo stato del sistema, se invece vari solo il potenziometro allora vari la luminosità del led interessato.
Manca ancora di memorizzare le tre differenti luminosità, ma con il codice così scritto e un po' d'impegno puoi utilizzare un array per fare ciò che desideri

Ho fatto un passo indietro per arrivarci con calma.

Sto utilizzando 3 pulsanti + 3 led + 1 trimmer.
Tenendo premuto il pulsante 1 seleziono il led 1 e ne regolo la luminosità;
Tenendo premuto il pulsante 2 seleziono il led 2 e ne regolo la luminosità;
Tenendo premuto il pulsante 3 seleziono il led 3 e ne regolo la luminosità.

il problema è che ad ogni pressione di pulsante il led precedente si spegne, vorrei rimanesse acceso con il valore impostato tramite trimmer. Suggerimenti?

int potA = A5;
const int INDICE_PIN = 3; 
  
int pinPulsanti[INDICE_PIN] = {8,7,6};    // create un array of pin per gli input  
                                            // costituiti dai pulsanti  
  
int pinLed[INDICE_PIN] = {11,10,9};            
  
void setup()  
{  
  for(int indice = 0; indice < INDICE_PIN; indice++)  
  {  
   // pinMode(pinLed[indice], OUTPUT);          
    pinMode(pinPulsanti[indice], INPUT);      
    digitalWrite(pinPulsanti[indice],HIGH);    
  
  }  
}  
  
void loop(){  
   int valA = map(analogRead(potA),0,1023,0,255); 
  for(int indice = 0; indice < INDICE_PIN; indice++)  
  {  
    int stato = digitalRead(pinPulsanti[indice]);  
    if (stato == LOW)                           
    {  
      analogWrite(pinLed[indice], valA);       
      delay(100);                            
     
  }  
    else  
    {  
       analogWrite(pinLed[indice], 0);        
    }  
  }  
}

disne:
il problema è che ad ogni pressione di pulsante il led precedente si spegne, vorrei rimanesse acceso con il valore impostato tramite trimmer. Suggerimenti?

NON si spegne, TU lo spegni, il programma fa quello che scrivi tu
tu vai a comandare la luminosità dei led in solo due righe del programma
in una di queste......

Imposto la luminosità all'interno del ciclo for, potrei memorizzare l'ultimo valore del trimmer e dire al sistema di lasciar acceso il led con questo valore

Bastava semplicemente togliere l' else...

Bravo,