#define button 3
#define redLED 5
#define greenLED 6
#define blueLED 7
int state = 0; // Tracks the current color state
int old = 0; // Previous state, helps to cycle through colors
int buttonPoll = 0; // Current button state
int buttonLastState = 0; // Last state of the button
unsigned long pressTime = 0; // Time when the button was pressed
bool shading = false; // Flag to check if shading is active
void setup() {
pinMode(button, INPUT);
// RGB LED set as output
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(blueLED, OUTPUT);
// Initially turn off all LEDs
digitalWrite(redLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(blueLED, LOW);
}
void loop() {
buttonPoll = digitalRead(button);
// If the button is pressed
if (buttonPoll == HIGH && buttonLastState == LOW) {
pressTime = millis(); // Record the time the button was pressed
}
// Check if the button is held for more than 3 seconds (3000ms)
if (buttonPoll == HIGH && (millis() - pressTime > 3000)) {
shading = true; // Activate shading mode
}
// When the button is released
if (buttonPoll == LOW && buttonLastState == HIGH) {
if (!shading) {
state = old + 1; // Move to the next color if shading is not active
if (state > 12) {
state = 1; // Cycle back to the first color
}
} else {
shading = false; // Stop shading when the button is released
}
}
buttonLastState = buttonPoll; // Store the last button state
// If shading is active, pulse the current color
if (shading) {
pulseColor(state); // Apply the shading effect
} else {
// Display the static color
displayColor(state);
old = state;
}
}
// Function to display static colors based on the state
void displayColor(int color) {
switch (color) {
case 1: // Dark Red
analogWrite(redLED, 128);
analogWrite(greenLED, 0);
analogWrite(blueLED, 0);
break;
case 2: // Dark Green
analogWrite(redLED, 0);
analogWrite(greenLED, 128);
analogWrite(blueLED, 0);
break;
case 3: // Dark Blue
analogWrite(redLED, 0);
analogWrite(greenLED, 0);
analogWrite(blueLED, 128);
break;
case 4: // Dark Cyan
analogWrite(redLED, 0);
analogWrite(greenLED, 128);
analogWrite(blueLED, 128);
break;
case 5: // Dark Magenta
analogWrite(redLED, 128);
analogWrite(greenLED, 0);
analogWrite(blueLED, 128);
break;
case 6: // Dark Yellow
analogWrite(redLED, 128);
analogWrite(greenLED, 128);
analogWrite(blueLED, 0);
break;
case 7: // Dark Orange
analogWrite(redLED, 255);
analogWrite(greenLED, 100);
analogWrite(blueLED, 0);
break;
case 8: // Dark Purple
analogWrite(redLED, 75);
analogWrite(greenLED, 0);
analogWrite(blueLED, 130);
break;
case 9: // Dark Teal
analogWrite(redLED, 0);
analogWrite(greenLED, 128);
analogWrite(blueLED, 128);
break;
case 10: // Dark Olive Green
analogWrite(redLED, 85);
analogWrite(greenLED, 107);
analogWrite(blueLED, 47);
break;
case 11: // Dark Slate Blue
analogWrite(redLED, 72);
analogWrite(greenLED, 61);
analogWrite(blueLED, 139);
break;
case 12: // Dark Brown
analogWrite(redLED, 101);
analogWrite(greenLED, 67);
analogWrite(blueLED, 33);
break;
default:
// Turn off LEDs
analogWrite(redLED, 0);
analogWrite(greenLED, 0);
analogWrite(blueLED, 0);
break;
}
}
// Function to pulse the current color
void pulseColor(int color) {
for (int brightness = 0; brightness <= 255; brightness++) {
setColorBrightness(color, brightness); // Increase brightness
delay(10); // Small delay for smooth transition
}
for (int brightness = 255; brightness >= 0; brightness--) {
setColorBrightness(color, brightness); // Decrease brightness
delay(10); // Small delay for smooth transition
}
}
// Function to set color brightness based on the state and brightness value
void setColorBrightness(int color, int brightness) {
switch (color) {
case 1: // Dark Red
analogWrite(redLED, brightness * 128 / 255);
analogWrite(greenLED, 0);
analogWrite(blueLED, 0);
break;
case 2: // Dark Green
analogWrite(redLED, 0);
analogWrite(greenLED, brightness * 128 / 255);
analogWrite(blueLED, 0);
break;
case 3: // Dark Blue
analogWrite(redLED, 0);
analogWrite(greenLED, 0);
analogWrite(blueLED, brightness * 128 / 255);
break;
case 4: // Dark Cyan
analogWrite(redLED, 0);
analogWrite(greenLED, brightness * 128 / 255);
analogWrite(blueLED, brightness * 128 / 255);
break;
case 5: // Dark Magenta
analogWrite(redLED, brightness * 128 / 255);
analogWrite(greenLED, 0);
analogWrite(blueLED, brightness * 128 / 255);
break;
case 6: // Dark Yellow
analogWrite(redLED, brightness * 128 / 255);
analogWrite(greenLED, brightness * 128 / 255);
analogWrite(blueLED, 0);
break;
case 7: // Dark Orange
analogWrite(redLED, brightness * 255 / 255);
analogWrite(greenLED, brightness * 100 / 255);
analogWrite(blueLED, 0);
break;
case 8: // Dark Purple
analogWrite(redLED, brightness * 75 / 255);
analogWrite(greenLED, 0);
analogWrite(blueLED, brightness * 130 / 255);
break;
case 9: // Dark Teal
analogWrite(redLED, 0);
analogWrite(greenLED, brightness * 128 / 255);
analogWrite(blueLED, brightness * 128 / 255);
break;
case 10: // Dark Olive Green
analogWrite(redLED, brightness * 85 / 255);
analogWrite(greenLED, brightness * 107 / 255);
analogWrite(blueLED, brightness * 47 / 255);
break;
case 11: // Dark Slate Blue
analogWrite(redLED, brightness * 72 / 255);
analogWrite(greenLED, brightness * 61 / 255);
analogWrite(blueLED, brightness * 139 / 255);
break;
case 12: // Dark Brown
analogWrite(redLED, brightness * 101 / 255);
analogWrite(greenLED, brightness * 67 / 255);
analogWrite(blueLED, brightness * 33 / 255);
break;
}
}