#include <Arduino.h>
#define colorBtn 6
#define durationBtn 7
#define r_ledpin 11
#define g_ledpin 10
#define b_ledpin 9
bool colors[][3] = {
{1,1,1}, {1,0,0}, {0,1,0}, {0,0,1}, // wrgb
{0,1,1}, {1,1,0}, {1,0,1}, {0,0,0} // cymk
};
const char* colorNames[] = {
"white", "red", "green", "blue",
"cyan", "yellow", "magenta", "black" // black is just off so do not need to toggle to black
};
int delays[] = {
1000, 800, 600, 400, 200
};
int colorIndex = 0;
int durationIndex = 0;
unsigned long previousMillis = 0;
unsigned long lastColorDebounceTime = 0;
unsigned long lastDurationDebounceTime = 0;
unsigned long debounceDelay = 50;
bool lastColorBtnState = HIGH;
bool lastDurationBtnState = HIGH;
void setup() {
Serial.begin(9600);
pinMode(r_ledpin, OUTPUT);
pinMode(g_ledpin, OUTPUT);
pinMode(b_ledpin, OUTPUT);
pinMode(colorBtn, INPUT_PULLUP);
pinMode(durationBtn, INPUT_PULLUP);
Serial.println("Setup complete");
Serial.println("Color: white");
Serial.println("Duration: 1000 ms");
}
void loop() {
unsigned long currentMillis = millis();
bool colorBtnState = digitalRead(colorBtn);
if (colorBtnState != lastColorBtnState) {
lastColorDebounceTime = currentMillis;
}
if ((currentMillis - lastColorDebounceTime) > debounceDelay) {
if (colorBtnState == LOW && lastColorBtnState == HIGH) {
colorIndex = (colorIndex + 1) % 7;
Serial.print("Color: ");
Serial.println(colorNames[colorIndex]);
resetLED();
}
}
lastColorBtnState = colorBtnState;
bool durationBtnState = digitalRead(durationBtn);
if (durationBtnState != lastDurationBtnState) {
lastDurationDebounceTime = currentMillis;
}
if ((currentMillis - lastDurationDebounceTime) > debounceDelay) {
if (durationBtnState == LOW && lastDurationBtnState == HIGH) {
durationIndex = (durationIndex + 1) % 5;
Serial.print("Duration: ");
Serial.print(delays[durationIndex]);
Serial.println(" ms");
resetLED();
}
}
lastDurationBtnState = durationBtnState;
if (currentMillis - previousMillis >= delays[durationIndex]) {
previousMillis = currentMillis;
toggleLED();
}
}
void toggleLED() {
static bool ledOn = false;
if (ledOn) {
analogWrite(r_ledpin, 0);
analogWrite(g_ledpin, 0);
analogWrite(b_ledpin, 0);
} else {
analogWrite(r_ledpin, colors[colorIndex][0] * 255);
analogWrite(g_ledpin, colors[colorIndex][1] * 255);
analogWrite(b_ledpin, colors[colorIndex][2] * 255);
}
ledOn = !ledOn;
}
void resetLED() {
analogWrite(r_ledpin, 0);
analogWrite(g_ledpin, 0);
analogWrite(b_ledpin, 0);
previousMillis = millis();
}