Der ESP32 lässt sich in der Programmiersprache C++ ähnlich wie ein Arduino programmieren. Die Sprache kann zwar etwas schwieriger als Python sein, ist dafür aber deutlich schneller in der Ausführung. Und sie wird kompiliert, wodurch sich vor der Ausführung die meisten Fehler vermeiden lassen.
In diesem Beispielprojekt verwenden wir zur Programmierung das Werkzeug Platformio.
Dieses ermöglicht die Beschreibung des Mikrocontrollerprojektes durch die Datei platformio.ini. Hier werden festgelegt, welcher Mikrocontroller programmiert werden soll, welches Entwicklungsboard man hat, wie geflasht wird und welche Bibliotheken man verwendet.
Z.B.:
[env:azesp32]platform = espressif32 ;ESP32 Mikrocontrollerboard = az-delivery-devkit-v4 ;az-delivery-Board mit den entsprechenden Pins und Bezeichnungenframework = arduino ;Arduino-Framework verwenden (setup(), loop(), digitalWrite(), ...)monitor_speed = 115200 ;Baudrate für serielle Konsolelib_deps = adafruit/Adafruit NeoPixel@^1.10.4 ;Verwendung der Adafruit NeoPixel BibliothekDas Projekt lässt sich nun durch den Aufruf
pio run -e azesp32 -t upload -t monitorkompilieren, aus den Mikrocontroller flashen und danach per seriellem Monitor die Ausgaben ansehen.
Dieses Programm gibt jede Sekunde die Anzahl Sekunden seit dem Start auf der seriellen Konsole aus. Flashen mit
pio run -e hello_world -t upload -t monitor
Code:
#include<Arduino.h>voidsetup() {
Serial.begin(115200);
}
voidloop() {
Serial.print("Hello world ");
Serial.println(millis()/1000.);
delay(1000);
}Flashen mit
pio run -e led_an -t upload
Code:
#include<Adafruit_NeoPixel.h>
Adafruit_NeoPixel np{10, 4};
voidsetup()
{
np.begin();
np.setPixelColor(1, 20, 30, 0);
np.show();
}
voidloop()
{
}Flashen mit
pio run -e led_lauflicht -t upload
Code:
#include<Adafruit_NeoPixel.h>
Adafruit_NeoPixel np{10, 4};
int iLed = 0;
voidsetup()
{
np.begin();
}
voidloop()
{
for (int iLed = 0; iLed < np.numPixels(); ++iLed)
{
np.clear();
np.setPixelColor(iLed, 20, 30, 0);
np.show();
delay(50);
}
}Dieses Programm verbindet sich mit dem WLAN und lässt den LED-Streifen per HTTP-API steuern. Beispielaufruf Abruf des LED Zustands:
> curl http://IP-Adresse/leds
[{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0},{"r":0,"g":0,"b":0}]Beispielaufruf Anschalten der ersten beiden LEDs:
> curl -X POST http://IP-Adresse/leds -H 'Content-Type: application/json' -d '[{"r":0,"g":50,"b":10},{"r":30,"g":30,"b":10}]'Flashen mit
pio run -e led_api -t upload -t monitor
Code:
#include<Adafruit_NeoPixel.h>
#include<Arduino.h>
#include<ArduinoJson.h>
#include<AsyncJson.h>
#include<AsyncTCP.h>
#include<ESPAsyncWebServer.h>
#include<WiFi.h>
AsyncWebServer server{80};
Adafruit_NeoPixel np{10, 4};
constchar *ssid = "MY_SSID";
constchar *password = "MY_PASSWORD";
voidsetup()
{
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
{
Serial.printf("WiFi Failed!\n");
return;
}
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// Send a GET request to <IP>/get?message=<message>
server.on("/leds", HTTP_GET, [](AsyncWebServerRequest *request) {
AsyncJsonResponse *response = newAsyncJsonResponse(true);
response->addHeader("Server", "ESP Async Web Server");
auto root = response->getRoot().as<JsonArray>();
for (int iLed = 0; iLed < np.numPixels(); ++iLed)
{
auto color = np.getPixelColor(iLed);
root[iLed]["r"] = (color >> 16) & 0xFF;
root[iLed]["g"] = (color >> 8) & 0xFF;
root[iLed]["b"] = (color >> 0) & 0xFF;
}
response->setLength();
request->send(response);
});
auto postLedsHandler =
newAsyncCallbackJsonWebHandler("/leds", [](AsyncWebServerRequest *request, JsonVariant &json) {
auto root = json.as<JsonArray>();
for (int iLed = 0; iLed < np.numPixels(); ++iLed)
{
if (iLed < root.size())
{
auto led = root[iLed];
np.setPixelColor(iLed, led["r"], led["g"], led["b"]);
}
}
np.show();
request->send(200);
});
postLedsHandler->setMethod(HTTP_POST);
server.addHandler(postLedsHandler);
server.begin();
np.begin();
}
voidloop()
{
}Flashen mit
pio run -e hackertyper -t upload -t monitor
Download von rick.mp3 nach data/rick.mp3
Flashen mit
pio run -e rick-pairy -t uploadfs
pio run -e rick-pairy -t upload -t monitor