{"id":523,"date":"2025-11-10T16:38:29","date_gmt":"2025-11-10T16:38:29","guid":{"rendered":"https:\/\/oberle-it-beratung.de\/?p=489"},"modified":"2025-11-10T16:38:29","modified_gmt":"2025-11-10T16:38:29","slug":"eine-komponenten-architektur-fuer-die-esp32-programmierung","status":"publish","type":"post","link":"https:\/\/www.elrebo.de\/index.php\/2025\/11\/10\/eine-komponenten-architektur-fuer-die-esp32-programmierung\/","title":{"rendered":"Eine Komponenten-Architektur f\u00fcr die ESP32-Programmierung"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Komponenten<\/h3>\n\n\n\n<p>Wenn man ESP32-SoCs programmiert, dann muss man f\u00fcr das Physical Computing unterschiedliche Peripherie ansteuern um auf externe Zust\u00e4nde reagieren zu k\u00f6nnen und die Umwelt zu beeinflussen. <\/p>\n\n\n\n<p>Das sind einerseits Sensoren, um Daten zu erfassen, wie z.B. Ultraschall-Sensoren um Abst\u00e4nde zu messen, oder IO-Pins, um den Zustand von Buttons zu ermitteln.<\/p>\n\n\n\n<p>Andererseits sind das auch Aktoren, mit denen Ergebnisse angezeigt werden (z.B. \u00fcber LEDs) oder mit denen Aktionen durchgef\u00fchrt werden, wie z.B. das Umschalten von Relais oder das Schalten von Steckdosen etc.<\/p>\n\n\n\n<p>All diese Sensoren und Aktoren sollen in dieser Architektur als standardisierte Komponenten bereitgestellt werden. Diese k\u00f6nnen dann baukastenartig zusammengestellt werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SoC-Varianten<\/h3>\n\n\n\n<p>Mittlerweile gibt es verschiedene SoCs im ESP32-Universum. Ich selbst habe z.Zt. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>einen ESP32 (im M5 Atom Lite), <\/li>\n\n\n\n<li>einen ESP32C3 (im Waveshare ESP32-C3-Zero Development Board) und<\/li>\n\n\n\n<li>einen ESP32C6 (im Espressif ESP32-C6-DevKitM-1).<\/li>\n<\/ul>\n\n\n\n<p>Diese Prozessoren haben unterschiedliche Features, die bei der Nutzung ber\u00fccksichtigt werden m\u00fcssen.  Das sind z.B. die unterschiedlichen Input- und Output-Pins (GPIOs).<\/p>\n\n\n\n<p>Die standardisierten Komponenten m\u00fcssen sich an diese Unterschiede anpassen lassen. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Programmierumgebung<\/h3>\n\n\n\n<p>F\u00fcr die ESP32-SoCs wird vom Chip-Hersteller Espressif das ESP-IDF (Espressif IoT Development Framework) bereitgestellt. Mit diesem Framework k\u00f6nnen die SoCs mit C oder mit C++ programmiert werden.<\/p>\n\n\n\n<p>F\u00fcr die hier beschriebene Komponenten-Architektur habe ich mich f\u00fcr die Verwendung von C++ entschieden, da die Komponenten so als C++ Klassen bereitgestellt werden k\u00f6nnen. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel Ultraschallsensor<\/h3>\n\n\n\n<p>Hier ist als Beispiel der Konstruktor f\u00fcr einen Ultraschallsensor HCSR04 an einem ESP32C6 dargestellt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Hcsr04Sensor sensor(\n    std::string(\"Wasserstand\"), \/\/ Tag f\u00fcr das Logging\n    (gpio_num_t) 20, \/\/ triggerGpio\n    (gpio_num_t) 21, \/\/ echoGpio\n    100.0); \/\/ maxDistance<\/code><\/pre>\n\n\n\n<p>Die Konfiguration f\u00fcr den Sensor beinhaltet <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>den Tag f\u00fcr das Logging der Komponente, <\/li>\n\n\n\n<li>den GPIO-Pin f\u00fcr das Triggern der Messung,<\/li>\n\n\n\n<li>den GPIO-Pin f\u00fcr das Ergebnis der Messung und<\/li>\n\n\n\n<li>der maximale Abstand in cm, der gemessen werden kann. <\/li>\n<\/ul>\n\n\n\n<p>Eine Abstandsmessung wird dann mit <code>sensor.GetDistance()<\/code> durchgef\u00fchrt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>float distance = sensor.GetDistance();<\/code><\/pre>\n\n\n\n<p>Mit diesem Beispiel-Programm wird der Abstand jede Sekunde f\u00fcr 10 Sekunden gemessen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Example program to measure ultrasonic distance \n   with elrebo\/hcsr04_sensor\n   every second for 10 seconds\n *\/\n\n#include &lt;string&gt;\n#include \"freertos\/FreeRTOS.h\"\n#include \"freertos\/task.h\"\n#include \"hcsr04_sensor.hpp\"\n#include \"esp_log.h\"\n\nstatic const char *tag = \"ultrasonic_distance\";\n\nextern \"C\" void app_main(void)\n{\n     \/* Configure the Ultrasonic module\n        assuming a development board \n        using triggerPin 20 and echoPin 21 *\/\n     Hcsr04Sensor sensor(\n         std::string(\"Water Level\"), \/\/ Tag for ESP_LOG\n         (gpio_num_t) 20, \/\/ triggerPin\n\t (gpio_num_t) 21, \/\/ echoPin\n\t 100.0); \/\/ maxDistance\n\n    \/* measure the distance every second for 10 seconds *\/\n\n    for(int i=0; i&lt;10; i++) {\n       float distance = sensor.GetDistance();\n       ESP_LOGI(tag, \"The distance is %5.1f cm.\", distance);\n       vTaskDelay(1000 \/ portTICK_PERIOD_MS); \/\/ 1 second\n    }\n}<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"875\" height=\"1024\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-10-um-17.55.48-875x1024.png\" alt=\"\" class=\"wp-image-496\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-10-um-17.55.48-875x1024.png 875w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-10-um-17.55.48-256x300.png 256w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-10-um-17.55.48-768x899.png 768w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-10-um-17.55.48.png 986w\" sizes=\"auto, (max-width: 875px) 100vw, 875px\" \/><\/figure>\n\n\n\n<p>Die ESP-IDF-Komponente ist in der ESP Component Registry ver\u00f6ffentlicht:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>https:&#047;&#047;components.espressif.com\/components\/elrebo-de\/hcsr04_sensor\/versions\/1.0.4\/readme<\/code><\/pre>\n\n\n\n<p>Au\u00dfer der Komponente f\u00fcr den Ultraschallsensor sind dort noch zwei Komponenten<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>f\u00fcr die Steuerung der OnBoard LED und<\/li>\n\n\n\n<li>f\u00fcr die Bedienung eines Buttons \u00fcber eine Callback-Funktion<\/li>\n<\/ul>\n\n\n\n<p>verf\u00fcgbar.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"780\" src=\"https:\/\/elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-13-um-12.36.43-1024x780.png\" alt=\"\" class=\"wp-image-502\" srcset=\"https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-13-um-12.36.43-1024x780.png 1024w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-13-um-12.36.43-300x228.png 300w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-13-um-12.36.43-768x585.png 768w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-13-um-12.36.43-1536x1170.png 1536w, https:\/\/www.elrebo.de\/wp-content\/uploads\/2025\/11\/Bildschirmfoto-2025-11-13-um-12.36.43-2048x1559.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Komponenten Wenn man ESP32-SoCs programmiert, dann muss man f\u00fcr das Physical Computing unterschiedliche Peripherie ansteuern um auf externe Zust\u00e4nde reagieren zu k\u00f6nnen und die Umwelt zu beeinflussen. Das sind einerseits Sensoren, um Daten zu erfassen, wie z.B. Ultraschall-Sensoren um Abst\u00e4nde zu messen, oder IO-Pins, um den Zustand von Buttons zu ermitteln. Andererseits sind das auch [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":495,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,16],"tags":[27],"class_list":["post-523","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp32_socs","category-physical_computing","tag-c"],"_links":{"self":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts\/523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/comments?post=523"}],"version-history":[{"count":0,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/posts\/523\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/media\/495"}],"wp:attachment":[{"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/media?parent=523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/categories?post=523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.elrebo.de\/index.php\/wp-json\/wp\/v2\/tags?post=523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}