Beispiele für den ESP32

Öffnen, F9 drücken, mit F8 Zeile für Zeile durchgehen – in Assembler und in aBelle.

Die Beispiele in Assembler liegen im Ordner examples\esp32 des ZIPs, die in aBelle in examples\abelle\esp32. Jedes läuft mit F9 im RAM des Boards unter dem Debugger; Debug > Write to Flash and Run (Shift+F9) schreibt es in den Flash, dann startet es nach jedem Reset von selbst. Die Register, die ein Beispiel benutzt, stehen in seinen Kommentaren, mit der Quelle.

Was ein Beispiel schreibt, erscheint unter dem Debugger im Reiter Serial neben dem Ausgabefenster, sonst in einem Terminal am COM-Port mit 115200 Baud. Die Ausgaben auf dieser Seite zeigen, wie es aussieht; die Namen der Netze und die Adressen sind geändert.

In Assembler

Xtensa-Code mit .target esp32, im Ordner examples\esp32. Die Quelltexte stehen auch auf GitHub.

Blinken

blink_ram.asm, blink_flash.asm

Die LED an GPIO 2 an und aus, je eine halbe Sekunde, gezählt mit dem Taktzähler ccount. Zeigt den IO-MUX, die GPIO-Register mit ihren Set- und Clear-Adressen und l32r für 32-Bit-Konstanten. Die Flash-Fassung schaltet am Anfang die Watchdogs ab.

Hello, world!

hello_uart_ram.asm, hello_uart_flash.asm

„Hello, world!“ einmal pro Sekunde über UART0, den COM-Port des Boards. Der Text steht in .data im DRAM, wo der Kern Bytes lesen kann. Die Flash-Fassung grüßt bei jedem Start des Boards.

Der Takt

clock_ram.asm

Der Kern vom Quarz (40 MHz) und von der PLL mit 80, 160 und 240 MHz, und wie schnell eine Schleife bei jedem Takt läuft. Zeigt, wie ESP-IDF die PLL einschaltet, in wenigen Registern.

Die Konsole

console.asm

Ein kleines Betriebssystem in Assembler: ein Dateisystem im Flash, Befehle für jedes Terminal (ls, cat, put, rm, df, run, boot) und die Pakete, mit denen das Fenster Board Files von Asmonite spricht.

Start: Debug > ESP32 Board Files > Write Console to Flash, dann Format.

In aBelle: das Board selbst

Programme mit target "esp32", im Ordner examples\abelle\esp32. Sie brauchen nur das Board und das USB-Kabel. Text und Zahlen schreiben sie mit inc\uart.abel.

Blinken

blink.abel

Die LED an GPIO 2 an und aus. Die Register als Feld an ihrer Adresse, eine Funktion des ROM mit at, und watchdogs_off(), damit das Programm auch aus dem Flash läuft.

Hello, world!

hello_uart.abel

„Hello, world!“ und ein Zähler, etwa einmal pro Sekunde über UART0. Zeigt den FIFO des UART und wie man wartet, bis er Platz hat.

Chip-Info

chipinfo.abel

Die MAC-Adresse, die Bauform und die Revision aus den eFuses, dazu die Größe des Flash aus seiner JEDEC-ID. In den eFuses steht sie nicht.

Der Takt

clock.abel

Schaltet den Kern alle sechs Sekunden auf 40, 20 und 10 MHz und misst, wie schnell eine Schleife läuft. Die LED blinkt bei jedem Takt gleich schnell, weil der Timer mitgeht.

Uhr mit Timer

timer.abel

Timer 0 der Timergruppe 0 zählt Mikrosekunden. Die LED blinkt, und jede Sekunde schreibt das Programm, wie lange es läuft.

Würfel

dice.abel

Der Zufallsgenerator des ESP32: erst 600 Würfe und wie oft jede Zahl kam, dann ein Wurf pro Sekunde.

Reaktionsspiel

reaction.abel

Nach 2 bis 5 Sekunden geht die LED an; drück so schnell du kannst den Knopf BOOT. Das Programm schreibt deine Zeit und deine beste. Zeigt einen Pin als Eingang mit Pull-up.

Sieb des Eratosthenes

sieve.abel

Ein Benchmark: die Primzahlen unter 20000, zehnmal, und die Zeit dafür. Das Feld des Siebs hat 20000 Bytes im DRAM.

Temperatur

temperature.abel

Der Temperatursensor im Chip, jede Sekunde sein Rohwert. Leg einen Finger auf das Modul, und der Wert steigt. Der Sensor ist nicht kalibriert; er zeigt Änderungen besser als Grad.

Vor den WLAN-Beispielen

  1. Einmal pro Board: Debug > ESP32 Board Files, Write Console to Flash und Format, wenn das noch nicht geschehen ist, dann Install WiFi (etwa 25 Sekunden).
  2. Das Netz: In inc\network.abel den Namen und das Passwort deines WLAN eintragen (2,4 GHz, offen oder WPA2).
  3. Starten: das Beispiel öffnen und F9 drücken, oder es mit Upload This Program aufs Board laden und dort mit Run, run name in der Konsole oder als Autostart starten.

Jedes WLAN-Beispiel verbindet sich zuerst, holt eine Adresse per DHCP und schreibt sie. Das Programm läuft auf dem ersten Kern, das WLAN auf dem zweiten: An einem Breakpoint bleibt die Verbindung stehen.

connecting to my-network
connected
ip: 192.168.1.73  mask: 255.255.255.0  router: 192.168.1.1  dns: 192.168.1.1  lease: 864000 s

WLAN: das Netz erkunden

Netze suchen

scan.abel

Die WLAN-Netze in der Nähe: Signal, Kanal, Schutz, BSSID und Name. Braucht nur Install WiFi, kein Passwort.

  -45 dBm  ch  1  WPA2       02:11:22:33:44:01  my-network
  -74 dBm  ch  1  WPA/WPA2   02:11:22:33:44:02  neighbour
  -84 dBm  ch  6  WPA2/WPA3  02:11:22:33:44:03  cafe

DHCP

dhcp.abel

Die ersten Frames von aBelle über das WLAN: ein DHCP-DISCOVER, von Hand gebaut, und das OFFER des Routers mit der Adresse, die er vergeben würde.

discover sent: 0
offer: 192.168.1.73 from 192.168.1.1

DNS

dns.abel

Namen in Adressen, beim DNS-Server des Routers, mit der Zeit jeder Antwort; ein Name mit CNAME und einer, den es nicht gibt. Dann alle noch einmal, aus dem Cache des Servers.

example.com = 172.66.147.243  (42 ms)
no-such-name.invalid: no address

Ping

ping.abel

Vier ICMP-Echo-Anfragen an den Router und an einen Server im Internet, wie der Ping eines PCs, mit TTL und Zeit. Pings an das Board beantwortet jedes Beispiel von selbst.

reply from 192.168.1.1: seq 1, ttl 64, 3 ms
4 sent, 4 received, 0 % lost, min/avg/max 2/3/5 ms

Uhrzeit per NTP

ntp.abel

Fragt den Zeitserver der PTB in Braunschweig per NTP (UDP, Port 123) und zeigt Datum und Uhrzeit.

dns: ptbtime1.ptb.de = 192.53.103.108
time: 2026-11-10 06:50:48 UTC, 2026-11-10 07:50:48 CET

Wer ist im Netz?

arpscan.abel

Fragt per ARP jede Adresse des Netzes ab und listet jedes Gerät, das antwortet, mit seiner MAC; auch Geräte, die keine Pings beantworten. Markiert MACs, die sich ein Gerät selbst ausgedacht hat.

Wake-on-LAN

wol.abel

Schickt das „Magic Packet“ an einen PC, der damit aus dem Ruhezustand startet. Die MAC des PCs trägst du in wol_target() ein.

WLAN: Dienste auf dem Board

Mit net_set_name und mdns_start hat das Board einen Namen im Netz: http://esp32.local/ statt der Adresse. TCP kann eine Verbindung zur Zeit, als Client oder Server.

UDP-Echo

udpecho.abel, udpecho.py

Schickt jedes UDP-Paket an Port 7777 an seinen Absender zurück. Auf dem PC: python udpecho.py mit der Adresse des Boards.

listening on 192.168.1.73:7777  (mask 255.255.255.0)
echo 1: 6 bytes from 192.168.1.20:61940 echo 1

Eine Webseite holen

httpget.abel

Findet example.com per DNS, öffnet eine TCP-Verbindung zu Port 80, schickt ein GET und zeigt die Statuszeile, den Titel und die Länge der Seite.

tcp: connected in 26 ms
status: HTTP/1.1 200 OK
title: Example Domain
bytes: 928

Webserver

webserver.abel

Beantwortet jede Anfrage an Port 80 mit einer kleinen Seite: die Nummer der Anfrage, die Sekunden seit dem Start, die erste Zeile der Anfrage. Im Browser: http://esp32.local/.

Telnet-Shell

telnetd.abel

Eine kleine Shell auf Port 23: telnet esp32.local (Windows: das Feature „Telnet-Client“ oder PuTTY). Die Dateien des Boards (ls, cat, hex, df), Speicher (mem), Netz (ip, ping, dns), die LED und ein Reset. Mit boot telnetd in der Konsole startet sie nach jedem Reset.

Die Bausteine dahinter, DHCP, DNS, ARP, ICMP, UDP, TCP und mDNS, stehen in aBelle in inc\net.abel und inc\tcp.abel. Im Debugger kannst du durch jeden Schritt gehen, während die Verbindung auf dem zweiten Kern weiterläuft.

Weiter

Der ESP32

Anschließen, debuggen, Flash, Konsole, WLAN, Speicher und Grenzen.

Die ESP32-Seite →

aBelle

Die Sprache der meisten Beispiele hier, mit der Schreibweise von Python.

Die aBelle-Seite →

Weitere Beispiele

Für Windows und DOS, mit dem Code, den der Assembler daraus macht.

Zu den Beispielen →