libreria eepromex

Salve ho creato un programma dove salvo dei dati float e byte usando la libreria eepromex.h , tutto funziona correttamente ma i dati che salvo, alla riaccensione li salva un float alla volta. mi spiego meglio: ho 4 tarature con dato float , una volta che le ho inserite spengo e riaccendo e mi rimane memorizzato solo la prima poi riscrivo le tarature e mi rimane memorizzata solo la prima e la seconda poi lo stesso con la terza e la quarta. a questo punto il programma funziona correttamente ad ogni riaccensione. sapete darmi un motivo di questo funzionamento?

… evidentemente un errore di programma, metti il codice sorgente (… mi raccomando, in conformità al regolamento, punto 7, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone </> … primo a sinistra).

Guglielmo

#include "HX711.h"
#include <LiquidCrystal.h>
#include <EEPROMex.h>//libreria estesa
#include <DS1307RTC.h>
#include <Wire.h>
#include <Time.h>
//pagine menu
#define setpeso  1
#define setpeso1 2
#define setpeso2 3
#define setpeso3 4
#define setpeso4 5
#define setvolo 6
#define setorologio 7
#define visuaconteggio 8
#define setconteggio 9
#define tornasu 10
//costanti per orologio
#define stClockRunning 0
#define stSetDay 1
#define stSetMonth 2
#define stSetYear 3
#define stSetHour 4
#define stSetMinute 5
#define stSetSecond 6
#define tornasu1 7

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//costante tempo
int secP = 0; //contasec
int secM = 0; //menu
int secPM = 0; //ritardo pulsante menù
int secUD = 0; //ritardo uscita da dosatura
//costante per contasendi
unsigned long prevmillis = 0;
//in programmazione
boolean in_prog = LOW;
//tarature pesi
float set_peso1;
float set_peso2;
float set_peso3;
float set_peso4;
float set_volo;
float set_tara;
//pulsanti
unsigned int  val_P1;
unsigned int  val_P2;
unsigned int  val_P3;
unsigned int  val_P4;
unsigned int  val_P5;
//costanti EEprom
int    e_P1 = 1; //taratura P1
int    e_P2 = 5; //taratura P2
int    e_P3 = 9; //taratura P3
int    e_P4 = 13; //taratura P4
int    e_volo = 17; //taratura volo
int    e_tara = 21; //taratura tara
// costanti EEprom per salvataggio data/ora
int    e_ora = 25; //ora
int    e_minuti = 26; //minuti
int    e_secondi = 27; //secondi
int    e_giorno = 28; //giorno
int    e_mese = 29; //mese
int    e_anno1 = 30; //anno
//int    e_anno2 = 31; //anno
int    e_tot_pesa1 = 34; //giorno 7
//int    e_tot_pesa2 = 33; //giorno 7
//costanti dosature
long tot_oggi;
byte oraS;
byte minutiS;
byte secondiS;
byte giornoS;
byte meseS;
long annoS;
// costante per menu
int stat = 0;
//menu orologio
int stat1 = 1;
//entrate per HX711
HX711 scale(A0, A1);		// parameter "gain" is ommited; the default value 128 is used by the library

void Print(int number)
{
  lcd.print(number / 10);
  lcd.print(number % 10);
}
//loop per la registrazione orologio
int value = 0;
void setRTCTime(int hour, int minute, int second, int day, int month, int year)
{
  // define tempo do Arduino
  setTime(hour, minute, second, day, month, year);
  time_t t = now();
  // define tempo do RTC
  RTC.set(t);
}
/////////////////////////////////////////////////////////////
void setup() {
  lcd.begin(16, 2);
  //set entrate uscite
  pinMode (7, INPUT); //pulsante P1
  pinMode (9, INPUT);  //pulsante P2
  pinMode (8, INPUT);  //pulsante P3
  pinMode (10, INPUT);  //pulsante P4
  pinMode (13, INPUT);  //pulsante P_prog
  pinMode (6, OUTPUT); // suoneria
  pinMode (1, OUTPUT); //relè
  //
  //leggi tarature
  set_peso1 = EEPROM.readFloat(e_P1);
  set_peso2 = EEPROM.readFloat(e_P2);
  set_peso3 = EEPROM.readFloat(e_P3);
  set_peso4 = EEPROM.readFloat(e_P4);
  //Tarature peso 1
  if ((in_prog == HIGH) && (stat == 2)) {
    if (val_P3 == HIGH) {
      delay(200);
      set_peso1++;
      if (set_peso1 >= 250) { //blocca a 25gr
        set_peso1 = 0;
      }
      lcd.setCursor(5, 1);
      lcd.print(set_peso1 / 10);
          EEPROM.writeFloat(e_P1, set_peso1);
                delay(200);
    }
    if ((val_P4 == HIGH) && (set_peso1 != 0)) {
      delay(200);
      set_peso1--;
      lcd.setCursor(5, 1);
      lcd.print(set_peso1 / 10);
          EEPROM.writeFloat(e_P1, set_peso1);
                   delay(200);
    }
  }//fine taratura peso 1

Se vuoi che ti si aiuti il codice va messo PER INTERO ... gli spezzoni dicono poco e possono NON mostrare errori che sono altrove.

Guglielmo

christianbortotto: Scusa ma è lunghetto per questo non lo ho inserito totalmente,devo dividerlo ....

.... in questi casi è più facile "allegare" (con l'apposito bottone) direttamente il file ".ino" ;)

Guglielmo

ecco il codice .ino
grazie

w190916.ino (19.4 KB)

Potresti spiegare la logica di tutti quegli IF che dovrebbero salvare in EEPROM i vari valori ? Non facevi prima a mettere uno switch/case ? Anche perchè, chiedersi IN SEQUENZA :

if ((in_prog == HIGH) && (stat == 2)) {

… e subito dopo

if ((in_prog == HIGH) && (stat == 3)) {

NON ha molto senso … se stat è == 2 non può essere == 3 … ::slight_smile:

Guglielmo

ho inserito gli IF per identificare dove sono il menu ed ad ogni cambio di valore salvo il dato se sono con stat = 2 sto modificando il valore della seconda pesata se stat = 3 sto modificando il valore della terza pesata e così via

christianbortotto: ho inserito gli IF per identificare dove sono il menu ed ad ogni cambio di valore salvo il dato se sono con stat = 2 sto modificando il valore della seconda pesata se stat = 3 sto modificando il valore della terza pesata e così via

occhio che la eprom non è un hd dove scrivi miliardi di volte....

Non ricordo bene dove, mi pare di ricordare che per la flash siano permessi 10000 cicli e la EEPROM 100000. A scriverle 90 volte al giorno durerebbero per almeno 3 anni.

christianbortotto: ho inserito gli IF per identificare dove sono il menu ed ad ogni cambio di valore salvo il dato se sono con stat = 2 sto modificando il valore della seconda pesata se stat = 3 sto modificando il valore della terza pesata e così via

Si quello era chiaro, ma ovvimente, se stat == 2 NON può essere stat == 3 e quindi ... ... che perdi tempo a fare tutti i confronti uno dopo l'altro se SOLO uno può essere vero ?

Non è meglio una bella struttura switch/case, che sarebbe molto più leggibile, ridurrebbe il codice e sarebbe più efficiente ?

ExperimentUno: Non ricordo bene dove ...

E' chiaramente scritto nel datasheet, sono il numero di scritture minime garantite da Atmel.

Guglielmo