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.
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
Nimm einen ESP32-S3 N16R8 und lege die Website in das LittleFS. Z.B hier: https://de.aliexpress.com/item/1005006418608267.html
> 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!
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
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
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.
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.
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.
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.
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.
> 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.
Auf die Wahl der richtigen GPIOs achten 34 35, ADC2 verträgt sich nicht mit WiFi.
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.
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?"
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.