如何根据0-360度红紫颜色环角度获取RGB颜色?(Arduino开发)
从色相角度转RGB颜色:原理+Arduino实现方案
嘿,我之前做Arduino RGB摇杆项目的时候刚好解决过这个问题!其实你要的就是把色相(Hue,0-360度)转换成全饱和、全亮度的RGB值——因为你的色环就是HSV色彩模型里S=100%、V=100%的情况,不用复杂的通用HSV转RGB公式,简化一下就能搞定。
背后的数学原理
色环的0-360度对应6个基础颜色的渐变区间,每个区间60度,每个区间里只有两个RGB分量在变化,第三个保持不变:
- 0°-60°: 红→黄 → R=255,G从0升到255,B=0
- 60°-120°: 黄→绿 → R从255降到0,G=255,B=0
- 120°-180°: 绿→青 → R=0,G=255,B从0升到255
- 180°-240°: 青→蓝 → R=0,G从255降到0,B=255
- 240°-300°: 蓝→品红 → R从0升到255,G=0,B=255
- 300°-360°: 品红→红 → R=255,G=0,B从255降到0
每个区间的计算逻辑是:先把角度映射到0-60的相对值,再根据区间方向计算对应分量的增减比例,最后乘以255得到0-255的RGB值。
Arduino C++实现代码
直接写一个可复用的函数,输入角度(支持0-360,超出范围会自动取模修正),输出R、G、B三个字节:
void hueToRGB(int angle, byte &r, byte &g, byte &b) { // 先修正角度到0-359范围 angle = angle % 360; if (angle < 0) angle += 360; float relativeAngle = angle % 60; // 每个60度区间内的相对角度 float ratio = relativeAngle / 60.0; // 0-1的比例值 switch(angle / 60) { case 0: // 0-60: 红→黄 r = 255; g = round(ratio * 255); b = 0; break; case 1: // 60-120: 黄→绿 r = round(255 - (ratio * 255)); g = 255; b = 0; break; case 2: // 120-180: 绿→青 r = 0; g = 255; b = round(ratio * 255); break; case 3: // 180-240: 青→蓝 r = 0; g = round(255 - (ratio * 255)); b = 255; break; case 4: // 240-300: 蓝→品红 r = round(ratio * 255); g = 0; b = 255; break; case 5: // 300-360: 品红→红 r = 255; g = 0; b = round(255 - (ratio * 255)); break; } }
怎么用到你的项目里
比如你的摇杆X轴输出0-1023的模拟值,把它映射成0-360度,再转成RGB输出到LED:
// 假设RGB LED引脚是9、10、11(PWM引脚) const int redPin = 9; const int greenPin = 10; const int bluePin = 11; const int joystickX = A0; void setup() { pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); } void loop() { int xValue = analogRead(joystickX); // 把0-1023映射到0-360度 int hueAngle = map(xValue, 0, 1023, 0, 360); byte r, g, b; hueToRGB(hueAngle, r, g, b); // 输出到RGB LED(如果是共阳极LED,要取反:255 - r) analogWrite(redPin, r); analogWrite(greenPin, g); analogWrite(bluePin, b); delay(10); }
注意:如果你的RGB LED是共阳极类型,记得把RGB值取反(比如analogWrite(redPin, 255 - r)),因为共阳极是低电平亮。
内容的提问来源于stack exchange,提问作者Enter Name
相关产品推荐
相关产品推荐

