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