In diesem kurzen Beitrag möchte ich dir zeigen, wie du eine Infrarot-Fernbedienung am ESP32 mit MicroPython auslesen kannst. Ich werde dich Schritt-für-Schritt mitnehmen und dir somit alles aufzeigen, was du benötigst, um später mit der Fernbedienung Aktoren wie LEDs, LED-Streifen, Motoren, Servos etc. zu steuern.
Inhaltsverzeichnis
- Benötigte Ressourcen für den Aufbau der Schaltung am ESP32
- Aufbau der Schaltung am ESP32
- Aufbau der Schaltung am AZ-Delivery ESP32 mit LEDs
- Vorbereitung des ESP32
- Programmieren in der Thonny IDE
Benötigte Ressourcen für den Aufbau der Schaltung am ESP32
Für unsere Schaltung benötigen wir:
- einen ESP32*,
- ein Micro-USB-Datenkabel*,
- ein Infrarot Funk Fernbedienung Set*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Zum Testen der Fernbedienung verwende ich hier zusätzlich drei verschiedenfarbige LEDs inkl. Vorwiderstand.
Aufbau der Schaltung am ESP32
Das IR-Remote Modul K022 verfügt über drei Pins (GND, VCC, Signal), welche wie nachfolgend an den ESP32 angeschlossen werden.
Aufbau der Schaltung am AZ-Delivery ESP32 mit LEDs
In meinem Fall nutze ich den AZ-Delivery ESP32, welcher im Formfaktor des Arduino UNO daher kommt. Zusätzlich implementiere ich noch vier farbige LEDs, welche ich später einzeln schalten möchte.
Vorbereitung des ESP32
Wenn du wie ich den ESP32 für viele Experimente und Schaltungen verwendest, dann ist es ratsam, bevor man mit der Schaltung und vor allem Programmierung beginnt, ein leeres Programm auf den Mikrocontroller zu spielen.
Im Fall von MicroPython ist dieses recht einfach, denn wir können hier einfach eine leere PY-Datei mit der Thonny IDE hochladen.
Programmieren in der Thonny IDE
Das Programm erzeuge ich in der Thonny IDE welche du unter https://thonny.org/ für macOS, Windows und auch Linux kostenfrei herunterladen kannst.
Zum Auslesen der IR-Fernbedienung benötigen wir eine Bibliothek, diese kannst du dir vom GitHub Repository peterhinch / micropython_ir als ZIP-Datei herunterladen.
Wenn du die ZIP-Datei heruntergeladen und entpackt hast, dann musst du den Ordner „ir_rx“ in den Ordner lib auf dem ESP32 kopieren.
Auslesen der IR-Fernbedienung
Auf dem Markt gibt es diverse Sets mit ebenso verschiedenen IR-Fernbedienungen. In meinem Fall nutze ich eine kleine einfache Fernbedienung, welche wie nachfolgend aufgebaut ist.
| Taste | Code | Taste | Code |
|---|---|---|---|
| POWER | 69 | MODE | 70 |
| MUTE | 71 | PLAY/PAUSE | 68 |
| BACK | 64 | NEXT | 67 |
| EQ | 7 | – | 21 |
| + | 9 | 0 | 22 |
| repeat | 25 | U/SD | 13 |
| 1 | 12 | 2 | 24 |
| 3 | 94 | 4 | 8 |
| 5 | 28 | 6 | 90 |
| 7 | 77 | 8 | 82 |
| 9 | 74 |
Der MicroPython Code zum auslesen der IR-Fernbedienung:
#Import der benötigten Module
from machine import Pin, freq
from ir_rx.print_error import print_error
#Für die IR-Fernbedienung benötige ich das Modul NEC-16
#ggf. musst du hier den Import anpassen.
from ir_rx.nec import NEC_16
#IR-Receiver am Pin GPIO14 angeschlossen
pin_ir = Pin(14, Pin.IN)
#Funktion um den Code der Taste auszuwerten,
#hier können wir später mit einem Switch oder einer
#If-Bedienung auf die Tasten reagieren.
def decodeKeyValue(data):
print(data)
#Funktion welche bei einem Tastendruck auf
#der IR-Fernbedienung ausgeführt werden soll.
def callback(data, addr, ctrl):
#Wenn keine gültigen Daten empfangen wurden
#dann soll nichts passieren.
if data < 0:
pass
else:
#Wenn jedoch gültige Daten empfangen wurden,
#dann soll die Funktion decodeKeyValue mit
#diesen aufgerufen werden.
print(decodeKeyValue(data))
#Definieren das, dass IR-Modul am Pin 14 angeschlossen ist,
#zusätzlich wird noch ein Callback angegeben welcher aufgerufen wird,
#wenn eine Taste betätigt wird.
ir = NEC_16(pin_ir, callback)
#Im Fehlerfall soll die das Modul "print_error" angesteuert werden
ir.error_function(print_error)
#Try-Except Block
try:
#starten einer leeren Endlosschleife
while True:
pass
#Wenn das Programm über Strg + C oder
#über die IDE abgebrochen wird, wird ebenso
#die Verbindung zum IR-Modul geschlossen.
except KeyboardInterrupt:
ir.close()
steuern von LEDs mit einer Infrarot-Fernbedienung am ESP32 mit MicroPython
Nachfolgend nun ein kleines Programm zum steuern von LEDs via IR-Fernbedienung am ESP32.
Du kannst statt LEDs auch andere Aktoren wie Servomotoren, Motoren (am Motorshield) ansteuern.
#Import der benötigten Module
from machine import Pin, freq
import machine
from ir_rx.print_error import print_error
#Für die IR-Fernbedienung benötige ich das Modul NEC-16
#ggf. musst du hier den Import anpassen.
from ir_rx.nec import NEC_16
#LEDs
ledRot = Pin(18, Pin.OUT)
ledGruen = Pin(12, Pin.OUT)
ledBlau = Pin(23, Pin.OUT)
ledGelb = Pin(19, Pin.OUT)
#IR-Receiver am Pin GPIO14 angeschlossen
pin_ir = Pin(14, Pin.IN)
powerOn = False
ledRotOn = False
ledGruenOn = False
ledBlauOn = False
ledGelbOn = False
#Funktion zum aktivieren des Codes
#die LEDs gruen, blau und gelb
#lassen sich nur aktivieren wenn die
#rote LED leuchtet.
def togglePower():
global powerOn, ledRot
powerOn = not powerOn
ledRot.value(powerOn)
#Funktion für die grüne LED
def toggleLEDGruen():
#laden der globalen Felder
global powerOn, ledGruen, ledGruenOn
#prüfen ob das Feld powerOn WAHR / True ist
if powerOn:
#umkehren des Status der LED
ledGruenOn = not ledGruenOn
#zuweisen des neuen Status zum Pin
ledGruen.value(ledGruenOn)
def toggleLEDBlau():
global powerOn, ledBlau, ledBlauOn
if powerOn:
ledBlauOn = not ledBlauOn
ledBlau.value(ledBlauOn)
def toggleLEDGelb():
global powerOn, ledGelb, ledGelbOn
if powerOn:
ledGelbOn = not ledGelbOn
ledGelb.value(ledGelbOn)
#Funktion um den Code der Taste auszuwerten,
#hier können wir später mit einem Switch oder einer
#If-Bedienung auf die Tasten reagieren.
def decodeKeyValue(data):
global ledGruen, ledGruenOn, ledBlau, ledBlauOn, ledGelb, ledGelbOn
if data == 69: #Taste POWER
togglePower()
elif data == 12: #Taste 1 - grüne LED
toggleLEDGruen()
elif data == 24: #Taste 2 - blaue LED
toggleLEDBlau()
elif data == 94: #Taste 3 - gelbe LED
toggleLEDGelb()
else: #alle anderen Tasten
print("Taste nicht belegt!")
#Funktion welche bei einem Tastendruck auf
#der IR-Fernbedienung ausgeführt werden soll.
def callback(data, addr, ctrl):
#Wenn keine gültigen Daten empfangen wurden
#dann soll nichts passieren.
if data < 0:
pass
else:
#Wenn jedoch gültige Daten empfangen wurden,
#dann soll die Funktion decodeKeyValue mit
#diesen aufgerufen werden.
decodeKeyValue(data)
#Definieren das, dass IR-Modul am Pin 14 angeschlossen ist,
#zusätzlich wird noch ein Callback angegeben welcher aufgerufen wird,
#wenn eine Taste betätigt wird.
ir = NEC_16(pin_ir, callback)
#Im Fehlerfall soll die das Modul "print_error" angesteuert werden
ir.error_function(print_error)
#Try-Except Block
try:
#initial die LEDs deaktivieren
ledRot.off()
ledGruen.off()
ledBlau.off()
ledGelb.off()
#starten einer leeren Endlosschleife
while True:
pass
#Wenn das Programm über Strg + C oder
#über die IDE abgebrochen wird, wird ebenso
#die Verbindung zum IR-Modul geschlossen.
except KeyboardInterrupt:
ir.close()
Letzte Aktualisierung am: 10. März 2024



Hallo, lässt sich das einfach auf die ESP8266-NodeMCU übertragen?
Was müsste ich ändern?
ESP32 ist im Moment nur als ESP32-CAM vorhanden.
Hi,
das sollte auch auf einem ESP8266 laufen. Schaue ich mir gerne mal an.
Gruß,
Stefan
Hi Stefan,
danke für die Rückmeldung.
Habe inzwischen was zum 8266 gefunden:
https://github.com/crankyoldgit/IRremoteESP8266/wiki#ir-receiving
Es funktioniert ! Ich musste nur ‚const uint32_t kBaudRate = 115200;‘
auf 9600 setzen. Mein PC ist wohl zu lahm.
Bei 115200 kommt nur wirres Zeug zurück .
Gruß,
JoKa