カラーを連続で変えたい
M5atomで温度計や電流計を作った際、値に応じてLEDの表示色を変えたいと思い、最初はレベル毎にカラーマップを作っていたのですが、連続で変えたいといった場合にどうするかを調べたところ、色相なら連続的に変えられると思い、変換プログラムを探してみました。
結果たどり着いたのがHSVからRGBへの変換プログラムです。valueの値に応じて、最大値と最小値の間を青→赤になるよう変化させるなら、以下のように色相を指定してあげるといい感じになると思います。
hsv2rgb.cpp
h = 1.-((value-min)/(max-min)/2.)-0.5;
if (h>0.5){h=0.5;}
if (h<0.) {h=0.;}
ちなみに、AtomS3で画面の色を作る際の16bitRGB版も作ってあるので、しばらくしたら一緒に載せておこうかと思います。
hsv2rgb.cpp
//================================================================================
// hsv2rgb HSV->RGB変換
//================================================================================
int hsv2rgb(float h,float s,float v){
if (s>0){
if (h == 1.0){h = 0.0;}
int i = int(h*6.0);
double f = h*6.0 - i;
double w = v * (1.0 - s);
double q = v * (1.0 - s * f);
double t = v * (1.0 - s * (1.0 - f));
h = int(h*255);
s = int(s*255);
v = int(v*255);
w = int(w*255);
q = int(q*255);
t = int(t*255);
if (i==0){ return((int)(v)*256*256+int(t/1)*256+(int)(w/1));}
if (i==1){ return((int)(q)*256*256+int(v/1)*256+(int)(w/1));}
if (i==2){ return((int)(w)*256*256+int(v/1)*256+(int)(t/1));}
if (i==3){ return((int)(w)*256*256+int(q/1)*256+(int)(v/1));}
if (i==4){ return((int)(t)*256*256+int(w/1)*256+(int)(v/1));}
if (i==5){ return((int)(v)*256*256+int(w/1)*256+(int)(q/1));}
return(0);
}else{
return((int)(v*2048/8+v*32/4+(int)(v/8)));
}
}