Salvare float su EEPROM - ESP8266

Salve, ho un problema con la memorizzazione di variabili float della misurazione di temperatura di un DHT22 su EEPROM con ESP8266.
So bene che la ESP8266 non ha una vera e proprio EEPROM, ma essa viene simulata in una parte della memoria FLASH, ha un numero limitato di cicli di scrittura, e che la EEPROM dell'ESP8266 ha una dimensione di 4kB.

Fatta questa premessa, cerco di essere più preciso.
Ciò che intendo fare è tenere memorizzati i dati di temperatura MIN e MAX nell'EEPROM, anche in caso di spegnimento del circuito.

Ho pensato di fare così, come riportato nello sketch sotto, ma il risultato non è quello atteso: infatti al momento del riavvio del NodeMCU, la temperatura massima assume i valori di quella attuale, e non "riprende" il valore massimo che doveva essere salvato nella posizione assegnata e la temp MIN assume un valore di 12.10 gradi a prescindere da quella che era stato rilevato e inserito nella variabile MIN.

Questo è lo sketch, grazie in anticipo.
PS. nello sketch troverete una variabile char comand; attraverso la quale riporto i valori di MIN e MAX a quelli attuali di dht.readTemperature(); ossia una sorta di reset dei dati.

#include <EEPROM.h>
#include "DHT.h"

#define DHTPIN D5
#define DHTTYPE DHT22 

DHT dht(DHTPIN, DHTTYPE);

float MAX, MIN;

uint32_t tempo;


void setup() {
  Serial.begin(9600);
  EEPROM.begin(12);
  dht.begin();
  delay(1000); //per dare il tempo al DHT di inizializzare altrimenti mi da "nan" al primissimo valore
  
MAX= EEPROM.get(1, MAX);
MIN= EEPROM.get(2, MIN);

}

void loop() {

 if (dht.readTemperature() < MIN){
  MIN = dht.readTemperature();
  EEPROM.put(2, dht.readTemperature());
  EEPROM.commit();
 }

 if (dht.readTemperature() > MAX){
  MAX = dht.readTemperature();
  EEPROM.put(1, dht.readTemperature());
  EEPROM.commit();
 }

 char comand;
 if(Serial.available()){
  comand = Serial.read();
 }

 if(comand == ('a')){
  MIN = dht.readTemperature();
  MAX = dht.readTemperature();
  
  EEPROM.put(1, dht.readTemperature());
  EEPROM.commit();
  EEPROM.put(2, dht.readTemperature());
  EEPROM.commit();
  
 }

 if(millis()- tempo > 1000){
  Serial.print(F("Temp:  "));
  Serial.print(dht.readTemperature());
  Serial.print(F("°C "));
  Serial.print(F("MIN: "));
  Serial.print(MIN);
  Serial.print(F("°C "));
  Serial.print(F("MAX: "));
  Serial.print(MAX);
  Serial.println(F("°C "));
  tempo=millis();
 }

EEPROM.end();

}

Mmm ... non so su ESP8266, ma un float, normalmente, occupa 4 bytes ... tu fai le put() agli indirizzi 1 e 2 ... se è come su Arduino così non funziona!

Guglielmo

Perfetto Guglielmo, ho salvato agli indirizzi 0 e 4 e pare che così vada bene!
Grazie mille!

Ma per due decimali a che servono le float?... Usa variabili int16_t (int), moltiplicando le temperature per 100, e ti bastano 2 byte!
12,1° -> 1210
25,35°-> 2535
-8,25°-> -825
-3,1° -> -310

Grazie per l'intervento.
Si ok, se moltiplicassi un intero a 16bit per 100,facendo finta che io adesso abbia 15.2 gradi mi darebbe 1520 giusto?
I dati vengono visualizzati su un LCD, quindi come Si farebbe a mettergli una virgola?

Ps. Considera che comunque il micro deve leggere soltanto 4 valori di un sensore di temperatura e deve riportarli sul LCD.
Capisco l'ottimizzazione, ma se deve fare solo quello, un float non penso darebbe problemi, tanto di memoria ne abbiamo.

lcd.print (valore/100.0, 2);

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