#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define SW1 2
#define LED_R 11
#define LED_G 12
#define LED_B 13
int Count = 0;
bool isButtonHeld = false;
bool longPressDetected = false;
bool needToMoveCursor = true;
void setup() {
pinMode(SW1, INPUT_PULLUP);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("ALL R G B ");
lcd.setCursor(0, 1);
lcd.print(" ^");
}
void loop() {
static unsigned long lastDebounceTime = 0;
static unsigned long buttonPressTime = 0;
const unsigned long debounceDelay = 50;
const unsigned long longPressDelay = 500;
if (digitalRead(SW1) == LOW) {
if (!isButtonHeld) {
isButtonHeld = true;
lastDebounceTime = millis();
buttonPressTime = millis();
longPressDetected = false;
} else {
if (!longPressDetected && millis() - buttonPressTime > longPressDelay)
{
longPressDetected = true;
needToMoveCursor = false;
if (Count == 0) {
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, HIGH);
} else if (Count == 1) {
digitalWrite(LED_R, HIGH);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
} else if (Count == 2) {
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, HIGH);
digitalWrite(LED_B, LOW);
} else if (Count == 3) {
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, HIGH);
}
}
}
} else {
if (isButtonHeld && millis() - lastDebounceTime > debounceDelay) {
isButtonHeld = false;
if (longPressDetected) {
digitalWrite(LED_R, LOW);
digitalWrite(LED_G, LOW);
digitalWrite(LED_B, LOW);
} else {
if (needToMoveCursor) {
Count++;
if (Count > 3) {
Count = 0;
}
lcd.setCursor(0, 1);
lcd.print(" ");
int positions[] = {0, 5, 9, 13};
lcd.setCursor(positions[Count], 1);
lcd.print(" ^");
} else {
needToMoveCursor = true;
}
}
}
}
}