// Schnupperlehre: 2024-02-14
// HW: MCU (ESP32-C3-Super Mini), Rotary Encoder & 24-er LED-Ring
// Mit dem Rotary Encoder können verschiedene Anzeigemodi gewählt werden:
// - Drehbewegung neuer Modus wählen
// - Mit Button gewählter Modus anzeigen
// Zeiten definieren
#define TIME_BLINK 100 // Zeitdauer in ms
// RGB-LED-Ring definieren
#include <Adafruit_NeoPixel.h>
#define RGB_STRIPE_1 4 // Pin 4
#define NUM_PIXELS 16 // Anzahl LEDs
Adafruit_NeoPixel led_ring(NUM_PIXELS, RGB_STRIPE_1, NEO_GRB + NEO_KHZ800); // Erstelle ein Objekt LED-Ring
// Rotary Encoder definieren
#define BUTTON 1 // Zeitdauer in ms
#define STATE_MAX 7 // Anzahl Anzeigeeffekte
// Funktionen deklarieren
void setAllLedsToColor (byte r, byte g, byte b);
// Variabeln deklarieren und initialisieren
// boolean (true or false), byte (0 ... 255), unsigned int (0 ... 65535)
boolean button_bup = false;
boolean first = true;
byte i;
byte step;
byte mode = 0;
unsigned int time_counter = 0;
unsigned int time_interval = 0;
boolean interval = false;
byte r = 0, g = 0, b = 0;
byte r_array[16] = {0 ,0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
byte g_array[16] = {255 ,255 , 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255};
byte b_array[16] = {0 ,0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
byte rgb_array[16][3] = {{0xF0, 0x00, 0x00},
{0xC0, 0x30, 0x00},
{0x90, 0x60, 0x00},
{0x60, 0x90, 0x00},
{0x30, 0xC0, 0x00},
{0x00, 0xF0, 0x00},
{0x00, 0xC0, 0x30},
{0x00, 0x90, 0x60},
{0x00, 0x60, 0x90},
{0x00, 0x30, 0xC0},
{0x00, 0x00, 0xF0},
{0x30, 0x00, 0xC0},
{0x60, 0x00, 0x90},
{0x90, 0x00, 0x60},
{0xC0, 0x00, 0x30},
{0xF0, 0x00, 0x00}};
// ------------------------------------------------------------------------------------
// SETUP
// ------------------------------------------------------------------------------------
void setup() {
led_ring.begin(); // LED-Ring inititalisieren
Serial.begin(115200);
Serial.println("---------------------------------------------------------");
pinMode(BUTTON, INPUT_PULLUP);
// Power-On-Test => für 2s leuchten alle LEDs weiss
setAllLedsToColor(0xFF, 0xFF, 0xFF);
delay(2000);
led_ring.clear(); // Set all pixel colors to ’off’
}
// ------------------------------------------------------------------------------------
// LOOP
// ------------------------------------------------------------------------------------
void loop() {
// Taster am Rotary Endoder prüfen ob er gedrückt wurde, wenn dann state
// eins im Kreis herum schieben.
if ((digitalRead(BUTTON) == LOW) && (button_bup == false)) {
button_bup = true;
first = true;
if (mode < (STATE_MAX - 1)) {
mode++;
} else {
mode = 0;
}
Serial.print("State: "); Serial.println(mode);
}
if ((digitalRead(BUTTON) == HIGH) && (button_bup == true)) {
button_bup = false;
}
switch (mode) {
// Modus "Alle LEDs rot"
case 0: if (first == true) {
first = false;
setAllLedsToColor(0xFF, 0x00, 0x00);
}
break;
// Modus "Alle LEDs grün"
case 1: if (first == true) {
first = false;
setAllLedsToColor(0x00, 0xFF, 0x00);
}
break;
// Modus "Alle LEDs blau"
case 2: if (first == true) {
first = false;
setAllLedsToColor(0x00, 0x00, 0xFF);
}
break;
// Modus "Alle LEDs weiss"
case 3: if (first == true) {
first = false;
setAllLedsToColor(0xFF, 0xFF, 0xFF);
}
break;
// Modus "Alle LEDs der Reihen nach im Uhrzeigersinn und den Farben im Array entsprechend einschalten"
case 4: if (first == true) {
first = false;
time_counter = 0;
time_interval = 50;
interval = true;
step = 0;
}
if (interval == true) {
interval = false;
for(i = 0; i < NUM_PIXELS; i++) {
if (i <= step) {
led_ring.setPixelColor(i, led_ring.Color(r_array[i], g_array[i], b_array[i]));
} else {
led_ring.setPixelColor(i, led_ring.Color(0x00, 0x00, 0x00));
}
}
led_ring.show();
if (step < 15) {
step++;
} else {
step = 0;
}
}
break;
// Modus "Alle LEDs in 24 Stufen durch den Regenbogen"
case 5: if (first == true) {
first = false;
time_interval = 100;
r = 240;
g = 0;
b = 0;
step = 0;
for (i = 0; i < NUM_PIXELS; i++) {
led_ring.setPixelColor(i, led_ring.Color(r, g, b));
}
led_ring.show();
}
if (interval == true) {
Serial.print("Step: "); Serial.print(step); Serial.print(" R: "); Serial.print(r); Serial.print(", G: "); Serial.print(g); Serial.print(", B: "); Serial.println(b);
interval = false;
if (step < 8) {
r -= 30;
g += 30;
} else if (step < 16 ) {
g -= 30;
b += 30;
} else {
b -= 30;
r += 30;
}
if (step < 23) {
step++;
} else {
step = 0;
}
for (i = 0; i < NUM_PIXELS; i++) {
led_ring.setPixelColor(i, led_ring.Color(r, g, b));
}
led_ring.show();
}
break;
// Modus "Alle LEDs der Reihen nach im Uhrzeigersinn und den Farben im Array entsprechend einschalten"
case 6: if (first == true) {
first = false;
time_counter = 0;
time_interval = 25;
interval = true;
step = 0;
}
if (interval == true) {
interval = false;
for(i = 0; i < NUM_PIXELS; i++) {
if (i <= step) {
led_ring.setPixelColor(i, led_ring.Color(rgb_array[i][0], rgb_array[i][1], rgb_array[i][2]));
} else {
led_ring.setPixelColor(i, led_ring.Color(0x00, 0x00, 0x00));
}
}
led_ring.show();
if (step < 15) {
step++;
} else {
step = 0;
}
}
break;
case 23:
default: break;
}
// Blinkzeit managen
if (time_counter >= time_interval) {
time_counter = 0;
interval = true;
// Serial.println("*");
} else {
time_counter++;
}
delay(10); // Warte 1ms
}
// ------------------------------------------------------------------------------------
// FUNKTIONEN
// ------------------------------------------------------------------------------------
void setAllLedsToColor (byte r, byte g, byte b) {
for (byte i = 0; i < NUM_PIXELS; i++) {
led_ring.setPixelColor(i, led_ring.Color(r, g, b));
}
led_ring.show();
}