// ===== PIN DEFINITIONS =====
#define RED_PIN 15
#define GREEN_PIN 2
#define BLUE_PIN 4
#define LED_PIN 5
// ===== PWM SETTINGS =====
#define PWM_FREQ 5000
#define PWM_RES 8 // 8-bit (0–255)
// ===== FUNCTION: HSV to RGB =====
void hsvToRgb(int hue, int &r, int &g, int &b) {
int region = hue / 43;
int remainder = (hue - (region * 43)) * 6;
int p = 0;
int q = (255 * (255 - remainder)) >> 8;
int t = (255 * remainder) >> 8;
switch (region) {
case 0: r = 255; g = t; b = 0; break;
case 1: r = q; g = 255; b = 0; break;
case 2: r = 0; g = 255; b = t; break;
case 3: r = 0; g = q; b = 255; break;
case 4: r = t; g = 0; b = 255; break;
default:r = 255; g = 0; b = q; break;
}
}
void setup() {
// Attach PWM directly to pins (NEW API)
ledcAttach(RED_PIN, PWM_FREQ, PWM_RES);
ledcAttach(GREEN_PIN, PWM_FREQ, PWM_RES);
ledcAttach(BLUE_PIN, PWM_FREQ, PWM_RES);
ledcAttach(LED_PIN, PWM_FREQ, PWM_RES);
}
void loop() {
static int hue = 0;
static int ledBrightness = 10;
static int fadeDir = 1;
int r, g, b;
hsvToRgb(hue, r, g, b);
// RGB rainbow
ledcWrite(RED_PIN, r);
ledcWrite(GREEN_PIN, g);
ledcWrite(BLUE_PIN, b);
// Breathing LED (never fully off)
ledcWrite(LED_PIN, ledBrightness);
ledBrightness += fadeDir;
if (ledBrightness >= 255 || ledBrightness <= 10) {
fadeDir = -fadeDir;
}
hue++;
if (hue >= 256) hue = 0;
delay(30); // slow rainbow + fade
}