/* Simulationsmodell für das blaue ESP32 Demo-Board
 * Alle Programme aus "Einführung ESP32.pdf" sollten hier laufen. 
 * Ausnahme ist der Touch-Sensor, der hier noch nicht möglich ist.
 * Benötigte Bibliotheken
 * https://github.com/ThingPulse/esp8266-oled-ssd1306
 * https://github.com/adafruit/Adafruit_NeoPixel
 */

//***** Portpins für Ein-/Ausgänge ****************************************
const int Enc_A = 34, Enc_B = 35, Enc_Taster = 0, NEO_Pin=26;
const int LED_rot = 32, LED_gruen = 33, Taster2 = 2, Taster4 = 4;

// ***** Datentyp für Zustände ********************************************
enum Zustaende_t { Z0, Z1};
Zustaende_t Zustand;    // Variable vom Typ Zustaende_t

// ***** Globale Variablen ************************************************
bool T2_neu, T2_alt, T4_neu, T4_alt;  // für Flankenerkennung
unsigned long nextMillis;
bool T_druck;

// ***** Initialisierung **************************************************
void setup() {
  Serial.begin(115200);            // Serielle Schnittstelle mit 115200Bit/s
  pinMode(LED_rot, OUTPUT);        // die LEDs beginnen danach
  pinMode(LED_gruen, OUTPUT);      // zu leuchten!
  digitalWrite(LED_rot, HIGH);     // also beide ausschalten
  digitalWrite(LED_gruen, HIGH);
  pinMode(Taster2, INPUT_PULLUP); // Taster brauchen hier den
  pinMode(Taster4, INPUT_PULLUP); // Pullup-Widerstand
  
  Zustand = Z0;
  Serial.printf("Zustand %d\n", Zustand);   
}

// ***** Endlosschleife ***************************************************
void loop() {
  unsigned long currentMillis = millis( );
  if ( currentMillis >= nextMillis ) {
    nextMillis = currentMillis + 50;    // 20x pro Sekunde
    Einlesen( );
    Automat( );
    //Ausgeben( );
  }
}
  

// ***** Eigene Funktionen ************************************************
// ***** Einlesenfunktion: liest alle Eingänge und speichert in globalen Variablen
void Einlesen ( ) {
  // Flankenerkennung
  T2_neu = digitalRead(Taster2);
  if ( T2_neu == 0 && T2_alt == 1) {  // fallende Flanke = Tastendruck
    T_druck = true;
  }
  else {
    T_druck = false;
  }
  T2_alt = T2_neu;  // für Flankenerkennung
}

// ***** Automaten-Funktion ***********************************************
void Automat( ) {
 switch(Zustand) {
  case Z0:  digitalWrite(LED_rot, HIGH);  // Ausschalten
            if (T_druck == true) {
              Zustand = Z1;
              Serial.println("Gehe in Zustand Z1");
            }
            break;
  case Z1:  digitalWrite(LED_rot, LOW);   // Einschalten
            if (T_druck == true) {
              Zustand = Z0;
              Serial.println("Gehe in Zustand Z0");
            }
            break;
  default:  break;
 }
}
// ***** Ausgabe-Funktion *************************************************
// ***** Schreibe den Wert der globalen Variablen an die Ausgänge *********
void Ausgeben( ) {
  
}

Taster2
Taster4
LED32
LED33
ESP32 Schulboard mit LEDs und Tastern, I2C-Bus mit Standard-Belegung
SSD1306 Display
WS2812 an Pin26