/*
Rotary Encoder volume control example
Usage: rotate the knob to control the value,
click the knob to change between volume/bass/treble.
https://wokwi.com/arduino/projects/304919215794553409
Released under the MIT license.
Copyright (C) 2021, Uri Shaked.
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/Picopixel.h>
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
#define LED1 5
#define LED2 6
#define LED3 7
#define LED4 8
#define LED_A 9
#define LED_B 10
#define LED_C 11
#define LED_D 12
uint8_t led1_on = 20;
uint8_t led1_off = 20;
uint8_t led2_on = 50;
uint8_t led2_off = 50;
uint8_t led3_on = 100;
uint8_t led3_off = 100;
uint8_t led4_on = 200;
uint8_t led4_off = 200;
unsigned long previousMillis1 = 0; // Die Zeit des letzten Zustandswechsels für die erste LED
unsigned long previousMillis2 = 0; // Die Zeit des letzten Zustandswechsels für die erste LED
unsigned long previousMillis3 = 0; // Die Zeit des letzten Zustandswechsels für die erste LED
unsigned long previousMillis4 = 0; // Die Zeit des letzten Zustandswechsels für die erste LED
unsigned long previousMillis_A = 0; // Variable zur Speicherung der vorherigen Zeit
const long interval = 1000; // Intervall in Millisekunden (1 Sekunde)
int ledState_A = LOW; // Anfangszustand der LED
typedef enum {
SET_LED1_ON,
SET_LED1_OFF,
SET_LED2_ON,
SET_LED2_OFF,
SET_LED3_ON,
SET_LED3_OFF,
SET_LED4_ON,
SET_LED4_OFF,
SET_WARTEN,
} Mode;
int ledState1 = HIGH;
int ledState2 = HIGH;
int ledState3 = HIGH;
int ledState4 = HIGH;
unsigned long previousMillis = 0;
Mode mode = SET_LED1_ON;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void nextMode() {
switch (mode) {
case SET_LED1_ON:
mode = SET_LED1_OFF;
break;
case SET_LED1_OFF:
mode = SET_LED2_ON;
break;
case SET_LED2_ON:
mode = SET_LED2_OFF;
break;
case SET_LED2_OFF:
mode = SET_LED3_ON;
break;
case SET_LED3_ON:
mode = SET_LED3_OFF;
break;
case SET_LED3_OFF:
mode = SET_LED4_ON;
break;
case SET_LED4_ON:
mode = SET_LED4_OFF;
break;
case SET_LED4_OFF:
mode = SET_WARTEN;
break;
case SET_WARTEN:
mode = SET_LED1_ON;
break;
}
}
void updateValue(int delta) {
switch (mode) {
case SET_LED1_ON:
led1_on = constrain(led1_on + delta, 0, 100);
break;
case SET_LED1_OFF:
led1_off = constrain(led1_off + delta, 0, 200);
break;
case SET_LED2_ON:
led2_on = constrain(led2_on + delta, 0, 100);
break;
case SET_LED2_OFF:
led2_off = constrain(led2_off + delta, 0, 200);
break;
case SET_LED3_ON:
led3_on = constrain(led3_on + delta, 0, 100);
break;
case SET_LED3_OFF:
led3_off = constrain(led3_off + delta, 0, 200);
break;
case SET_LED4_ON:
led4_on = constrain(led4_on + delta, 0, 100);
break;
case SET_LED4_OFF:
led4_off = constrain(led4_off + delta, 0, 200);
break;
}
}
void updateLED(){
if (mode == SET_LED1_ON) {
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, LOW);
}
if (mode == SET_LED1_OFF) {
digitalWrite(LED_A, HIGH);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, LOW);
}
if (mode == SET_LED2_ON) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, LOW);
}
if (mode == SET_LED2_OFF) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, HIGH);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, LOW);
}
if (mode == SET_LED3_ON) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, HIGH);
digitalWrite(LED_D, LOW);
}
if (mode == SET_LED3_OFF) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, HIGH);
digitalWrite(LED_D, LOW);
}
if (mode == SET_LED4_ON) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, HIGH);
}
if (mode == SET_LED4_OFF) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, HIGH);
}
if (mode == SET_WARTEN) {
digitalWrite(LED_A, LOW);
digitalWrite(LED_B, LOW);
digitalWrite(LED_C, LOW);
digitalWrite(LED_D, LOW);
}
}
void updateDisplay() {
display.clearDisplay();
display.setFont();
display.setTextColor(1);
//VENTIL 1
if (mode == SET_LED1_ON) {
display.setCursor(2, 2);
display.print("Ventil 1");
display.drawRoundRect(7, 17, 118, 13, 1, WHITE);
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led1_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led1_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
if (mode == SET_LED1_OFF) {
display.setCursor(2, 2);
display.print("Ventil 1");
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led1_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.drawRoundRect(7, 32, 118, 13, 1, WHITE);
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led1_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
//VENTIL 2
if (mode == SET_LED2_ON) {
display.setCursor(2, 2);
display.print("Ventil 2");
display.drawRoundRect(7, 17, 118, 13, 1, WHITE);
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led2_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led2_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
if (mode == SET_LED2_OFF) {
display.setCursor(2, 2);
display.print("Ventil 2");
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led2_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.drawRoundRect(7, 32, 118, 13, 1, WHITE);
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led2_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
//VENTIL 3
if (mode == SET_LED3_ON) {
display.setCursor(2, 2);
display.print("Ventil 3");
display.drawRoundRect(7, 17, 118, 13, 1, WHITE);
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led3_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led3_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
if (mode == SET_LED3_OFF) {
display.setCursor(2, 2);
display.print("Ventil 3");
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led3_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.drawRoundRect(7, 32, 118, 13, 1, WHITE);
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led3_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
//VENTIL 4
if (mode == SET_LED4_ON) {
display.setCursor(2, 2);
display.print("Ventil 4");
display.drawRoundRect(7, 17, 118, 13, 1, WHITE);
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led4_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led4_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
if (mode == SET_LED4_OFF) {
display.setCursor(2, 2);
display.print("Ventil 4");
display.setCursor(10, 20);
display.print("Ventil Auf");
display.setCursor(82, 20);
display.print(led4_on * 10);
display.setCursor(110, 20);
display.print("ms");
display.drawRoundRect(7, 32, 118, 13, 1, WHITE);
display.setCursor(10, 35);
display.print("Ventil Zu");
display.setCursor(82, 35);
display.print(led4_off * 10);
display.setCursor(110, 35);
display.print("ms");
}
if (mode == SET_WARTEN) {
display.setCursor(2, 2);
display.print("--> Neustart");
}
display.display();
}
void blinking() {
unsigned long currentMillis = millis(); // Aktuelle Zeit abrufen
// Überprüfe, ob die Zeit für einen Zustandswechsel der ersten LED vergangen ist
if (ledState1 == HIGH && currentMillis - previousMillis1 >= led1_on*10) {
ledState1 = LOW;
previousMillis1 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die erste LED
digitalWrite(LED1, ledState1); // Setze den Zustand auf die erste LED
} else if (ledState1 == LOW && currentMillis - previousMillis1 >= led1_off*10) {
ledState1 = HIGH;
previousMillis1 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die erste LED
digitalWrite(LED1, ledState1); // Setze den Zustand auf die erste LED
}
// Überprüfe, ob die Zeit für einen Zustandswechsel der zweiten LED vergangen ist
if (ledState2 == HIGH && currentMillis - previousMillis2 >= led2_on*10) {
ledState2 = LOW;
previousMillis2 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die zweite LED
digitalWrite(LED2, ledState2); // Setze den Zustand auf die zweite LED
} else if (ledState2 == LOW && currentMillis - previousMillis2 >= led2_off*10) {
ledState2 = HIGH;
previousMillis2 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die zweite LED
digitalWrite(LED2, ledState2); // Setze den Zustand auf die zweite LED
}
if (ledState3 == HIGH && currentMillis - previousMillis3 >= led3_on*10) {
ledState3 = LOW;
previousMillis3 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die erste LED
digitalWrite(LED3, ledState3); // Setze den Zustand auf die erste LED
} else if (ledState3 == LOW && currentMillis - previousMillis3 >= led3_off*10) {
ledState3 = HIGH;
previousMillis3 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die erste LED
digitalWrite(LED3, ledState3); // Setze den Zustand auf die erste LED
}
if (ledState4 == HIGH && currentMillis - previousMillis4 >= led4_on*10) {
ledState4 = LOW;
previousMillis4 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die erste LED
digitalWrite(LED4, ledState4); // Setze den Zustand auf die erste LED
} else if (ledState4 == LOW && currentMillis - previousMillis4 >= led4_off*10) {
ledState4 = HIGH;
previousMillis4 = currentMillis; // Aktualisiere die Zeit des letzten Zustandswechsels für die erste LED
digitalWrite(LED4, ledState4); // Setze den Zustand auf die erste LED
}
}
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(LED_C, OUTPUT);
pinMode(LED_D, OUTPUT);
digitalWrite(LED1,ledState1);// set initial state
digitalWrite(LED2,ledState2);// set initial state
Serial.begin(9600);
updateDisplay();
updateLED();
}
long int modeLastChanged = 0;
int prevClk = HIGH;
void loop() {
if (digitalRead(ENCODER_SW) == LOW && millis() - modeLastChanged > 500) {
modeLastChanged = millis();
nextMode();
updateDisplay();
}
int clk = digitalRead(ENCODER_CLK);
if (clk != prevClk && clk == LOW) {
int dt = digitalRead(ENCODER_DT);
int delta = dt == HIGH ? 5 : -5;
updateValue(delta);
updateDisplay();
}
prevClk = clk;
blinking();
updateLED();
}