const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
const bool invert = true;
int color = 0;
int R, G, B;
void setup() {
//アナログ端子のため不要
Serial.begin(9600);
}
void loop() {
int brightness = 255;
hueToRGB(color, brightness);
analogWrite(redPin, R);
analogWrite(greenPin, G);
analogWrite(bluePin, B);
color++;
Serial.print("["); Serial.print(millis()); Serial.print("] color: "); Serial.println(color);
if (color > 255) {
color = 0;
//消灯して1秒待機
analogWrite(redPin, 0); analogWrite(greenPin, 0); analogWrite(bluePin, 0); delay(1000);
}
}
void hueToRGB(int hue, int brightness) {
unsigned int scaledHue = (hue * 6);
unsigned int segment = scaledHue / 256;
unsigned int segmentOffset = scaledHue - (segment * 256);
unsigned int complement = 0;
unsigned int prev = (brightness * ( 255 - segmentOffset)) / 256;
unsigned int next = (brightness * segmentOffset) / 256;
if (invert) {
brightness = 255 - brightness;
complement = 255;
prev = 255 - prev;
next = 255 - next;
}
switch (segment) {
case 0: R=brightness; G=next; B=complement; break; //red
case 1: R=prev; G=brightness; B=complement; break; //yerrow
case 2: R=complement; G=brightness; B=next; break; //green
case 3: R=complement; G=prev; B=brightness; break; //cyan
case 4: R=next; G=complement; B=brightness; break; //blue
case 5: default: R=brightness; G=complement; B=prev; break; //magenta
}
}