// 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();
}
Loading
esp32-c3-devkitm-1