Hardwarenahe Programmierung

Joystick Blue LEDs

Polling

Nachfolgend ein einfache Code, der zum Lesen des Status eines Tasters (drücken des Joysticks) oder eines beliebigen Schalters verwendet wird:

mbedESP32_blueLeds-Joystick-Polling.ino

#define LED1 19       // GPIO19
#define CENTER 25     // GPIO25

void setup(){
  pinMode(LED1, OUTPUT);
  pinMode(CENTER, INPUT);
}
 
void loop()
{
  int center_state = digitalRead(CENTER);
  if ( center_state  == HIGH ) { 
    digitalWrite(LED1, LOW);    // Invertiert
  }
  else {
    digitalWrite(LED1, HIGH); 
  }
}
  • Zeile 1 und 2 geben dem Eingangs-Pin 25 den Namen CENTER und dem Ausgangs-Pin 19 LED1. Im Code werden diese Namen anstelle der PIN-Nummern verwendet.
  • Zeile 5 und 6 in der setup () -Funktion wird die pinMode () -Funktion verwendet, um den CENTER-Pin als INPUT und den LED1-Pin als OUTPUT zu initialisieren.
  • In Zeile 11 der Funktion loop () liest die Funktion digitalRead den Status des Tasters CENTER und speichert den Wert in der Variablen center_state.
  • In Zeile 12 wird der Status der Variablen center_state überprüft. Wenn center_state den Ausgang HIGH liefert, wird die LED1 ausgeschaltet und bleibt ansonsten eingeschaltet.

Interrupt

Mit einem ESP32 Bord können alle GPIO-Pins als Interrupt-Anforderungseingänge konfiguriert werden. im ESP32 wird eine Interrupt-Serviceroutine (ISR) definiert, die aufgerufen wird, wenn ein GPIO-Pin seinen Signalwert ändert:

mbedESP32_blueLeds-Joystick-ISR.ino

#define LED1 19       // GPIO19
#define CENTER 25     // GPIO25
 
void IRAM_ATTR handleExIntCenter() {
  digitalWrite(LED1, !digitalRead(LED1));
}
 
void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(CENTER, INPUT_PULLDOWN);
  attachInterrupt(digitalPinToInterrupt(CENTER), handleExIntCenter, RISING);
}

void loop() {
}
  • In Zeile 11 wird die ISR handleExIntCenter an den GPIO-Pin CENTER mit dem Modus der steigenden Flanke gebunden. Mit detachInterrupt(GPIO-Pin); kann der Interrupt wieder vom GPIO-Pin getrennt werden.
  • In Zeile 4 wird die ISR Funktion mit speziellem Attribut IRAM_ATTR festgelegt.
  • In Zeile 5 ist der ISR Körper mit den auszuführenden Instruktionen, hier LED1 umschalten
  • Beachte in Zeile 14 die leere loop-Funktion. Warum?

Mit dem IRAM_ATTR wird der kompilierte Code im internen RAM (IRAM) des ESP32 abgelegt wird - schnellere Ausführung.

Siehe auch

Button-Klasse


All wikipages