Progetto Acquario, problema EEPROM

Ciao a tutti,
grazie al Vostro aiuto ho terminato salvo e/o il mio progetto, ho però un piccolo problema che vorrei risolvere con Voi.
Entrando nella sezione dove su lcd impartisco tramite pulsanti i comandi di accensione e spegnimento dei dispositivi collegati, i valori iniziali partono da 255, c'è un modo per incominciare dando alle variabile un valore ben preciso?
Ovvero se devo settare per la prima volta un orario non è bello che parta da 255, io vorrei ad esempio partire da 12.
Spero di essermi spiegato, e per completezza allego file con programma.
Grazie.

Acquario.zip (1.06 MB)

Partono da 255 perché leggi dalla EEPROM e dentro a ciò che leggi vi è quel valore, non è detto però che vi sia sepre 255, dipende da cos'hai scritto in precedenza in quella cella di memoria, sta a te dopo aver letto il dato e sapendo che tipo di dato è (Ora, minuti, grammi, astronavi) verificare prima di visualizzarlo se rientra nel range valido (Es. 0-23 per le ore, 0-59 per i minuti, ecc.) se non lo è assegni un valore predefinito che ti aggrada alla variabile che usi per la visualizzazione su display. Dopo aver salvato un dato valido il problema non si presenta più

Grazie, infatti è così, ho fatto delle variabile per le ore ed minuti, una volta settati il problema non si ripresenta più.
Che poi non è un problema è solo uno sfizio che volevo togliermi.

Allora per la precisione il modi di affrontare il problema non è solo quello che ti ho indicato ma esiste anche un'altra strada ovvero in avvio del programma verifichi una o più celle di memoria che usi come "spia" ovvero controlli che all'interno di questa/queste celle vi sia un valore ben preciso, se è così allora la EEPROM è stata inizializzata, altrimenti fai una procedura che scrive nella EEPROM tutti i valori predefiniti in modo che le successive letture saranno corrette. Oltretutto facendolo nel setup sei sicuro che quando il programma andrà a leggere i dati e sopratutto ad usarli non userà dati sporchi che potrebbero portare a funzionamenti anomali

Grazie mi potresti indicare come fare oppure dove poter leggere a riguardo?

E' banale, già leggi nel setup la EEPROM, aggiungi una/due letture su altrettante celle, se dentro trovi un valore specifico (Chessò 42) vai avanti senza far null'altro, altrimenti fai una serie di scritture in EEPROM (tante quante sono le tue read in EEPROM9 con i rispettivi valori predefiniti validi. Questa cosa la fai come primissima cosa nel setup, tutto il resto resta così com'è

kalle67:
Grazie mi potresti indicare come fare oppure dove poter leggere a riguardo?

Pensaci, è semplice, fissi alcune celle della EEPROM dove, una volta fatta la prima inizializzazione, metterai un valore fisso ... alla partenza, se trovi detto valore fisso, hai già inizializzato/usato la EEPROM, se non lo trovi ... significa che non lo hai fatto :wink:

Guglielmo

P.S.: fabpolli mi ha anticipato ... :slight_smile:

Perfetto grazie, ho capito il procedimento.
Come sempre grazie di tutto.

... aggiungo solo ... per evitare la legge di murphy che è sempre in agguato :smiley: :smiley: :D, non ti limitare ad UN valore.

Io, ad esempio, spreco un po' più di celle ma metto una sequenza ben precisa ($GPB$) ... e ... ok la legge di murphy, ma se 5 celle contengono esattamente quello ... diventa veramente "sfiga" :grin: :grin: :grin:

Guglielmo

Hai ragione "murphy " è sempre in agguato!!!!!! ;D

...spero di non dire una idiozia colossale, scrivo nella EEPROM(0), la leggo IF EEPROM(0)= valore assegnato proseguo nel programma, ELSE resetto arduino. Giusto?

... si, purché ti ricordi che il confronto si fa con '==' e non con un solo uguale :smiley: :smiley: :smiley:

E poi, più che resettare, inizializzerai i valori nella EEPROM :wink:

Guglielmo

Grazie mille.

Ho pensato di far così, cosa ne dite?
[codevoid setup()
{
  if
  (EEPROM.read(50) != 67) {
    EEPROM.write(50, 67);
    EEPROM.write(0, 12);
    EEPROM.write(32, 10);
    EEPROM.write(2, 12);
    EEPROM.write(34, 10);
    EEPROM.write(4, 12);
    EEPROM.write(36, 10);
    EEPROM.write(6, 12);
    EEPROM.write(38, 10);
    EEPROM.write(8, 12);
    EEPROM.write(40, 10);
    EEPROM.write(10, 12);
    EEPROM.write(42, 10);
    EEPROM.write(12, 25);
    EEPROM.write(14, 7);
    EEPROM.write(16, 23);
    EEPROM.write(18, 10);
    EEPROM.write(20, 20);
    EEPROM.write(30, 10);
  }
  else {
    LampOn1 = EEPROM.read(0);
    LampOn1m = EEPROM.read(32);
    LampOff1 = EEPROM.read(2);
    LampOff1m = EEPROM.read(34);
    LampOn2 = EEPROM.read(4);
    LampOn2m = EEPROM.read(36);
    LampOff2 = EEPROM.read(6);
    LampOff2m = EEPROM.read(38);
    LampOn3 = EEPROM.read(8);
    LampOn3m = EEPROM.read(40);
    LampOff3 = EEPROM.read(10);
    LampOff3m = EEPROM.read(42);
    Rison = EEPROM.read(12);
    Lcdon = EEPROM.read(14);
    Lcdoff = EEPROM.read(16);
    Co2on = EEPROM.read(18);
    Co2off = EEPROM.read(20);
    ttt = EEPROM.read(30);
  }]

Le letture le devi fare sempre e comunque, ovvero il ramo else non deve esserci, finite le eventuali write dovrai sempre leggere i dati, questo perché altrimenti quando scrivi i valori predefiniti non hai le variabili inizializzate

Quindi elimino ELSE e sposto le variabili EEPROM dopo tutte le write. In questo modo Arduino al suo avvio terra i valori che io ho inserito manualmente. Giusto?

In origine era

setup()
{
 leggo EEPROM
 ...
}

ora deve essere così:

setup()
{
  if(valore_trovato_in_EEPROM_diverso_da_quello_atteso)
  {
     scrivo valori predefiniti in EEPROM
  }
  leggo EEPROM
  ...
}

così se già hai scritto i tuoi valori li ritrovi, altrimenti scrivi quelli predefiniti e poi, subito dopo, li leggi

grazie, ho fatto così e funziona alla grande.