For this assignment, I decided to use the potentiometer and the button. I wanted the potentiometer to control how bright the RGB light is and use the switch button for 2 purposes, to change the general colour of the RGB but to also start and stop the blinking of the red alarm LED I used.
I had the code use 4 different colours but have this also a factor on how many blinks occur with the LED light.
I had the switch button be used as a way to have the red LED on or off.
To be honest, I used the Claude Sonnet 4..5 model to give me ideas on how I can make the whole system more interesting / creative. That is how the idea of having the number of pings be dependent on the colour came from.
this is the code I used
// PIN location
const int POT_PIN = A0; // Potentiometer
const int BUTTON_PIN = 2; // Push button
const int RGB_RED_PIN = 9;
const int RGB_GREEN_PIN = 10;
const int RGB_BLUE_PIN = 11;
const int MODE_LED_PIN = 13; // Ree LED
int potValue = 0;
int brightness = 0;
bool buttonState = false;
bool lastButtonState = false;
int colorMode = 0;
unsigned long previousMillis = 0; // non-blocking blink timing
const long blinkInterval = 150; // blink interval for mode indicator
bool modeLedState = false;
const char* modeNames[] = {"White", "Red", "Green", "Blue"};
void setup() {
Serial.begin(9600);
// set pins
pinMode(POT_PIN, INPUT);
pinMode(BUTTON_PIN, INPUT);
pinMode(RGB_RED_PIN, OUTPUT);
pinMode(RGB_GREEN_PIN, OUTPUT);
pinMode(RGB_BLUE_PIN, OUTPUT);
pinMode(MODE_LED_PIN, OUTPUT);
// initialise LEDs as off
analogWrite(RGB_RED_PIN, 0);
analogWrite(RGB_GREEN_PIN, 0);
analogWrite(RGB_BLUE_PIN, 0);
digitalWrite(MODE_LED_PIN, LOW);
}
void loop() {
// potentiometer read
potValue = analogRead(POT_PIN);
// map the values of the potentiometer to a brightness value
brightness = map(potValue, 0, 1023, 0, 255);
// button read
buttonState = digitalRead(BUTTON_PIN);
// when button is pressed, change the colour
if (buttonState == HIGH && lastButtonState == LOW) {
colorMode = (colorMode + 1) % 4; //cycle through 0-3
Serial.println(modeNames[colorMode]);
delay(50);
}
lastButtonState = buttonState;
// change RGB LED based on selected colour
switch(colorMode) {
case 0: // white
analogWrite(RGB_RED_PIN, brightness);
analogWrite(RGB_GREEN_PIN, brightness * 0.8);
analogWrite(RGB_BLUE_PIN, brightness * 0.6);
break;
case 1: // red
analogWrite(RGB_RED_PIN, brightness);
analogWrite(RGB_GREEN_PIN, 0);
analogWrite(RGB_BLUE_PIN, 0);
break;
case 2: // green
analogWrite(RGB_RED_PIN, 0);
analogWrite(RGB_GREEN_PIN, brightness);
analogWrite(RGB_BLUE_PIN, 0);
break;
case 3: // blue
analogWrite(RGB_RED_PIN, 0);
analogWrite(RGB_GREEN_PIN, 0);
analogWrite(RGB_BLUE_PIN, brightness);
break;
}
// Mode 0 = no blinks (off)
// Mode 1 = 1 blink
// Mode 2 = 2 blinks
// Mode 3 = 3 blinks
handleModeIndicator();
delay(10); // Small delay for stability
}
//function to handle the
void handleModeIndicator() {
unsigned long currentMillis = millis();
static int blinkCount = 0;
static unsigned long patternStartTime = 0;
static bool isBlinking = false;
// when white, keep LED off
if (colorMode == 0) {
digitalWrite(MODE_LED_PIN, LOW);
blinkCount = 0;
isBlinking = false;
return;
}
// new blink pattern every 2 seconds
if (!isBlinking && (currentMillis - patternStartTime >= 2000)) {
isBlinking = true;
blinkCount = 0;
patternStartTime = currentMillis;
}
// perform blinks equal to color mode number
if (isBlinking) {
unsigned long timeInPattern = currentMillis - patternStartTime;
int currentBlink = timeInPattern / (blinkInterval * 2); // *2 for on+off
if (currentBlink < colorMode) {
// still within the blink count for this mode
unsigned long timeInBlink = timeInPattern % (blinkInterval * 2);
if (timeInBlink < blinkInterval) {
digitalWrite(MODE_LED_PIN, HIGH); // LED on
} else {
digitalWrite(MODE_LED_PIN, LOW); // LED off
}
} else {
digitalWrite(MODE_LED_PIN, LOW);
isBlinking = false;
}
}
}

