wert in über MQTT in EEPROM speichern

Hallo zusammen

ich bin ziemlicher Neuling im Arduino Thema. Ich habe mir ein Controllino besorgt und will damit eine Poolsteuerung realisieren. Dies klappt auch schon ziemlich gut. Er soll den Wasserpegel überwachen und die Solarsteuerung regeln, Später mal PH messen. Dies klappt auch schon ziemlich gut. Die Messwerte und Schaltzustände gebe ich über node red wieder. Jetzt hatte ich die Idee in Node Red ein Wunschtemperatur einzugeben(für den Komfort) und dieser soll am besten im EEPROM gespeichert werden, damit nach einem Stromausfall der Wert nicht verloren geht.(Da dieser nur sehr selten geändert wird werde ich kein Problem mit den Zyklen haben).

Nun zu meinem Problem ich bekomme die werte aber nicht in die EEPROM. Anbei sende ich euch mal mein Code. Die Ventile schalten alle super. nur ich komme nicht drauf wie ich die Werte zwischen 23-35 die ich mit MQTT übertrage weiter verarbeite. Klar könnt ich für jeden wert (wie unten z.B (26) dann wird der Code über sehr lang. Könnt ihr mir hier ein Tipp geben.

Desweiteren haben ich ein Problem das die 26 nicht als 26 geschrieben wird sondern 199, das hat glaube ich mit dem char zu tun oder muß ich hier erst char in byte umwandeln?

Vielen Dank für eure Hilfe und beachtet bitte das ich ein Neuling bin. :grin:

 void callback(char* topic, byte* payload, unsigned int length) {
    Serial.print("Nachricht empfangen [");
    Serial.print(topic);
    Serial.print("] ");
    char msg[length+1];
    for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
        msg[i] = (char)payload[i];
    }
    Serial.println();
 
    msg[length] = '\0';
    Serial.println(msg);
 
    if(strcmp(msg,"Solarventile an")==0){
        digitalWrite(SOLARVENTILE, HIGH);
    }
    else if(strcmp(msg,"Solarventile aus")==0){
        digitalWrite(SOLARVENTILE, LOW);
    }
    if(strcmp(msg,"Automatik an")==0){
        digitalWrite(3, HIGH);
    }
    else if(strcmp(msg,"Automatik aus")==0){
        digitalWrite(3, LOW);
    }
    if(strcmp(msg,"26")==0){
        EEPROM.update(0, msg);
        
    }   
}

Hallo
probier mal

 EEPROM.update(0,msg.toint());

Hi,

nutze am besten SPIFFS dafür :
(So mache ich es / bin aber selber Anfänger)

Spiffs starten

Serial.println(F("Starten von dem Filesystem..."));
    if (SPIFFS.begin()){
        Serial.println(F("SPIFFS wurde erfolgreich gemountet."));
        Serial.println();
    }else{
        Serial.println(F("Fehler beim Mounten von SPIFFS !"));
    }

Daten Schreiben (Messwerte ist eine Globale String Variable (geht aber auch anderes)

File file_Messwerte = SPIFFS.open("/Messwerte", "r");
        String TempMesswerte;
        while(file_Messwerte.available()){
            TempMesswerte += char(file_Messwerte.read());
        }
        file_Messwerte.close();
        if ( String(TempMesswerte) != Messwerte){
            File file_Messwerte = SPIFFS.open("/Messwerte", "w");
            file_Messwerte.print(Messwerte);
            file_Messwerte.close();
        }

und zum auslesen

File file_Messwerte = SPIFFS.open("/Messwerte", "r");
    String Messwerte;
    while(file_Messwerte.available()){
        TempMesswerte += char(file_Messwerte.read());
    }
    file_Messwerte.close();
    if (TempMesswerte != ""){
        Messwerte = TempMesswerte;
    }

Ich hoffe ich konnte helfen .....
So Speichere ich alles Ab was sich nicht ändert ....

MfG

Hallo ihr beiden

danke für die ersten Tipps.
@paulpaulson: Leider bekomme ich folgenden fehler. "request for member 'toInt' in 'msg', which is of non-class type 'char [(((ssizetype)length) + 1)]'

"
@sefina danke für den Code. Da muß ich mich erstmal reindenken. kann auf den ersten blick nicht erkennen wo ich die subscribe einbringe.

Vielen Dank

shorty111:
@sefina danke für den Code. Da muß ich mich erstmal reindenken. kann auf den ersten blick nicht erkennen wo ich die subscribe einbringe.

Das Problem wird sein, der Controllino hat kein Spiffs.
Bleibt nur das EEprom.

der EEPROM ist ja auch nicht das Poblem, sondern der der davor sitzt :).

Wie gesagt ich kan ja diesen beschreiben, aber mit einem falschen wert und dann ist noch die Frage ob ich hier eine Range angeben.

if(strcmp(msg,"26")==0){[color=#222222][/color]
        EEPROM.update(0, msg)

Vielen Dank

shorty111:
Hallo ihr beiden

danke für die ersten Tipps.
@paulpaulson: Leider bekomme ich folgenden fehler. "request for member 'toInt' in 'msg', which is of non-class type 'char [(((ssizetype)length) + 1)]'

"
@sefina danke für den Code. Da muß ich mich erstmal reindenken. kann auf den ersten blick nicht erkennen wo ich die subscribe einbringe.

Vielen Dank

Hallo
in welchem Datentyp wird die Variable 'msg' angelegt?
Da liegt das Problem.

Wie gesagt ich kan ja diesen beschreiben, aber mit einem falschen wert

Wieso falsch? :o :o :o
So wie ich das sehe, übergibst du einen Zeiger, also wird auch wohl ein Zeiger gespeichert.
Und da update nur ein Byte schreibt, darum auch nur ein 1/2 Zeiger.

Wobei ich vermute, dass du eher die Daten speichern möchtest, und nicht den Zeiger darauf .....

Leider ist das ein wenig problematisch, da die Länge nicht festgelegt ist.
Somit besteht die Gefahr Daten zu überschreiben.

Kennst du dies hier schon ?
Da sollte put oder get der richtige Weg sein.

char msg[100]; wurde msg angelegt.

@combie ich übergebe von Node Red zum die Zahl 26 und will sie dann im EEProm speichern und dann wieder auslesen und als Sollwert darstellen und die Zahl in einer If Funktion verwerten.
Ich habe mir schon gedacht das mein Fehler in den Variablen liegt, aber komme da leider nicht voran.
Anbei sende ich mal den Teil der LOOP funktion

byte ZIELTEMP = EEPROM.read(0);
client.publish ("Wunschtemperatur",ZIELTEMP);
Serial.println ( ZIELTEMP);
 
if ((SOLARTEMP.getTempCByIndex(0)>POOL.getTempCByIndex(0))&&(SOLARTEMP.getTempCByIndex(0)< (EEPROM.read(0)))) {digitalWrite(SOLARVENTILE ,HIGH);}
else {digitalWrite (SOLARVENTILE, LOW);}

EEPROM.put hatte ich auch schon versucht bekam dann den Fehler "no matching function for call to ‘EEPROMClass::put(int, char [(((ssizetype)length) + 1)])’
"

ich übergebe von Node Red zum die Zahl 26 und will sie dann im EEProm speichern

26 ist eine Zahl.
"26" ist eine Zeichenkette!
Das sieht vielleicht ähnlich aus, ist aber grundsätzlich was anderes.
Da ist eine Entscheidung erforderlich.

char msg[100]; wurde msg angelegt.

Das wäre ja eine fixe Größe, mit der man arbeiten könnte....

Die Wirklichkeit sieht offensichtlich anders aus.

void callback(char* topic, byte* payload, unsigned int length) 

{
// schnipp
    char msg[length+1];

msg hat eine veränderliche Größe.

shorty111:
EEPROM.put hatte ich auch schon versucht bekam dann den Fehler "no matching function for call to ‘EEPROMClass::put(int, char [(((ssizetype)length) + 1)])’

Dann hast du etwas falsch gemacht.
Warum untersuchst du deinen Fehler nicht ?
Nur wenn du versuchst deinen Fehler zu finden, lernst du daraus etwas.

Danke für den ersten Tipp
ich habe es mal geändert und jetzt auch gleich eine if Funktion eingebaut. Das klappt jetzt soweit das der EEPROM beschrieben wird mit den gewünschten Wert. Anbei der neue Code

void callback(char* topic, byte* message, unsigned int length) {
    Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
   
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();
 
  if (String(topic) == "Pool/") {
    Serial.print("Changing output to ");
    if(messageTemp == "Solarventile an"){
      Serial.println("on");
    digitalWrite(SOLARVENTILE, HIGH);
    }
    else if(messageTemp == "Solarventile an"){
      Serial.println("off");
       digitalWrite(SOLARVENTILE, HIGH);
    }
  }
 if (String(topic) == "Pool/Wunschtemperatur") {
    Serial.print("Changing output to ");
    if(messageTemp == "26"){
          EEPROM.update(0, 26);
    }
    else if(messageTemp == "27"){
           EEPROM.update(0, 27);
    
  }
    else if(messageTemp == "28"){
            EEPROM.update(0, 28);

Jetzt habe ich nur noch ein Problem vielleicht könnt ihr mir da auch noch Helfen. In der Loop lasse ich mir gerade noch die Werte an den Com 3 schicken. Da wird mir der geänderte Temperaturwert, zb.26 auch angezeigt. Aber in mqtt wird mir “�” ausgegeben, und Node Red kann das auch nicht verwerten.

byte ZIELTEMP = EEPROM.read(0);
client.publish ("Wunschtemperatur",ZIELTEMP);
Serial.println ( ZIELTEMP);

Vielen Dank

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.