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();
}