pythonにはcolorsysとかいう便利な機能が内蔵されているようだが、m5stackなmicro pythonにはなかった。hsv2rgbのpythonコードなんて探せばある(車輪の再発明)かもしれないが、探すのが面倒だしちゃんと動くかわからないので自作した。(自分で記事を書いたことがあるという記憶があればいつでも自分の記事を参照できて便利!)
def hsv2rgb(h,s,v,Hrange=360,Srange=100,Vrange=100):
if Hrange<=0 or Srange<=0 or Vrange<=0 or s<0 or v<0 or s>Srange or v>Vrange:
print(f"INVALID INPUT. Your input:\n{h} {s} {v} {Hrange} {Srange} {Vrange}")
return(0,0,0)
if h<0:
print(f"get H value:{h} to ",end="")
while h<0: #-1が来たら359と解釈
h+=Hrange
print(f"interpreted:{h}")
elif h>Hrange:
print(f"get H value:{h} to ",end="")
h%=Hrange #361という入力が来たら1と解釈
print(f"interpreted:{h}")
Hrange=Hrange/6 #~60°~120°~180°~240°~300°~360°の6段階でわけなきゃいけない
MAX=v/Vrange*255 #明度はその色の最大値
MIN=MAX-((s/Srange)*MAX) #彩度がMAXなら原色なのでRGBのいずれかが0になる
if h<Hrange*1: #~60°(赤~黄)
R=MAX
G=(h /Hrange)*(MAX-MIN)+MIN #hが0なら原色赤(G=0)、hが60なら原色黄色(G=255)
B=MIN
elif h<Hrange*2: #60~120°(黄~緑)
R=((Hrange*2-h)/Hrange)*(MAX-MIN)+MIN #hが60なら原色黄色(R=255)、hが120なら原色緑(R=0)。120から引いて60で割るとちょうど計算できる
G=MAX
B=MIN
elif h<Hrange*3: #120~180°(緑~水色)
R=MIN
G=MAX
B=((h-Hrange*2)/Hrange)*(MAX-MIN)+MIN #hが120なら緑(B=0)、hが180なら水色(B=255)。120を引く
elif h<Hrange*4: #180~240°(水色~青)
R=MIN
G=((Hrange*4-h)/Hrange)*(MAX-MIN)+MIN #hが180なら水色(G=255)、hが240なら青(G=0)。240から引く
B=MAX
elif h<Hrange*5: #240~300°(青~赤紫)
R=((h-Hrange*4)/Hrange)*(MAX-MIN)+MIN #hが240なら青(R=0)、hが300なら赤紫(R=255)
G=MIN
B=MAX
else: #300~360°
R=MAX
G=MIN
B=((Hrange*6-h)/Hrange)*(MAX-MIN)+MIN
R=int(R)
G=int(G)
B=int(B)
return (R,G,B)
無駄にエラーチェックてきなものを入れてるが不要な場合各自で削除してくれ!