Logisches Vorgehen/Struktur im Ablauf

Hallo zusammen und Grüezi miteinand :slight_smile:

Ich bin Udo und seit ein paar Wochen im Sketch-Fieber!
Ich habe wirklich schon tagelang im Netz gelesen und lande immer wieder hier bei euch ;D Super Forum!!!
Genauer kam ich über die Sonoff SV mit ESP8266 zu dem ganzen Thema als ich las, dass die Teile über die Arduino IDE programmiert werden können... und seit dem lerne ich C++, da mein Basic nicht mehr ausreicht :grinning:
Ich komme schon ganz gut mir den Variblentypen, Arrays, Structs, Eeprom get + put usw. klar....
Aber nun fehlt mit ein gescheiter Ansatz:

Ich möchte (mal wieder :wink: ) eine WLAN Solar/Boiler-Steuerung bauen... mit Webif zum Werte ändern und diese sollen dauerhaft im "Eeeprom" (Flash) abgelegt werden. 3 Tempsensoren und ein Stellmotor sind vorhanden.
Ich habe 15 Byte- und Bool-Variablen (sens1, sens2, sens3, pinBoiler, pinSolar, pinRL, Regler, Schutz, Motor, Max, Min, Diff, Hyst, Frost, INI)

Nun meine Fragen:

Wäre es sinnvoll, diese Variablen in einem Struct abzulegen oder alle einzeln zu verwalten ?

Wie ist der sinnvollste Ablauf der allerersten Konfiguration:
Ich möchte beim ersten Start Standard-Werte setzen.

  1. Möglichkeit wäre, dass direkt nach dem Start und nach der WLAN Konfig eine Setupseite aufgerufen wird, ich meine Werte einstelle (Standardwerte sind schon vorausgefüllt im Webif) und das dann absende. Im Eeeprom wird Adresse 0 (INI) von 255 auf 1 gesetzt und so weiß ich, dass ab dann bei Start die Werte aus dem Eeprom gelesen werden.

  2. Möglichkeit wäre, dass ich direkt nach dem Start auf 255 im Eeprom in Adresse 0 prüfe und wenn 255 (noch nie geschrieben) dann alle Adressen (Struct?) mit den Standardwerten beschreibe und diese später im Webif, wenn man etwas ändern möchte, auslese und wieder schreibe, da put ja nur die geänderten Werte überschreibt und es die Lebensdauer verlängert.

Soweit, so unklar... wie würdet ihr diese Erst-Konfig ablaufen lassen?

Ich danke Euch für eure Ideen und Tipps :smiley:

Wäre es sinnvoll, diese Variablen in einem Struct abzulegen oder alle einzeln zu verwalten ?

Struktur(packed)!

Und am Ende kannst du da drin auch eine Prüfsumme unterbringen,

Hallo,

die Werte die du auf Eprom ablegen willst sind in einer Struktur gut aufgehoben. Die kannst Du dann mit Get und Put einfach auslesen oder spiechern.

Bedenke aber das die Anzahl der Schreibvorgänge begrenzt ist. Messwerte gehören da nicht hin. Es sollten also nur Werte sein die nicht ständig geändert werden.

Warum willst Du z.B die Pin-Nummer im Eprom ablegen? Das sollten doch nur Sollwerte,und eventuell Regelparameter sein.

Ich hab das bisher so gemacht das ich im Setup den Eprom auslese. Wenn da nichts zulässigens drin steht stelle ich Werte als Voreinstellung ein.

Heinz

Ein "struct" kannst du auch bequem im Filesystem des Esp8266 speichern.

Beispiel

Gruß Fips

Und mit offsetof() jedes Strukturelement auch einzeln andressieren/lesen/schreiben

mit offsetof() jedes Strukturelement auch einzeln andressieren/lesen/schreiben

Das war jetzt aber eher zur Verwirrung (oder Weiterbildung) gedacht.

Ein Strukturelement wird natürlich über seinen Namen angesprochen. Das ist der Sinn des Namens eines Strukturelements.

Danke für die schnellen Antworten :slight_smile:

@Rentner: Stimmt, mit den Pins muss ich noch gucken. Ich hatte evtl. angedacht, auch alle 3 Sesnoren an einen Pin zu hängen und über das WebIf dann die Indizes zuordbar zu machen (falls mal einer abtaucht, was wohl aber seltenst passiert).

Fragt Du im Setup nur auf 255 ab?

@combie: Danke für die Weiterbildung :slight_smile:

@Derfips: Deine Seite kenne ich natürlich :wink: Ich habe mich auch für EEPROM.h entschieden, weil ich gelesen habe dass FS.h nicht weiterentwickelt wird!?

@michael_x: Danke auch :slight_smile: Ihr seid ja echt super schnell hier!!!

SPIFFS wird nicht weiter entwickelt. Der Nachfolger ist LittleFS.

Gruß Tommy

@Tommy: Danke, das hatte ich noch nicht auf dem Schirm!

Auf den ersten Blick (als Newbie) ist für meine paar Variblen-Bytes die EEprom Version einfacher zu handhaben, finde ich. Oder übersehe ich einen entscheidenden Vorteil von LittleFS für meine Zwecke? grübel

Die Schreibhäufigkeit ist gleich, da beides im Flash landet (EEPROM.h ist nur eine Emulation). Das kommt darauf an, ob Du noch mehr Sachen (evtl. auch später) speichern willst (css/js Dateien z.B.) dann würde sich auf alle Fälle das Filesystem empfehlen.

Gruß Tommy

michael_x:
Das war jetzt aber eher zur Verwirrung (oder Weiterbildung) gedacht.

Ein Strukturelement wird natürlich über seinen Namen angesprochen. Das ist der Sinn des Namens eines Strukturelements.

Naja....

Warum eine große Struktur lesen, wenn man doch nur ein spezielles Byte/Variable da raus picken will.

Spätestens wenn die Strukturen größer, als das dafür verfügbare RAM ist, wirst du sicherlich auch offsetof() verwenden.

Habt ihr dazu noch weitere Einschätzungen, wie man das am saubersten löst?

„ Wie ist der sinnvollste Ablauf der allerersten Konfiguration:
Ich möchte beim ersten Start Standard-Werte setzen.“

Dann musst Du erkennen, ob es der erste Start ist.

Beim FS, ob die Datei da ist oder beim EEPROM ob ein bestimmtes Feld einen bestimmten Wert hat oder nicht.

Gruß Tommy

Edit: Meist setzt man im Code die Defaultwerte und überschreibt sie im Setup mit den gespeicherten Werten, wenn welche da sind. Damit hast Du immer gültige Werte.

In meinen Zeitschaltuhren werden die Schaltzeiten im setup() aus dem Filesystem eingelesen.

Und <FS.h> lässt sich ganz leicht durch <LittleFS.h> ersetzen!

Aber wem erzähle ich das, du kennst meine Seite ja schon.

Gruß Fips

Ich danke euch für den ganzen Input und werde nun in den langen Winternächten versuchen, was Anständiges daraus zu proggen :slight_smile:

2 abschließende Fragen noch bitte, da ich gerade auf PROGMEM und PREFERENCES gestoßen bin:

Wäre eines davon noch besser geeignet um meine Variablen persistent zu speichern (gravierende Vor- oder Nachteile)?

Müsste man bei Nutzung von PREFERENCES für jede Variable eine "Datei" speichern, z.B. wie
preferences.putUInt("Start", counter);

oder kann man da auch in die Datei "Start" weitere Variablen ablegen?

Danke nochmals

PROGMEM ist für Konstanten nicht für Variablen. Und da auch nur für größere Dinge wie Strukturen und Arrays. Das sorgt nur dafür dass die Dinge nicht im RAM landen, sondern im Flash bleiben

Ah OK, bliebe noch PREFERENCES... für jede Variable eine "Datei", der man auch eine Standardwert mitgeben kann, sollte sie noch nicht existieren.

Liest sich auch ganz gut...

Hallo,

Sorry hatte ich übersehen, Wenn Du einen Webserver laufen lassen willst, wirst Du ja sicher die Webseite im FS des ESP speichern. Damit macht es natürlich mehr Sinn auch die Sollwerte, Voreinstellungen in einer Datei abzuspeichern. Das könnte eine Textdatei sein die mit dem Download Tool auf den ESP kommt. Wenn die Datei vorhanden ist stehen auch gültige werte drinn, wenn nicht hardcodierte Voreinstellungen.

Heinz

Ich habe noch 2 Fragen zur strukturierten Programmierung:

Mein struct besteht ja aus verschiedenen Einstellungen (Temperaturen, Schaltzustände, Indizes Tempsensoren)
und nun suche ich sinnvolle Bezeichnungen... wie würdet ihr das benennen?
Ich dachte an diese Bezeichungen:

struct EINSTELLUNGEN/WERTE/KONFIG ?
{
bool PUMPE;
bool VENTIL;
bool SCHUTZ
byte MAX;
byte MIN;
byte DIFF;
byte HYST;
byte FROST;
...
} STANDARD/INI/SETUP? ;

Und gern würde ich meine Variablen im Code immer komplett groß schreiben, weil ich es übersichtlich finde und sofort sehe, dass es um meine Werte geht... spricht da was gegen?

Übliche Konvention für selbst definierte Bezeichner:

Datentypen beginnen mit einem Großbuchstaben
Variablen, Funktionen mit einem Kleinbuchstaben

KamelHöckerSchreibweise
keine_worte_mit_unterstrichen

Literale/defines nur in Großbuchstaben.

spricht da was gegen?

Wenn das kein anderer je lesen und begreifen soll, kannst du machen was du willst.