// Forum: https://forum.arduino.cc/t/rgbw-pattern-problem/1247866
// This Wokwi project: https://wokwi.com/projects/395236442837506049
// -------------------------------------------
// Glue for the Uno
#define PA13 13
#define PA4 4
#define PA5 9
#define PA6 6
#define PA7 5
#define PB1 3
// -------------------------------------------
// #include <Arduino.h>
#include <EEPROM.h>
#define led PA13
#define btn PA4
#define ledG PA5
#define ledR PA6
#define ledB PA7
#define ledW PB1
#define longTime 5000
int lastState = 0;
int currentState;
int caseSet = 0;
int countPress = 0;
unsigned long pressedTime = 0;
unsigned long releasedTime = 0;
unsigned long previousPressTime = 0;
int lastButtonState = 1;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int buttonState;
int eepromValue;
int cnt = 15000;
void setup() {
Serial.begin(115200); // 9600 is very slow
EEPROM.begin();
eepromValue = EEPROM.read(0);
Serial.print("eepromValue = ");
Serial.print(eepromValue);
eepromValue = 8;
Serial.print(" -> ");
Serial.println(eepromValue);
delay(2000);
pinMode(led, OUTPUT);
pinMode(btn, INPUT);
}
void loop() {
if (caseSet == 0) {
grbwOutputFunc();
int currentState = digitalRead(btn);
if (lastState == HIGH && currentState == LOW) {
pressedTime = millis();
} else if (lastState == LOW && currentState == HIGH) {
releasedTime = millis();
}
long pressDuration = releasedTime - pressedTime;
if (pressDuration > longTime) {
digitalWrite(led, HIGH);
caseSet = 1;
} else {
digitalWrite(led, LOW);
caseSet = 0;
}
lastState = currentState;
}
if (caseSet == 1) {
int reading = digitalRead(btn);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
countPress++;
if (countPress > 10) {
countPress = 1;
}
EEPROM.write(0, countPress);
// EEPROM.commit(); // not for an Arduino Uno
Serial.println((String)"broj: " + countPress);
switch (countPress) {
case 1:
analogWriteColor1();
break;
case 2:
analogWriteColor2();
break;
case 3:
analogWriteColor3();
break;
case 4:
analogWriteColor4();
break;
case 5:
analogWriteColor5();
break;
case 6:
analogWriteColor6();
break;
case 7:
analogWriteColor7();
break;
case 8:
analogWriteColor8();
break;
case 9:
analogWriteColor9();
break;
case 10:
analogWriteColor10();
break;
}
}// if buttonState is low
}// if reading is not buttonState
if ((millis() - lastDebounceTime) > cnt) {
// NVIC_SystemReset(); // not for an Arduino Uno
Serial.println("Press RESET button");
while(true)
delay(10);
}
}
lastButtonState = reading;
}//caseSet 1
}
void grbwOutputFunc() {
switch (eepromValue) {
case 1:
analogWriteColor1();
break;
case 2:
analogWriteColor2();
break;
case 3:
analogWriteColor3();
break;
case 4:
analogWriteColor4();
break;
case 5:
analogWriteColor5();
break;
case 6:
analogWriteColor6();
break;
case 7:
analogWriteColor7();
break;
case 8:
analogWriteColor8();
break;
case 9:
analogWriteColor9();
break;
case 10:
analogWriteColor10();
break;
}
}
void analogWriteColor1() {
Serial.print("(1)");
analogWrite(ledG, 255);
analogWrite(ledR, 0);
analogWrite(ledB, 0);
analogWrite(ledW, 0);
}
void analogWriteColor2() {
Serial.print("(2)");
analogWrite(ledG, 0);
analogWrite(ledR, 255);
analogWrite(ledB, 0);
analogWrite(ledW, 0);
}
void analogWriteColor3() {
Serial.print("(3)");
analogWrite(ledG, 0);
analogWrite(ledR, 0);
analogWrite(ledB, 255);
analogWrite(ledW, 0);
}
void analogWriteColor4() {
Serial.print("(4)");
analogWrite(ledG, 0);
analogWrite(ledR, 0);
analogWrite(ledB, 0);
analogWrite(ledW, 255);
}
void analogWriteColor5() {
Serial.print("(5)");
analogWrite(ledG, 150);
analogWrite(ledR, 150);
analogWrite(ledB, 0);
analogWrite(ledW, 0);
}
void analogWriteColor6() {
Serial.print("(6)");
analogWrite(ledG, 150);
analogWrite(ledR, 0);
analogWrite(ledB, 150);
analogWrite(ledW, 0);
}
void analogWriteColor7() {
Serial.print("(7)");
analogWrite(ledG, 0);
analogWrite(ledR, 150);
analogWrite(ledB, 150);
analogWrite(ledW, 0);
}
void analogWriteColor8() {
Serial.print("(8)");
analogWrite(ledG, 100);
analogWrite(ledR, 255);
analogWrite(ledB, 50);
analogWrite(ledW, 0);
}
void analogWriteColor9() {
Serial.print("(9)");
analogWrite(ledG, 20);
analogWrite(ledR, 120);
analogWrite(ledB, 200);
analogWrite(ledW, 0);
}
void analogWriteColor10() {
analogWrite(ledG, 180);
analogWrite(ledR, 60);
analogWrite(ledB, 30);
analogWrite(ledW, 0);
}