You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:25:56