C++ Beispiele für Mikrocontroller als wokwi-Projekte
Der Wokwi Simulator ist ein online-Simulator, mit dem man Mikrocontroller-Projekte (für Arduino, ESP32 und Raspberry Pi Pico) in einem Internetbrowser entwickeln und testen kann – ohne physische Hardware. Er ermöglicht das visuelle Verdrahten von Schaltkreisen, das Schreiben von Code (z. B. in C++ oder MicroPython) und das sofortige Ausführen und Debuggen im Browser. Ideal für Unterricht, Prototyping und schnelle Tests.

Beispiele und Lösungen von Übungsaufgaben
zu meinen Kursen
- Embedded C++ Grundkurs – bei der Technischen Akademie Esslingen
- Embedded C++ Aufbaukurs – bei der Technischen Akademie Esslingen
und zu meinem Buch
für den Wokwi-Simulator für
Diese Beipiele können im Browser ausgeführt werden: Sie brauchen keine Hardware, müssen nichts löten und müssen auch nicht befürchten, versehentlich LEDs durchzubrennen. Sie sind auch unter anderen Entwicklungsumgebungen (Arduino-IDE, Visual Micro mit Visual Studio, VS-Code mit PlatformIO usw.) lauffähig (einfach mit Copy und Paste kopieren).
Nach dem Anklicken einer dieser Seiten sieht sketch.ino etwa folgendermaßen aus:
// Uncommment the namespace declaration
// from which you want setup and loop to execute.
// Uncommment exactly one.
//
// namespace activeNamespace = N_3_2_1_introductory_example;
// namespace activeNamespace = N_3_3_2_blink_LED;
// namespace activeNamespace = N_3_3_3_Simple_Trafficlights;
// namespace activeNamespace = N_3_3_4_FSM_Trafficlights;
// namespace activeNamespace = N_3_3_5_Digital_Input_with_PushButton;
// namespace activeNamespace = N_3_3_6_PushButton_with_Interrupt;
namespace activeNamespace = N_3_4_1_AnalogRead;
// namespace activeNamespace = N_3_4_7_Distance_Sensor_HC_SR04;
// namespace activeNamespace = N_3_6_1_fade_LED;
// namespace activeNamespace = N_3_6_2_Audio;
// namespace activeNamespace = N_3_6_Timer_interrupts;
// namespace activeNamespace = N_3_11_blink_LED_with_board_SDK;
void setup()
{
setup_serial_port();
show_gcc_version();
activeNamespace::setup();
}
void loop()
{
activeNamespace::loop();
}
Die Nummern in den Namen bezeichnen die Kapitelnummern in meinem Buch. Um ein anderes Beispiel zu aktivieren, müssen Sie lediglich bei einer (genau einer) Zeile die Kommentar-Markierung „//“ am Anfang entfernen, z.B. für das Beispiel aus Kapitel 3.3.2:
namespace activeNamespace = N_3_3_2_blink_LED;
Das ausgewählte Beispiel starten Sie dann mit

Sie können die Quelltexte unter

anschauen, verändern und einfach damit herumspielen.
Eigene Projekte auf der Basis dieser Projekte
Sie können diese Projekte auch als Ausgangspunkt für eigene Projekte verwenden.
Besonderheiten für wokwi-Projekte (Stand August 2026)
Bei den wokwi-Projekten müssen einige Besonderheiten und Einschränkungen beachtet werden.
Wokwi Raspberry-Projekte:
Bei einem Wokwi-Projekt für einen Raspberry Pi Pico muss man in der Voreinstellung Serial1 anstelle von Serial für eine Ausgabe über die Konsole verwenden. Mit dieser Voreinstellung muss man
Serial1.println("Meldung über die Konsole");
anstelle von
Serial.println("Meldung über die Konsole");
verwenden. Diese Einstellung kann man ändern, indem man in diagram.json die Zeilen mit connections für „$serialMonitor:RX“
"connections": [ [ "pico:GP0", "$serialMonitor:RX", "" ], [ "pico:GP1", "$serialMonitor:TX", "" ] ]
löscht, so dass diagram.json im einfachsten Fall so aussieht:
{
"version": 1,
"author": "Anonymous maker",
"editor": "wokwi",
"parts": [ { "id": "pico", "type": "wokwi-pi-pico" } ]
}
Die anderen Zeilen mit connections dürfen aber nicht gelöscht werden.
In dem fertigen Wokwi-Projekt für den Raspberry Pi Pico wurden diese beiden Zeilen entfernt. Wenn Sie ein eigenes Wokwi-Projekt für einen Raspberry Pi Pico anlegen, müssen Sie entweder auch diese beiden Zeilen entfernen oder Serial1 anstelle von Serial verwenden.
Wokwi Nucleo C031C6
Der wokwi-Simulator unterstützt nicht die gesamte STM32 C031C6 Hardware. Da die Unterstützung immer wieder erweitert wird, wird auf die wokwi-Dokumentation verwiesen. Die meisten Projekte im Buch (DigitalIn/Out und AnalogIn/Out) werden aber unterstützt.
Das C031C6-Board hat nur 32 K Speicher. Das ist für einige Beispiele zu wenig. Damit derselbe Quelltext in allen Projekten verwendet werden kann, werden speicherintensive Anweisungen mit dem Makro SMALL_MEMORY ausgeblendet. Dieses Makro wird bei Projekten für den C031C6 mit
#define SMALL_MEMORY
gesetzt, und bei Mikrocontrollern mit genügend Speicher nicht. Speicherintensive Anweisungen werden dann wie in
#ifndef SMALL_MEMORY // so that the program can be executed on a board with little memory
#include <iostream> (see section 1.3.3 ???)
#endif
und
#ifndef SMALL_MEMORY // so that show_gcc_version can be executed on
// a board with not enough memory for std::cout and
// #include <iostream> (see section 1.3.3 ???)
std::cout << "3. cout GCC Version: " << __GNUC__ << "." << __GNUC_MINOR__ << std::endl;
#endif
ausgeblendet.
float-Werte können sowohl als Argument von printf als auch von Serial.print verwendet werden. Eigentlich sollte man von beiden Anweisungen dieselbe Ausgabe erhalten. Da printf aber die newlib-nano als C-Laufzeitbibliothek verwendet, die keine Gleitkommawerte unterstützt, erhält man mit printf keine Ausgabe von float-Werten. Mit Serial.print funktioniert das aber:
float f=3.1415;
Serial.println(f); // 3.14
printf("printf f=%f \n",f); // printf f=
Compiler-flags (z.B. für Exception-Handling)
Bei wokwi-online-Projekten gibt es kaum Möglichkeiten, Compilerflags zu setzen, um z.B. Exception-Handling zu aktivieren. Mit Makros wie
__EXCEPTIONS | -fexceptions |
| nicht definiert | -fno-exceptions |
__GXX_RTTI | -frtti |
| nicht definiert | -fno-rtti |
kann man aber die aktuellen Einstellungen abfragen.