cambiare i dati tra le EEPROM

Ciao a tutti, sto creando un piccolo sketch per capire quanto acqua rimane in un recipiente, in pratica vorrei usare un misuratore di distanza laser, trovato su Amazon compatibile con Arduino ed un sensore di rilevamento liquidi non a contatto,

Ho scritto lo sketch, ma vorrei inserire due valori e non so come fare, in pratica vorrei usare la EEPROM, per memorizzare il valore di lettura attuale ed il precedente.
Per il valore attuale penso di aver risolto, ma non so come fare per il valore della lettura precedente, in pratica vorrei che ad ogni lettura mi dicesse valore attuale X, valore precedente Y, ovviamente Y alla lettura successiva deve cambiare con X, non so se mi avete capito

vi allego lo sketch, non fate caso alla formula del livello la uso per comodità su tinkercad non mi fa calcoli complicati.

#include <LiquidCrystal.h>
#include <EEPROM.h>
#define ledR 8
#define ledB 13
#define ledV 11

const int triggerPort = 6;
const int echoPort = 7;
int pinH2O    = 12;
int stateH2O  = LOW; 
int livello = 0;

LiquidCrystal lcd(10, 9, 5, 4, 3, 2);

void setup() {
  pinMode(triggerPort, OUTPUT);
  pinMode(echoPort, INPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledB, OUTPUT);
  pinMode(ledV, OUTPUT);
  lcd.begin(16, 2);
  pinMode(pinH2O, INPUT);
  EEPROM.read(1);
  EEPROM.read(2);
}

void loop() {
  //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, LOW );
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  
  //calcolo distanza
  long durata = pulseIn( echoPort, HIGH );
  long distanza = 0.034 * durata / 2;
  
  //parte grafica
  lcd.print("D ");
  lcd.print(distanza);
  lcd.setCursor(0, 4);
  lcd.print(livello);
  lcd.setCursor(1, 0);
  
  
  // sezione sensore Acqua 
  int valH2O = digitalRead(pinH2O);
  
  if(valH2O == HIGH){
    EEPROM.write(1, livello);
    digitalWrite(ledV, HIGH);
    digitalWrite(ledR, LOW);
    livello = distanza+10;
  }
  else{
    digitalWrite(ledV, LOW);
    digitalWrite(ledR, HIGH);
  }
  
  //Aspetta 1000 microsecondi
  delay(2000);
  lcd.clear();
}

Prima un piccolo disclaimer, occhio a usare la EEPROM così nel loop che potrebbe essere scritta un sacco di volte inutilmente e portarti alla fine prematura delle celle usate.
Inoltre invece di usare la write usa i metodi put e get, in particolare la put prima verifica se il dato è rimasto identico non lo riscrive così allunghi la vita utile della cella.
AVenendo al tuo quesito, si sono un po' di problemi nel programma, il primo è che calcoli il livello dopo averlo scritto.
Altro problema è che nel setup fai due read della EEPROM a vuoto, ovvero non metti il valore letto da nessuna parte, meglio se dai un occhiata agli esempi nell'IDE per capire le basi di come usare la EEPROM.
Infine usi due celle contigue, ma il valore che scrivi è un int che occupa due byte quindi devi usare, ad esempio 0 e 2, 1 e 3, ecc. in modo che un valore non sovrascriva l'altro
Infine sanati questi problemi quando rileverai il nuovo valore, prima di cambiarlo lo andrai a scrivere nella cella del vecchio valore, leggendolo prima Es.

EEPROM.put(2, EEPROM.get(0))
EEPROM.put(0, nuovo valore)

A quel punto se invece di scrivere direttamente nella EEPROM memorizzi il vecchio valore in una variabile avrai tutto per visualizzare quanto ti serve

Intanto grazie per la risposta, cercando di capire come risolvere il mio problema, ho trovato il discorso che mi dicevi tu sulla vita della EEPROM, mi ero scordato questo particolare, o meglio sto facendo confusione tra le memorie di Arduino.
Pensavo che i cicli di scrittura e lettura fossero per la parte di memoria dove memorizzo lo sketch, facevo confusione, potresti chiarirmi questa parte?

Parlando in termini semplici, la parte di memoria dove scarico lo sketch quanto cicli ha?
Vengono calcolati solo i caricamenti di sketch oppure ad ogni accensione della scheda conta un ciclo di vita?
Nel senso se salvo lo sketch sopra conta 1 ciclo di vita, se poi non carico più nulla posso fare anche 1 milione di accensione e spegnimento e conta sempre 1 ciclo?
Poi che altre memorie devo tenere in considerazione per la vita di arduino?

Cmq seguendo il tuo consiglio mi sa che uso una scheda microSD per salvare i valori di lettura dell'acqua, che dici?

ovviamente dovrò modificare lo sketch :slight_smile:

Ancora grazie per le spiegazioni.

La memoria flash (quella dove va a finire il programma) è garantita per 10'000 scritture, la memoria EEPROM per 100'000 scritture.

Questi sono valori "garantiti", poi, spesso, si superano abbondantemente, ma ... è cosa da fare solo per cose amatoriali, su impianti professionali nessuno si sognerebbe di superare i valori garantiti dal produttore. :wink:

Guglielmo

Secondo me non ti serve spostarti sulla SD per tanti motivi, tra cui penso che in fase operativa non controllerai continuativamente il livello dell'acqua e/o questo non varierà ogni volta. Poi se usi i metodi suggeriti e i valori non cambiano la EEPROM non viene scritta quindi non perdi "scritture utili".
Aggiungo anche che avendo tu il valore letto e il precedente in due variabili puoi verificase se effettivamente c'è necessità di scrivere nella EEPROM o meno.
Se poi proprio vogliamo mettere al sicuro la EEPROM affinché i nipoti dei tuo nipoti possano continuare ad usare l'apparato, se cerchi sul forum è stata trattata molte volte la casistica di rilevare se va via l'alimentazione, in tal caso con l'uso di un super condensatore tieni alimentato arduino per salvare i dati in EEPROM solo in quel momento per rileggerli quando riparte, per il resto di vita operativa i valori sono in memoria, la EEPROM verrà scritta in rari casi o comunque poche volte. Prima di affrontare questa Parte impara ad usare bene la EEPROM e fare quel che vuoi, ovvero struttura il programma in modo che sia funzionante e poi lo modifichi.
Se ancora non bastasse tu scrivi due interi (quindi 4 byte = 4 celle) usando le indicazioni di Atmel per usare la EEPROM con le dovute accortezze per sfruttare tutta la sua capacità salvando i dati via via in celle sempre differenti la durata sale così tanto che non penso tu debba preoccupartene. Non lo allego perché penso che le tue conoscenze attuali ti porterebbero ad avere confusione maggiore cercando di applicare la metodologia. Quando il tutto sarà funzionante e vorrai ottimizzare allora sarà il momento di analizzare tale pratica, secondo me.

Sempre grazie per le risposte, si effettivamente la durata non è poca

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