Forum: Mikrocontroller und Digitale Elektronik ESP32-WROOM-32 Flash-Größe


von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Da ich noch nicht besonders fit mit dem ESP32 und Arduino bin, mal die 
erste Frage von möglicherweise noch vielen...

Ich beschäftige mich gerade mit einem NodeMCU-32S, welches ein 
ESP32-WROOM-32 Modul besitzt. Dieses hat einen 4Mbyte Flash. Allerdings 
ist darin wohl nicht nur ein "Image" gespeichert, sondern drei - wodurch 
die für ein Programm maximal nutzbare Größe auf 1,3MByte reduziert ist. 
Wenn ich in der Arduino-Umgebung ein einfaches Demo-Programm für einen 
Webserver compiliere, gehen dafür bereits etwa 70% des verfügbaren 
Speichers drauf.

Was macht man, wenn man mehr benötigt? Gibt es eine Möglichkeit, auf dem 
vorhandenen ESP32-Modul mehr Speicher nutzbar zu machen oder braucht man 
eines mit größerem Flash? Welches würde man dann am besten nehmen?

Was mich in diesem Zusammenhang auch interessiert: Wie schnell wächst 
bei der Programmierung mit der Arduino-Umgebung die Größe des Codes? 
Oder anders, wie komplex kann eine Anwendung bei 1,3MByte maximaler 
Code-Größe sein, wie schnell kollidiert man mit diesem Limit?

Danke.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ben B. schrieb:
> Allerdings ist darin wohl nicht nur ein "Image" gespeichert, sondern
> drei

Das kann man übrigens in der Konfiguration (Partitionstabelle) vom 
ESP-IDF einstellen. Man kann auch nur 1 oder 2 Images ablegen. Wenn man 
nur 1 Image hat gehen halt keine OTA-Updates, bei 2 gehen OTA-Updates, 
bei 3 gehen OTA-Updates und der User kann auch immer per Knnopfdruck 
auf das "Werks"-Image zurück (ohne manuelles flashen). Von der 
Gesamtkapazität muss man noch etwas abziehen für Bootloader, Header etc.

Ben B. schrieb:
> Oder anders, wie komplex kann eine Anwendung bei 1,3MByte maximaler
> Code-Größe sein,

Da ist dann halt schon eine Menge Framework-Code drin. Der eigene Code 
macht da typischerweise weniger als 100kB aus, die Frage ist eben wie 
viele Bibliotheken man noch einbindet. Wenn man kein Arduino nutzt 
sondern direkt auf dem ESP-IDF aufsetzt spart man einiges, und man kann 
beim ESP-IDF per Konfiguration alles deaktivieren was man nicht braucht. 
Eventuell kompiliert Arduino auch immer ohne Optimierungen, die kann man 
bei einem reinen IDF-Projekt aktivieren und noch was sparen.

Bei einem Webserver hast du natürlich noch den ganzen Web-Content der 
ausgeliefert werden muss, der kann auch schnell groß sein. Du kannst 
dieses Zeug auch auf einem beliebigen Webserver im Internet hosten und 
vom Controller nur eine nahezu leere Seite ausliefern die das Zeug vom 
Webserver einbindet. Dann funktioniert die Seite natürlich nur wenn der 
Client (PC, Smartphone...) zeitgleich Internetzugang hat.

: Bearbeitet durch User
von Obelix X. (obelix)


Lesenswert?


von Dieter S. (hotsystems)


Lesenswert?

Nimm einen ESP32-S3 N16R8 und lege die Website in das LittleFS.
Z.B hier: https://de.aliexpress.com/item/1005006418608267.html

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Der eigene Code macht da typischerweise weniger als 100kB aus,
> die Frage ist eben wie viele Bibliotheken man noch einbindet.
Okay, das liest sich nicht schlecht, dann bin ich noch nicht an der 
Grenze.

> Wenn man kein Arduino nutzt sondern direkt auf dem ESP-IDF aufsetzt
Würdest Du einem Arduino- genauso wie ESP-IDF-Anfänger eher raten, auf 
ESP-IDF zu gehen und das zu lernen anstelle Arduino?

Ich hatte mich jetzt für Arduino entschieden, da es dort viele 
Bibliotheken für die beiden Schaltkreise gibt, die ich einsetzen wollte 
(I2C ADC und DAC).

Vielleicht gleich ganz kurz zum Hintergrund, bevor wieder jemand sagt, 
ich würde den nicht preisgeben wollen oder Salami-Taktik betreiben.
Mir geht es um meinen PV-Akkulader, den ich gerne WiFi-fähig hätte. 
Daher ESP32, das bastle ich mir nicht selbst mit einem AVR oder so. Die 
beiden Bibliotheken (Adafruit_ADS1X15 und Adafruit_MCP4725) habe ich 
bereits eingebunden, aber noch nicht benutzt (keine Ahnung, ob sie dann 
in voller Länge in den Code eingebunden werden wenn man sie nicht 
benutzt, oder ob der Compiler das weg-optimiert). Der dadurch 
entstehende Beispiel-Webserver mit Bibliotheken benötigt 70% der 
1,3Mbyte, also bleiben mir noch ca. 380kByte für den Rest des Programms. 
Das soll aus ein "paar Webseiten" und der Steuerung des PV-Laders 
bestehen, also das MPP-Tracking und wenige Steuerfunktionen übernehmen. 
Sowas wie Lüfterregelung (wenn ichs hinkriege) oder einfaches 
Ein/Aus-Schalten der Spannungswandler, die nachts nicht laufen müssen. 
Die Webseiten müssen nicht besonders hübsch aussehen oder bunt animiert 
sein, sie müssen nur zweckdienlich und funktionell sein. Mit CSS lässt 
sich recht viel machen und das ist alles nur Text, den man dafür 
übertragen muss.

Ich schätze das Projekt nicht sonderlich komplex ein, aber wenn man noch 
nie mit der Arduino-IDE (oder einer anderen 
Entwicklungsumgebung/Sprache) gearbeitet hat, dann könnte es trotzdem 
unerwartet schwer werden, das hinzukriegen.

> Du kannst dieses Zeug auch auf einem beliebigen Webserver im
> Internet hosten und vom Controller nur eine nahezu leere Seite
> ausliefern die das Zeug vom Webserver einbindet.
Korrekt, sollte aber nicht erforderlich sein.

Ich mache mir eher Sorgen darüber, ob sich die Bibliotheken miteinander 
vertragen, also sich nicht um den I2C-Bus prügeln wenn man sie in 
schneller Folge benutzt usw.

Zwei Fragen hätte ich noch...
Gibt es einen Unterschied zwischen #include "xxx" und #include <xxx>?
Und kann man auf dem ESP-Modul etwas Speicher für eigene Variablen 
bekommen, die man gerne dauerhaft speichern möchte (z.B. 
WLAN-Zugangsdaten oder Kalibrationswerte) oder baut man sich dafür 
besser gleich noch einen I2C-EEPROM mit drauf?

Danke euch!

von Obelix X. (obelix)


Lesenswert?

Ben B. schrieb:
> nd kann man auf dem ESP-Modul etwas Speicher für eigene Variablen
> bekommen, die man gerne dauerhaft speichern möchte (z.B.
> WLAN-Zugangsdaten oder Kalibrationswerte)

https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/storage/nvs_flash.html

Ben B. schrieb:
> Würdest Du einem Arduino- genauso wie ESP-IDF-Anfänger eher raten, auf
> ESP-IDF zu gehen und das zu lernen anstelle Arduino?
>
> Ich hatte mich jetzt für Arduino entschieden, da es dort viele
> Bibliotheken für die beiden Schaltkreise gibt, die ich einsetzen wollte
> (I2C ADC und DAC).

Schau dir mal VS Code + PlatformIO an.

: Bearbeitet durch User
von Alexander (alecxs)


Lesenswert?

Ben B. schrieb:
> Gibt es einen Unterschied zwischen #include "xxx" und #include <xxx>?

Es sollte, Arduino hält sich nur nicht dran. Ersteres bezieht sich auf 
Includes im Sketch Ordner, das andere durchsucht alle Include Ordner aus 
den Arduino Libs.

Ben B. schrieb:
> Und kann man auf dem ESP-Modul etwas Speicher für eigene Variablen
> bekommen, die man gerne dauerhaft speichern möchte (z.B.
> WLAN-Zugangsdaten oder Kalibrationswerte) oder baut man sich dafür
> besser gleich noch einen I2C-EEPROM mit drauf?

LittleFS wurde schon genannt, da hat man eine Möglichkeit Dateien 
hochzuladen. Für eine Variable geht auch RTC_DATA_ATTR, wenn's mehr sein 
soll ginge auch die EEPROM Library. Randomnerdtutorials hat alles 
anfängerfreundlich erklärt.

Ben B. schrieb:
> Allerdings ist darin wohl nicht nur ein "Image" gespeichert, sondern
> drei - wodurch die für ein Programm maximal nutzbare Größe auf 1,3MByte
> reduziert ist.

Wenn Du in Arduino ein anderes Partition Scheme auswählst hast Du mehr 
Speicher, z.B. huge_app

: Bearbeitet durch User
von Dieter S. (hotsystems)


Lesenswert?

Ben B. schrieb:
> Die Webseiten müssen nicht besonders hübsch aussehen oder bunt animiert
> sein, sie müssen nur zweckdienlich und funktionell sein

Für den Fall kann ich dir die Seite von fips empfehlen.
https://fipsok.de/
Da findest du auch die Möglichkeit, die Site ins FS zu packen.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ben B. schrieb:
> Würdest Du einem Arduino- genauso wie ESP-IDF-Anfänger eher raten, auf
> ESP-IDF zu gehen und das zu lernen anstelle Arduino?

Wenn du grknds einigermaßen programmieren kannst würde ich ESP-IDF 
empfehlen. Damit hast du einfach alle Flexibilität.

Ben B. schrieb:
> Ich hatte mich jetzt für Arduino entschieden, da es dort viele
> Bibliotheken für die beiden Schaltkreise gibt, die ich einsetzen wollte
> (I2C ADC und DAC).

Das IDF enthält ziemlich gute Treiber für die ganze interne Peripherie 
des ESP32, damit ist Ansteuerung des I2C, ADC usw kein Problem. IMO ist 
das IDF sogar das am Besten strukturierte und mächtigste unter den 
gängigen Embedded Frameworks. Allerdings sind natürlich keine Treiber 
für externe ICs drin. Da kannst du schauen ob du die extern einbinden 
kannst, oder ggf. einfach selber schreiben, die meisten ADCs o.ä. sind 
da nicht besonders anspruchsvoll.

Ben B. schrieb:
> Zwei Fragen hätte ich noch...
> Gibt es einen Unterschied zwischen #include "xxx" und #include <xxx>

Das ist nicht ESP32 spezifisch sondern Standard C. Spitze Klammern sind 
für Header von Bibliotheken, welche in speziellen dem Compiler 
mitgeteilten Pfaden befinden; Anführungszeichen werden bei Headern des 
selben Projekts genutzt.

von Dieter S. (hotsystems)


Lesenswert?

Ben B. schrieb:
> Und kann man auf dem ESP-Modul etwas Speicher für eigene Variablen
> bekommen, die man gerne dauerhaft speichern möchte

Dafür gibt es Preferences im LittleFS.

von Vincent H. (vinci)


Lesenswert?

Steckt in deiner Anwendung irgendeine Echtzeitanforderung 
(~Microsekundenbereich) die gleichzeitig mit dem Web Teil funktionieren 
muss? Weil wenn ja, dann ist weder Arduino noch ein Dateisystem eine 
Option.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Viel zu lesen das ist. Danke euch!

Die Internetseiten werden wirklich nur einfach und auch nicht viele. 
Eine Hauptseite (HTML), einmal CSS, einmal JavaScript und dann noch eine 
oder zwei reine Messwert-Ausgaben (wenn ich mir die Mühe mache JSON, 
ansonsten ohne spezielles Format). Im Wesentlichen spare ich mir damit 
das Display und kann mir mit einem Webserver ein Monitoring bauen.

Als "Bonus für später" hebe ich mir eine Eingabemaske für die WLAN-Daten 
und evtl. eine kleine Benutzerverwaltung bzw. Geräte-Passwort auf.

Die Bibliotheken (für die I2C-Devices) selbst schreiben würde ich evtl. 
machen, wenn ich den ESP32 bzw. dessen Hardware besser kennen würde. Da 
sind aber ein paar Fragen, auf die ich erst noch Antworten finden muss 
bzw. keine Erfahrung habe. Ich weiß z.B. nicht, ob ich das Timing selbst 
erledigen muss wenn mehrere zusammenhängende Bytes über den I2C 
geschickt werden müssen (Messergebnisse) oder ob die Hardware des ESP32 
das selber kann (irgendwelche Puffer).

Da weiß ich auch noch nicht, ob sich die beiden Adafruit-Bibliotheken 
miteinander vertragen, etwa wenn man dem DAC eine Sollwertvorgabe 
schickt und unmittelbar danach einen Messwert vom ADC lesen möchte oder 
anders herum. Also werden dann beide Bus-Aufgaben sauber nacheinander 
ausgeführt oder mischen die sich gegenseitig einmal kräftig durch, so 
daß man das Abarbeiten der ersten Aufgabe selbst überwachen und abwarten 
muss. Und wenn man warten muss (was für das Steuerprogramm nicht 
tragisch wäre), laufen dann andere Aufgaben wie evtl. eine Uhr und WiFi 
sauber weiter oder blockiert sich das... das weiß ich alles noch nicht.

Mit C habe ich leider noch nicht viel gemacht, das ist mein großer Makel 
bei Programmiersprachen. Mit PHP bin ich sehr fit, ich mag die 
Flexibilität... aber das bezeichnen viele als großen Makel von PHP. PHP 
soll ähnlich sein wie C - aber so richtig ähnlich empfinde ich es nicht.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Steckt in deiner Anwendung irgendeine Echtzeitanforderung
> (~Microsekundenbereich) die gleichzeitig mit dem Web Teil
> funktionieren muss?
Nein. Deswegen überlasse ich die Erzeugung von PWM usw. externen 
Schaltkreisen und gebe denen nur mit dem DAC einen Sollwert vor.

Was ich vielleicht brauche, ist eine 25kHz PWM für die Ansteuerung eines 
drehzahlgeregelten Lüfters, die der ESP32 selbst machen müsste. Aber 
wenn die durch WiFi-Aufgaben kurze Glitches bekommt, ist das 
wahrscheinlich egal. Da bin ich noch nicht, weil für eine 
Temperaturregelung bräuchte ich auch einen ADC-Kanal des ESP32 (auf dem 
ADS1115 ist keiner mehr frei). Oder alternativ einen I2C 
Temperatursensor am Kühlkörper.

von Alexander (alecxs)


Lesenswert?

Auf die Wahl der richtigen GPIOs achten 34 35, ADC2 verträgt sich nicht 
mit WiFi.

von Dieter S. (hotsystems)


Lesenswert?

Ben B. schrieb:
> Da weiß ich auch noch nicht, ob sich die beiden Adafruit-Bibliotheken
> miteinander vertragen,

Warum sollten die das nicht machen ?
Immerhin bist du als Programmierer für deinen Code verantwortlich.
Also musst du darauf achten, dass alles sauber abläuft.
Ich vermute mal, du siehst da Probleme, wo keine sind.
Und wenn du nur Temperatur messen möchtest, tut es auch ein "OneWire" 
DS18B20.

von Alexander (alecxs)


Lesenswert?

Alexander schrieb:
> Auf die Wahl der richtigen GPIOs achten 34 35, ADC2 verträgt sich nicht
> mit WiFi.

aber das weißt Du ja bereits

Beitrag "Re: ESP32: Wie das beste aus dem ADC herausholen?"

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Ja, mit dem ADC des ESP32 habe ich mich schon mal auseinandergesetzt... 
für so'n Freischuss wie 'ne Temperaturmessung reichts, für alles andere 
eher nicht.

> Ich vermute mal, du siehst da Probleme, wo keine sind.
Ehrlich gesagt hoffe ich das. Das ist besser als anders herum, wenn da 
vielleicht ein schwerwiegendes Problem wartet und ich es nicht sehe. Mir 
fehlt halt noch jede Erfahrung mit dem ESP32 und Arduino. Über die 
Hello-Worlds bin ich drüber, nun gehts ans Eingemachte...

von Dieter S. (hotsystems)


Lesenswert?

Dann noch mal den Tipp zum ESP32-S3 WROOM N16R8, der ist sehr 
leistungsstark und läuft bei mir im Dauertestbetrieb mit 433MHz Funk, 
Webseite, UDP, TCP, TFT-Display und Sensor BME280 problemlos.
Und auch in der Arduino IDE programmiert.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.