Come confrontare valori per comandare driver led

Buona sera a tutti.
Mi trovo incartato nella programmazione del mio arduino pro mini 05 16mhz.
Vorrei che comandasse un driver led con dimming, 1-10v in base all’input di un sensore digitale di luminosità.
Funziona tutto correttamente: sensore collegato in I2C, dimming attraverso un amplificatore operazionale collegato al pwm.
Xò non riesco assolutamente ad utilizzare il valore che arriva dal sensore digitale per fargli fare quello che voglio, ho postato una foto banale per esempio.
Vi ringrazio per l’attenzione
Luca

Allora, determina quale è l'intervallo di valori che ti arriva dal sensore digitale, ovvero verifica quale è il valore minimo e quale quello massimo che ti restituisce (esempio ... minimo = 15000, massimo = 18000), dopo ci che supponiamo che il tuo PWM vada da 0 a 255 (min, max) usi la funzione map la cui sintassi è :

newValue = map(oldValue, fromLow, fromHigh, toLow, toHigh);

e rimappi il valore nel valore di PWM.

Con i valori che abbiamo preso per esempio sarebbe :

valPWM = map(valDigitale, 15000, 18000, 0, 255);

Spero solo di aver ben capito il tuo problema ... :roll_eyes:

Guglielmo

Grazie per la risposta.
Ho capito il funzionamento di map ma non credo faccia al caso mio.
In realtà vorrei impostare sull’arduino un valore limite di luminosità, mettiamo i 12500 della foto o più.
Ho visto che dove sto testando con i led accesi al massimo vado intorno a 17000 di lettura.
In base al valore limite l’arduino dovrebbe comandare il driver.
Se la luminosità ambientale cala, mettiamo 10000, l’arduino rileva la differenza e attraverso il pwm comanda l’aumento del driver, per tornare ad una luminosità rilevata intorno ai 12500.
In se, il sistema dovrebbe comandare il pwm in relazione alle variazioni del sensore di luminosità intorno ad un valore di riferimento.
Non riesco a trovare un modo per mettere in relazione i due valori, i 12500 impostati da me e mettiamo i 10-11-12-13000 o quello che è dato dal sensore.
E’ come se fossero dati di natura diversa.
Uff…

No, devi usare esattamente quello che ti ho detto io solo che poi il valore lo devi invertire ...

... decidi un valore minimo di luminosità per cui il PWM deve essere massimo e un valore massimo di luminosità per cui il PWM deve essere minimo, dopo di che fai il map e fai il complemento del risultato (es. valori da 0 a 255 devono diventare da 255 a 0).

Guglielmo

Ah ho capito, scusami, sono una bella capra in programmazione.
Adesso provo.
Grazie ancora

Bene … :wink:

Se eventualmente hai problemi … metti il codice (… mi raccomando chiuso tra i TAG code, quelli che mette il bottone #) e vediamo se ti si può aiutare …

Guglielmo

Avevi ragione…map era proprio quello che mi serviva.
L’ho utilizzato trasformando il valore del sensore in percentuale.

 percentuale = map(TSL2561.calculateLux(0,0,1), 0, 18000, 0 , 100);

Dove 18000 è il valore di luminosità che mi interessa e rappresenta il 100%, in relazione allo scostamento poi comando il pwm del pin9, così:

if ((percentuale > 105) && (percentuale <= 110)){
      for (int pulse = fade; count < 5; pulse--){
          pulse = constrain(pulse, 40, 255);
          fade = pulse;
          count = count + 1;
          analogWrite(ledPin, pulse);
         delay(500);  }
  count = 0;
  }
  if ((percentuale < 95) && (percentuale >= 90)){
      for (int pulse = fade; count < 5; pulse++){
         pulse = constrain(pulse, 40, 255);
        fade = pulse;
        count = count + 1;
        analogWrite(ledPin, pulse);
        delay(500); }
count = 0;
  }

if ((percentuale > 110) && (percentuale <= 130)){
      for (int pulse = fade; count < 15; pulse--){
        pulse = constrain(pulse, 40, 255);
        fade = pulse;
        count = count + 1;
        analogWrite(ledPin, pulse);
        delay(300);  }
  count = 0;
  }
  if ((percentuale < 90) && (percentuale >= 70)){
      for (int pulse = fade; count < 15; pulse++){
          pulse = constrain(pulse, 40, 255);
          fade = pulse;
          count = count + 1;
          analogWrite(ledPin, pulse);
          delay(300);  }
count = 0;
  }
if (percentuale > 130){
      for (int pulse = fade; count < 50; pulse--){
           pulse = constrain(pulse, 40, 255);
           fade = pulse;
           count = count + 1;
           analogWrite(ledPin, pulse);
           delay(150);  }
  count = 0;
  }
  if (percentuale < 70){
      for (int pulse = fade; count < 50; pulse++){
          pulse = constrain(pulse, 40, 255);
          fade = pulse;
          count = count + 1;
          analogWrite(ledPin, pulse);
         delay(150);     }
count = 0;
  }

Laborioso ma funziona.
Grazie

Bene …
… ma non riesci a creare una piccola funzioncina, con un paio di parametri che fa quello che fai in ogni IF ?

Mi sembra che un ciclo di for sia diverso dall’altro giusto per un paio di valori … il limite del for e il valore del delay …

void function regola(int limite, int ritardo) {

   for (int pulse = fade; count < limite; pulse++){
      pulse = constrain(pulse, 40, 255);
      fade = pulse;
      count = count + 1;
      analogWrite(ledPin, pulse);
      delay(ritardo);
   }

}

… e così poi, negli IF, chiami solo quella passandogli i due valori. :slight_smile:

Alleggeriresti il codice … :wink:

Guglielmo