Aiuto Chip led comandato in pwm con driver LDD

Ciao a tutti, sono un nuovo utente alle prime armi con arduino.
Sto realizzando una plafoniera per un acquario con tre cob led da 120W con 5 ch ciascuno.
Ho realizzato la plafoniera controllandola con arduino M0
lo schema sostanzialmente è il seguente:
ci sarà un generatore 5V dc da 5ch che moduleranno tale tensione in base a delle esigenze e tempistiche prestabilite che verranno date in ingresso ad arduino.

Non avendo ancora disponibile tale scheda esterna, per adesso ho realizzato con un potenziometro alimentato dallo stesso arduino a 5V e programmato per il test un solo ingresso (su ingresso A1) che accende tutti i canali secondo valori prestabiliti nel seguente modo:

int LED1 = 3;
int LED2 = 4;
int LED3 = 5;
int LED4 = 8;
int LED5 = 9;
int POT = A1;
int analogreadvalue;//usa questa variabile per leggere 0,5v del potenziometro sul pin a1
int analogwritevalue;//usa questa variabile per scrivere 0,5v sui led
float Voltage;
#define LEDBUTTON 13                // LED collegato al pin digitale 13
#define BUTTON 7              // pin di input dove è collegato il pulsante
int val = 0;                  // si userà val per conservare lo stato del pin di input
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

void setup() {
  Serial.begin (9600);
  pinMode (POT, INPUT);
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode(LEDBUTTON, OUTPUT);       // imposta il pin digitale come output
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
}

void loop() {
delay (300);
 val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva

 // controlla che l'input sia HIGH (pulsante premuto)
 // e cambia lo stato del led
 if (val == HIGH) {
   stato = 1 - stato;
   } 

 if (stato == 1) {
  digitalWrite(LEDBUTTON, HIGH);   // accende il led pulsante
   
  analogreadvalue = 1023;
  analogwritevalue = map(analogreadvalue, 0, 1023, 0, 255); //converte in scala 255 
  analogWrite(LED1, analogwritevalue * 25 / 100); // BIANCO FREDDO
  analogWrite(LED2, analogwritevalue * 35 / 100); // BLU
  analogWrite(LED3, analogwritevalue * 20 / 100); // UV
  analogWrite(LED4, analogwritevalue * 35 / 100); // Blu scuro
  analogWrite(LED5, analogwritevalue * 45 / 100); // BIANCO CALDO
 
  }
 
 else {
  digitalWrite(LEDBUTTON, LOW);    //spegne il led pulsante
 
   

   analogreadvalue = analogRead (POT); //questo legge il valore dal potenziometro:
 
   if (analogreadvalue <= 20)
   analogwritevalue = 0;
   else
   analogwritevalue = map(analogreadvalue, 0, 1023, 0, 255);  //converte in scala 255
   
   analogWrite(LED1, analogwritevalue * 45 / 100); // BIANCO FREDDO
   analogWrite(LED2, analogwritevalue * 30/ 100);  // BLU
   analogWrite(LED3, analogwritevalue * 5 / 100);  // UV
   analogWrite(LED4, analogwritevalue * 30 / 100); // Blu scuro
   analogWrite(LED5, analogwritevalue * 25 / 100); // BIANCO CALDO
   
}
   delay (100);
}

e funziona tutto correttamente.

questo invece è lo scratch che dovrebbe gestire i 5ch controllati separatamente da esterno:

int LED1 = 3;
int LED2 = 4;
int LED3 = 5;
int LED4 = 8;
int LED5 = 9;
int POT1 = A1;
int POT2 = A2;
int POT3 = A3;
int POT4 = A4;
int POT5 = A5;
int analogreadvalueA1;//usa questa variabile per leggere 5v sul pin A1
int analogwritevalueA1;//usa questa variabile per scrivere 5v su LED1
int analogreadvalueA2;//usa questa variabile per leggere 5v sul pin A2
int analogwritevalueA2;//usa questa variabile per scrivere 5v su LED2
int analogreadvalueA3;//usa questa variabile per leggere 5v sul pin A3
int analogwritevalueA3;//usa questa variabile per scrivere 5v su LED3
int analogreadvalueA4;//usa questa variabile per leggere 5v sul pin A4
int analogwritevalueA4;//usa questa variabile per scrivere 5v su LED4
int analogreadvalueA5;//usa questa variabile per leggere 5v sul pin A5
int analogwritevalueA5;//usa questa variabile per scrivere 5v su LED5



float Voltage;
#define LEDBUTTON 13                // LED collegato al pin digitale 13
#define BUTTON 7              // pin di input dove è collegato il pulsante
int val = 0;                  // si userà val per conservare lo stato del pin di input
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

void setup() {
  Serial.begin (9600);
  pinMode (POT1, INPUT);
  pinMode (POT2, INPUT);
  pinMode (POT3, INPUT);
  pinMode (POT4, INPUT);
  pinMode (POT5, INPUT);
  pinMode (LED1, OUTPUT);
  pinMode (LED2, OUTPUT);
  pinMode (LED3, OUTPUT);
  pinMode (LED4, OUTPUT);
  pinMode (LED5, OUTPUT);
  pinMode(LEDBUTTON, OUTPUT);       // imposta il pin digitale come output
  pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
}

void loop() {
delay (300);
 val = digitalRead(BUTTON);  // legge il valore dell'input DEL PULSANTE e lo conserva

 // controlla che l'input sia HIGH (pulsante premuto)
 // e cambia lo stato del led
 if (val == HIGH) {
   stato = 1 - stato;
   } 

 if (stato == 1) {
  digitalWrite(LEDBUTTON, HIGH);   // accende il led del pulsante
   
   analogreadvalueA1 = 1023;
  analogwritevalueA1 = map(analogreadvalueA1, 0, 1023, 0, 255); //converte in scala 255 
   analogreadvalueA2 = 1023;
  analogwritevalueA2 = map(analogreadvalueA2, 0, 1023, 0, 255); //converte in scala 255 
   analogreadvalueA3 = 1023;
  analogwritevalueA3 = map(analogreadvalueA3, 0, 1023, 0, 255); //converte in scala 255 
   analogreadvalueA4 = 1023;
  analogwritevalueA4 = map(analogreadvalueA4, 0, 1023, 0, 255); //converte in scala 255 
   analogreadvalueA5 = 1023;
  analogwritevalueA5 = map(analogreadvalueA5, 0, 1023, 0, 255); //converte in scala 255 
  
  analogWrite(LED1, analogwritevalueA1 * 25 / 100); // Bianco FREDDA 15K
  analogWrite(LED2, analogwritevalueA2 * 35 / 100); // BLU 455/457
  analogWrite(LED3, analogwritevalueA3 * 20 / 100); // UV 417/430 nm
  analogWrite(LED4, analogwritevalueA4 * 45 / 100); // Bianco CALDA 10K
  analogWrite(LED5, analogwritevalueA5 * 0 / 100);  // BLU SCURO 445/447 
 
  }
 
 else {
  digitalWrite(LEDBUTTON, LOW);    //spegne il led pulsante
 
   

   analogreadvalueA1 = analogRead (POT1); //questo legge il valore dall'ingresso A1
   analogreadvalueA2 = analogRead (POT2); //questo legge il valore dall'ingresso A2
   analogreadvalueA3 = analogRead (POT3); //questo legge il valore dall'ingresso A3
   analogreadvalueA4 = analogRead (POT4); //questo legge il valore dall'ingresso A4
   analogreadvalueA5 = analogRead (POT5); //questo legge il valore dall'ingresso A5
 
   if (analogreadvalueA1 <= 20)
   analogwritevalueA1 = 0;
   else
   analogwritevalueA1 = map(analogreadvalueA1, 0, 1023, 0, 255);  //converte in scala 255
   
   if (analogreadvalueA2 <= 20)
   analogwritevalueA2 = 0;
   else
   analogwritevalueA2 = map(analogreadvalueA2, 0, 1023, 0, 255);  //converte in scala 255
   
   if (analogreadvalueA3 <= 20)
   analogwritevalueA3 = 0;
   else
   analogwritevalueA3 = map(analogreadvalueA3, 0, 1023, 0, 255);  //converte in scala 255
   
   if (analogreadvalueA4 <= 20)
   analogwritevalueA4 = 0;
   else
   analogwritevalueA4 = map(analogreadvalueA4, 0, 1023, 0, 255);  //converte in scala 255
   
   if (analogreadvalueA5 <= 20)
   analogwritevalueA5 = 0;
   else
   analogwritevalueA5 = map(analogreadvalueA5, 0, 1023, 0, 255);  //converte in scala 255
   
   analogWrite(LED1, analogwritevalueA1 * 45 / 100);  // Bianco FREDDA 15K
   analogWrite(LED2, analogwritevalueA2 * 30/ 100);   // BLU 455/457
   analogWrite(LED3, analogwritevalueA3 * 5 / 100);   // UV 417/430 nm
   analogWrite(LED4, analogwritevalueA4 * 25 / 100); // Bianco CALDA 10K
   analogWrite(LED5, analogwritevalueA5 * 0 / 100);  // BLU SCURO 445/447 
   
}
   delay (100);
}

Ora il problema è il seguente:
non avendo ancora il modulo 0/5V esterno che porta la tensione ai vari canali di arduino in ingresso, ho caricato comunque lo scratch su arduino e mi aspettavo che si accendesse solo il led del ch 1, invece si accendono tutti.
é un problema legato agli if?

Grazie a tutti per i suggerimenti.

Buongiorno,
essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ...

... poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (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).

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

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

Grazie, spero di aver fatto tutto correttamente secondo le sue indicazioni.

alcer:
Grazie, spero di aver fatto tutto correttamente secondo le sue indicazioni.

Perfetto ...

Guglielmo

alcer: ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48/72 ore dall'ultimo post. Grazie.

Guglielmo

Vediamo se ho capito:

  • Hai una plafoniera a led con cinque canali di luce differente: bianco fredda, blu, uv, bianco calda e blu scuro che devi accendere contemporaneamente a luminosità differenti
  • Hai 5 potenziometri ciascuno dei quali relativo a uno dei canali della plafoniera
  • Hai un pulsante (con un led dentro) che quando è premuto accende il led del pulsante e contemporaneamente al massimo tutti e 5 i canali della plafoniera
  • Quando il pulsante NON è premuto (cioè in condizioni normali) il led del pulsante è spento e le luminosità dei 5 canali della plafoniera devono essere regolate separatamente ciascuna secondo la rotazione del potenziometro corrispondente

Pulsante (tenuto) premuto = led del pulsante acceso e luminosità massima dei 5 canali della plafoniera
Pulsante rilasciato = led del pulsante spento e luminosità dei 5 canali della plafoniera regolate dai potenziometri corrispondenti

Dimmi se ci ho 'nzertato o correggi dove sbaglio.

Ciao,
P.

Si esatto, il pulsante esterno serve per sovrascrivere il segnale generato dalla centralina esterna in base all'orario.
Sostanzialmente la centralina modula i 5ch per fare un effetto alba tramonto, ma se premo il pulsante in qualsiasi momento accendo i led all'intensità massima (es manutenzione).
Ora con il primo scratch, quello con segnale solo sul ch1 funziona tutto, mentre quello con 5 ingressi non va, anche se spengo 4ch su 5 si accendono lo stesso
Non so se posso mettere in sequenza gli if per i 5ch.
quelli mi servono per non considerare valori instabili sotto il 5% che mi farebbero lampeggiare i led quando la tensione in ingresso è minima ma comunque qualcosa arriva.

grazie

La scheda Arduino M0 mi risulta non più prodotta e con caratteristiche non proprio uguali alla Uno o simili a 5V. Leggi la sezione Documentation qui e verifica che i livelli in input e quei 1023 che dissemini nel programma siano corretti.

Ciao,
P.

Grazie per la risposta,
francamente credevo fossero tutte uguali.
Quindi se ho capito bene i riferimento analogico sulla zero è a 12bit (4095 anzichè 1023), basta che cambio il riferimento con:

"analogReadResolution(10) all'inizio del loop o devo cambiare il riferimento analogico in 4095 ?

La questione dell'ingresso a 5V non l'ho capita, non posso dargli in pasto 0-5V dc direttamente negli ingressi?

Allora io nonostante non ci siano volenterosi disposti ad aiutarmi sono andato un pochino avanti e condivido con chi ne avesse bisogno quello che ho rilevato.
La scheda Arduino M0 come mi ha fatto notare pgiagno (che ringrazio) funziona a 12bit con una tensione cei ch analogici di ingresso a 3V e non a 5 come per la uno, pertanto ho fatto una modifica allo scratch nel seguente modo.
Questo è quello di prova con ingresso sollo su A1:

int LED1 = 3;
int LED2 = 4;
int LED3 = 5;
int LED4 = 8;
int LED5 = 9;
int POT = A1;
int analogreadvalue;//usa questa variabile per leggere 3v del potenziometro sul pin A1
int analogwritevalue;//usa questa variabile per scrivere 3v sui led
float Voltage;
#define LEDBUTTON 13                // LED collegato al pin digitale 13
#define BUTTON 7              // pin di input dove è collegato il pulsante
int val = 0;                  // si userà val per conservare lo stato del pin di input
int stato = 0;                // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso

void setup() {
   Serial.begin (9600);
   pinMode (POT, INPUT);
   pinMode (LED1, OUTPUT);
   pinMode (LED2, OUTPUT);
   pinMode (LED3, OUTPUT);
   pinMode (LED4, OUTPUT);
   pinMode (LED5, OUTPUT);
   pinMode(LEDBUTTON, OUTPUT);       // imposta il pin digitale come output
   pinMode(BUTTON, INPUT);     // imposta il pin digitale come input
}

void loop() {
  delay (300);
  analogReadResolution (12); // imposta la risoluzione pin analogici a 12bit (4095 step)
  
  val = digitalRead(BUTTON);  // legge il valore dell'input e lo conserva

  // controlla che l'input sia HIGH (pulsante premuto)
  // e cambia lo stato del led
  if (val == HIGH) {
    stato = 1 - stato;
    } 

  if (stato == 1) {
   digitalWrite(LEDBUTTON, HIGH);   // accende il led pulsante
    
   analogreadvalue = 4095;
   analogwritevalue = map(analogreadvalue, 0, 4095, 0, 255); //converte in scala 255 
   analogWrite(LED1, analogwritevalue * 50 / 100); // BIANCO FREDDO
   analogWrite(LED2, analogwritevalue * 50 / 100); // BLU
   analogWrite(LED3, analogwritevalue * 50 / 100); // UV
   analogWrite(LED4, analogwritevalue * 50 / 100); // Blu scuro
   analogWrite(LED5, analogwritevalue * 50 / 100); // BIANCO CALDO
  
   }
  
  else {
   digitalWrite(LEDBUTTON, LOW);    //spegne il led pulsante
  
    

    analogreadvalue = analogRead (POT); //questo legge il valore dal potenziometro:
  
    if (analogreadvalue <= 20)
    analogwritevalue = 0;
    else
    analogwritevalue = map(analogreadvalue, 0, 4095, 0, 255);  //converte in scala 255
    
    analogWrite(LED1, analogwritevalue * 50 / 100); // BIANCO FREDDO 45 definitiva 50
    analogWrite(LED2, analogwritevalue * 35/ 100);  // BLU 30 definitiva 35
    analogWrite(LED3, analogwritevalue * 25 / 100);  // UV 5 definitiva 25
    analogWrite(LED4, analogwritevalue * 55/ 100); // Blu scuro 30 definitiva 55
    analogWrite(LED5, analogwritevalue * 50/ 100); // BIANCO CALDO 25 definitiva 50
    
}
    delay (100);
}

Ora funziona alla tensione giusta (3,3V) e non rischio di bruciare il microcontroller (anche se non mi spiego perchè prima funzionasse tutto correttamente da diversi giorni).

Sto provando a modificare lo scratch con i 5 ch di ingresso separati, ma ancora non ci sono....