hue to rgb con arduino UNO

salve,
mi sto dilettando con un controller per strip led RGB da 12v a + comune (non ricorderò mai e è catodo o anodo) cioè io tramtie un potenziometro leggo un vlore analogico, lo converto in digitale, lo porto in un valore compreso tra 0 e 360 e da li tramite l'immagine in allegato lo converto nei tre valori pwm dei led rosso verde e blu.

funziona fino alla conversione ad hue, da li in poi nulla.

i valori pwm dei tre colori rimangono fissi su 9 10 e 9, rispettivamente per rosso verde e blu

i è una variaile di swap, la uso mentre devo calcolare i valori intermedi di luminosità

per il debug uso uno schermo lcd 16x2, quindi ignorate le ultime 20 righe di codice, relative appunto all lcd.

sketch qui:

#include<LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


const int pwmred = 9;
const int pwmgreen = 10;
const int pwmblue = 6;
const int Apin = 0;


int Aread = 0; // lettura analogica
float tmpfloat = 0;

float hue = 0; // valore tra 0 e 360
float i = 0;   // variabile di swap
float cst = 4.25; // costante di 255/60 
float cst2 = 0.35190615;  // verra salvato il valore di 1/1023*360


void setup() {
  // put your setup code here, to run once:
  pinMode(pwmred,OUTPUT);
  pinMode(pwmgreen,OUTPUT);
  pinMode(pwmblue,OUTPUT);
  
  lcd.begin(16, 2);
  
}

void loop() {
  // put your main code here, to run repeatedly:
  
  Aread = analogRead(Apin);
  tmpfloat = Aread;
  cst2 = cst2;
  
  hue = tmpfloat*360/1023; // Aread/cst2 = Aread/1023*360
  
  
  if(hue>0 && hue<60)
  {
  analogWrite(pwmred,255);
  analogWrite(pwmblue,0);
  i= (hue/cst);
  analogWrite(pwmgreen,i);
  }
  
  if(hue>60 && hue<120)
  { 
  analogWrite(pwmgreen,255);
  analogWrite(pwmblue,0);
  i = 255-((hue-60)/cst);
  analogWrite(pwmred,i);
  }
  
  if(hue>120 && hue<180)
  {
  analogWrite(pwmgreen,255);
  analogWrite(pwmred,0);
  i = (hue-120)/cst;
  analogWrite(pwmblue,i);
  }
  
  if(hue>180 && hue<240)
  {
  analogWrite(pwmblue,255);
  analogWrite(pwmred,0);
  i = 255-((hue-180)/cst);
  analogWrite(pwmgreen,i);
  }
  
  
  if(hue>240 && hue<300)
  {
  analogWrite(pwmblue,255);
  analogWrite(pwmgreen,0);
  i = (hue-240)/cst;
  analogWrite(pwmred,i);
  }


  if(hue>300 && hue<360)
  {
  analogWrite(pwmred,255);
  analogWrite(pwmgreen,0);
  i = 255-((hue-300)/cst);
  }

lcd.setCursor(0,0);
lcd.print("R");
lcd.setCursor(1,0);
lcd.print(pwmred);

lcd.setCursor(4,0);
lcd.print("G");
lcd.setCursor(5,0);
lcd.print(pwmgreen);

lcd.setCursor(8,0);
lcd.print("B");
lcd.setCursor(9,0);
lcd.print(pwmred);

lcd.setCursor(12,0);
lcd.print("A");
lcd.setCursor(13,0);
lcd.print(Aread);

lcd.setCursor(0,1);
lcd.print("H");
lcd.setCursor(2,1);
lcd.print(hue);

lcd.setCursor(8,1);
lcd.print("I");
lcd.setCursor(9,1);
lcd.print(i);

}

ti sei accorto che sull lcd visualizzi il numero del pin pwmred e pwmgreen e di nuovo pwmred che rispettivamente valgono 9 10 9.......... :slight_smile:

Questo sketch è l'ideale per applicare la funzione map:

#define Apin      A0
#define REDpin    9
#define GREENpin  10
#define BLUEpin   6

#include<LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int RED = 0;
int GREEN = 0;
int BLUE = 0;
unsigned int hue = 0;        // valore tra 0° e 259°

void setup() {
  pinMode(REDpin, OUTPUT);
  pinMode(GREENpin, OUTPUT);
  pinMode(BLUEpin, OUTPUT);
  lcd.begin(16, 2);
}

void loop() {
  hue = map(analogRead(Apin), 0, 1023, 0, 359);
  
  if (hue <= 60) {
    RED = 255;
    GREEN = map(hue, 0, 60, 0, 255);
    BLUE = 0;
  }
  else if (hue <= 120) {
    RED = map(hue, 60, 120, 255, 0);
    GREEN = 255;
    BLUE = 0;
  }
  else if (hue <= 180) {
    RED = 0;
    GREEN = 255;
    BLUE = map(hue, 120, 180, 0, 255);
  }
  else if (hue <= 240) {
    RED = 0;
    GREEN = map(hue, 180, 240, 255, 0);
    BLUE = 255;
  }
  else if (hue <= 300) {
    RED = map(hue, 240, 300, 0, 255);
    GREEN = 0;
    BLUE = 255;
  }
  else if (hue <= 359) {
    RED = 255;
    GREEN = 0;
    BLUE = map(hue, 300, 359, 255, 0);
  }

  analogWrite(REDpin, RED);
  analogWrite(GREENpin, GREEN);
  analogWrite(BLUEpin, BLUE);

  lcd.setCursor(0, 0);
  lcd.print("R");
  lcd.setCursor(1, 0);
  lcd.print(RED);

  lcd.setCursor(4, 0);
  lcd.print("G");
  lcd.setCursor(5, 0);
  lcd.print(GREEN);

  lcd.setCursor(8, 0);
  lcd.print("B");
  lcd.setCursor(9, 0);
  lcd.print(BLUE);

  lcd.setCursor(2, 1);
  lcd.print(hue);
}

Woops, questo spiega il perchè dei due valori uguali

Gia, si potrebbe usare, e magari risolvo anche, visto che credo il problema sia legato alla logica del micro e di come ragiona coi decimali

Adesso sono in treno, appena riesco provo e vi dico

sembra strano ma non ho avuto molto tempo libero fino ad ora.

grazie mille! adesso funziona alla perfezione!