Komponenten
Wenn man ESP32-SoCs programmiert, dann muss man für das Physical Computing unterschiedliche Peripherie ansteuern um auf externe Zustände reagieren zu können und die Umwelt zu beeinflussen.
Das sind einerseits Sensoren, um Daten zu erfassen, wie z.B. Ultraschall-Sensoren um Abstände zu messen, oder IO-Pins, um den Zustand von Buttons zu ermitteln.
Andererseits sind das auch Aktoren, mit denen Ergebnisse angezeigt werden (z.B. über LEDs) oder mit denen Aktionen durchgeführt werden, wie z.B. das Umschalten von Relais oder das Schalten von Steckdosen etc.
All diese Sensoren und Aktoren sollen in dieser Architektur als standardisierte Komponenten bereitgestellt werden. Diese können dann baukastenartig zusammengestellt werden.
SoC-Varianten
Mittlerweile gibt es verschiedene SoCs im ESP32-Universum. Ich selbst habe z.Zt.
- einen ESP32 (im M5 Atom Lite),
- einen ESP32C3 (im Waveshare ESP32-C3-Zero Development Board) und
- einen ESP32C6 (im Espressif ESP32-C6-DevKitM-1).
Diese Prozessoren haben unterschiedliche Features, die bei der Nutzung berücksichtigt werden müssen. Das sind z.B. die unterschiedlichen Input- und Output-Pins (GPIOs).
Die standardisierten Komponenten müssen sich an diese Unterschiede anpassen lassen.
Programmierumgebung
Für die ESP32-SoCs wird vom Chip-Hersteller Espressif das ESP-IDF (Espressif IoT Development Framework) bereitgestellt. Mit diesem Framework können die SoCs mit C oder mit C++ programmiert werden.
Für die hier beschriebene Komponenten-Architektur habe ich mich für die Verwendung von C++ entschieden, da die Komponenten so als C++ Klassen bereitgestellt werden können.
Beispiel Ultraschallsensor
Hier ist als Beispiel der Konstruktor für einen Ultraschallsensor HCSR04 an einem ESP32C6 dargestellt:
Hcsr04Sensor sensor(
std::string("Wasserstand"), // Tag für das Logging
(gpio_num_t) 20, // triggerGpio
(gpio_num_t) 21, // echoGpio
100.0); // maxDistance
Die Konfiguration für den Sensor beinhaltet
- den Tag für das Logging der Komponente,
- den GPIO-Pin für das Triggern der Messung,
- den GPIO-Pin für das Ergebnis der Messung und
- der maximale Abstand in cm, der gemessen werden kann.
Eine Abstandsmessung wird dann mit sensor.GetDistance() durchgeführt:
float distance = sensor.GetDistance();
Mit diesem Beispiel-Programm wird der Abstand jede Sekunde für 10 Sekunden gemessen.
/*
* Example program to measure ultrasonic distance
with elrebo/hcsr04_sensor
every second for 10 seconds
*/
#include <string>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "hcsr04_sensor.hpp"
#include "esp_log.h"
static const char *tag = "ultrasonic_distance";
extern "C" void app_main(void)
{
/* Configure the Ultrasonic module
assuming a development board
using triggerPin 20 and echoPin 21 */
Hcsr04Sensor sensor(
std::string("Water Level"), // Tag for ESP_LOG
(gpio_num_t) 20, // triggerPin
(gpio_num_t) 21, // echoPin
100.0); // maxDistance
/* measure the distance every second for 10 seconds */
for(int i=0; i<10; i++) {
float distance = sensor.GetDistance();
ESP_LOGI(tag, "The distance is %5.1f cm.", distance);
vTaskDelay(1000 / portTICK_PERIOD_MS); // 1 second
}
}

Die ESP-IDF-Komponente ist in der ESP Component Registry veröffentlicht:
https://components.espressif.com/components/elrebo-de/hcsr04_sensor/versions/1.0.4/readme
Außer der Komponente für den Ultraschallsensor sind dort noch zwei Komponenten
- für die Steuerung der OnBoard LED und
- für die Bedienung eines Buttons über eine Callback-Funktion
verfügbar.


Schreibe einen Kommentar