Eeprom arduino mega

Signori ben ritrovati
scusatemi per prima, ma sul portatile non si vedeva la barra delle opzioni

Sto ciclando sulla eeprom di Arduino Mega

for (int address = 0; address < 1024; address++) {
	value = EEPROM.read(address);
	IF (value == 0){
		continue;
		}
	}

da qualche parte ho letto che le posizioni che non sono mai state scritte dà il valore di 255

se è vero dovrei modificare la riga in

if (value == 0) or (value == 255){
     continue;
   }

oppure dovrei ciclare per tutta la EEprom e assegnare 0 a tutte le posizioni

for (int address = 0; address < 1024; address++) {
     EEPROM.update(address, 0);
}

inoltre leggo che la scheda mega ha 4096 Bytes quindi dovrei ciclare fino a tale limite

for (int address = 0; address < 4096 ; address++) {
      value = EEPROM.read(address);
   }

o scrivere 0 a tutte le posizioni

for (int address = 0; address < 4096 ; address++) {
  EEPROM.update(address, 0);
}

ma su una eeprom vuota il comando UPDATE è efficiente oppure bisogna usare WRITE?

Grazie e scusatemi
Celestino

ciao celestinov,

qualche "problema" in quello che hai scritto:
metti le righe di codice negli appositi tag...diversamente è un casino capire
attenzione che negli esempi che hai fatto usi "=" come comparazione che in realtà è assegnazione

@celestinov: come richiesto al punto 7 del REGOLAMENTO , per favore edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice. Inoltre, così com'è, non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE).

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà sistemato il codice come indicato, nel rispetto del regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Ma perché stai ciclando la EEPROM

Poi da lì sappiamo cosa fare

Scusa, ma che ti interessa? Se la EEPROM è stata scritta da te almeno una volta, metti uno o due byte di "riconoscimento", un qualche tuo "marker" ad un indirizzo specifico (es. due byte in sequenza 0xEE 0xBB, nei byte 0 ed 1): se non ci sono significa che la EEPROM è "pulita" quindi puoi scriverci aggiungendo per primi questi "marker", se invece ci sono allora l'hai scritta, ed in tal caso i byte successivi conterranno ciò che ti interessa.

Se non è questo che ti interessa sapere o fare, spiegaci meglio cosa vorresti fare e perché dovresti "ciclare" (?) la EEPROM.

il tutto deriva da un impianto di irrigazione che comanda n relè
Il proprietario può mettere
1° n orari di irrigazione che iniziano a mezzanotte. Poi gli irrigatori possono irrigare insieme od ad orari diversi dipende dalla scelta che si vuol fare
2° i numeri degli irrigatori che devono partire a quel determinato orario e non altri
3° per quanto tempo lo specifico irrigatore deve stare in funzione

Per ottenere quanto sopra ho diviso in 2÷3 l'area della eeprom su cui scrivo le scelte che farebbe il gestore

il tutto è andato bene per 2 anni.
Oggi, fa solo la prima irrigazione del giorno (a mezzanotte), ma il giorno dopo non parte più
Secondo me, dopo qualche variazione fatto dal cliente, è andato in loop (Facilissimo perchè non è che io sia una cima) c'è qualche buco nel programma
Per cui devo pulire la EEPROM di tutti i dati che stanno sopra e riinstallare il programma
Nel frattempo illudermi di trovare il buco e metterci una pezza
Grazie dell'interessamento
Celestino

Capito, però resta lo stesso criterio che ti ho detto: ripulire la EEPROM mettendoci tutti zeri o tutti 0xFF non cambia, perché dipende dal tuo programma cosa si aspetta di trovare e/o cosa succede se trova tutti zeri o tutti 0xFF, sarebbe meglio averne la certezza (usando un "marker"). E fare questo per via di qualche bug del software è, mi perdonerai, "nascondere la sporcizia sotto al tappeto" :wink:

Per cui il "marker" è una soluzione che anche io stesso ho adottato, ma a questo punto va rivisto un poco il codice per aggiungere proprio quel "marker" che definirai. Se hai dubbi circa i bug software, beh, noi che ci stiamo a fare qui? :smiley: Posta il codice e vediamo, no?

1 Like

Comunque, cancellare la EEPROM fa parte delle opzioni scritte nella "scheda Arduino" selezionata nell'IDE prima di caricare il programma.

Piuttosto, si potrebbe fare un programmino che scrive due valori diversi in ogni cella (perché un valore potrebbe essere già presente), li legge e, in caso di non corrispondenza, segnali l'errore.

Qualcosa del genere:

for (a=0 to 255)
  {
  EEPROM.update(a, 100);
  if(EEPROM.read(a)!=100)
    {
    Serial.print ("Errore in "); Serial.println (a);
    break;
    }
  EEPROM.update(a, 200);
  if(EEPROM.read(a)!=200)
    {
    Serial.print ("Errore in "); Serial.println (a);
    }
  }

oppure, lasciando tutte le celle al valore 255 di fabbrica:

for (a=0 to 255)
  {
  EEPROM.update(a, 100);
  if(EEPROM.read(a)!=100) 
    {
    Serial.print ("Errore in "); Serial.println (a);
    EEPROM.update(a, 255);
    break;
    }
  else
    {
    EEPROM.update(a, 255);
    if(EEPROM.read(a)!=255)
      {
      Serial.print ("Errore in "); Serial.println (a);
      }
    }
  }

Non ho capito cosa intendi, spiegami meglio.

Si ma quello potrebbe essere solo un controllo dell'affidabilità della EEPROM (che si potrebbe effettuare validando i dati letti, ad esempio tramite un checksum posto in altra specifica posizione di memoria), non una soluzione al quesito posto.
EDIT: tra l'altro se ci fossero dubbi circa l'affidabilità della EEPROM eviterei di fare cicli di scrittura massivi...

Aspettiamo di capire cosa fa l'OP ossia vedere il suo codice, che potrebbe contenere un bug a suo dire, oppure può anche darsi che vada a scrivere talmente spesso nella EEPROM da aver superato il limite teorico di scritture affidabili...

E' per verificare se i microcontrollori che dopo 2 anni stanno dando problemi hanno celle danneggiate e quali.

Si ma se non sappiamo cosa fa il suo codice e soprattutto lui sospetta qualche bug, aspettiamo che ci dia informazioni ed evitiamo di allungare il thread con nostre considerazioni e disquisizioni su cosa possa o non possa essere, ti pare?

Mi ha stimolato la fantasia... :slight_smile:

##############################################################

uno.name=Arduino Uno

uno.vid.0=0x2341
uno.pid.0=0x0043
uno.vid.1=0x2341
uno.pid.1=0x0001
uno.vid.2=0x2A03
uno.pid.2=0x0043
uno.vid.3=0x2341
uno.pid.3=0x0243

uno.upload.tool=avrdude
uno.upload.protocol=arduino
uno.upload.maximum_size=32256
uno.upload.maximum_data_size=2048
uno.upload.speed=115200

uno.bootloader.tool=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE // <<<<<<<<<
uno.bootloader.extended_fuses=0xFD
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex

uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.board=AVR_UNO
uno.build.core=arduino
uno.build.variant=standard

##############################################################

unoEE.name=Arduino Uno con EESAVE

unoEE.vid.0=0x2341
unoEE.pid.0=0x0043
unoEE.vid.1=0x2341
unoEE.pid.1=0x0001
unoEE.vid.2=0x2A03
unoEE.pid.2=0x0043
unoEE.vid.3=0x2341
unoEE.pid.3=0x0243

unoEE.upload.tool=avrdude
unoEE.upload.protocol=arduino
unoEE.upload.maximum_size=32256
unoEE.upload.maximum_data_size=2048
unoEE.upload.speed=115200

unoEE.bootloader.tool=avrdude
unoEE.bootloader.low_fuses=0xFF
unoEE.bootloader.high_fuses=0xD6 // <<<<<<<<<
unoEE.bootloader.extended_fuses=0x05
unoEE.bootloader.unlock_bits=0x3F
unoEE.bootloader.lock_bits=0x0F
unoEE.bootloader.file=optiboot/optiboot_atmega328.hex

unoEE.build.mcu=atmega328p
unoEE.build.f_cpu=16000000L
unoEE.build.board=AVR_UNO
unoEE.build.core=arduino
unoEE.build.variant=standard

##############################################################

Gentili signori,
vi assicuro che non ci sono stati troppi cicli elevati di scrittura sulla eeprom
una volta fissati gli orari, non vengono mai toccati. Vengono solo letti
I dati scritti sulla eeprom non sono stati mai modificati

comunque il tempo di commentare al meglio il programma e lo posto

questo soddisfa già parecchio la mia necessità

Grazie
Celestino

credo di aver trovato il problema
in una prima versione leggevo tutti gli orari e poi li mettevo in ordine crescente
Questo mi permetteva di avere una sequenza crescente
Non riutilizzandola se si mettono orari a caso si DOVREBBE bloccare
Non so come si fa, ma provo a postare il programma

Grazie a tutti
Celestino

Non ci sono riuscito
se potessi avere un aiutino...

Lo copi, clicchi su CODE e lo incolli.

/* c'è una piccola consol dove ci sono led e pulsanti
il pulsante RESET esiste, ma non viene menzionato anche perché è solo un collegamento fisico
esisteno altri 9 pulsanti
1 per tarare gli irrigatori 
1 per fare una irrigazione saltuaria
1 per selezionare quale irrigazione si vuole avere
con altri 2 per incrementare o decrementare i numeri
1 per definire i tempi di irrigazione
con altri 2 per incrementare o decrementare i numeri

*/


#include <EEPROM.h>
#include <Arduino.h>
#include <TM1637Display.h>
//variabili che servono per il display
#define CLK 3
#define DIO 2

TM1637Display display(CLK, DIO);
int ritardoSuDisplay = 1000;// per dare il tempo di leggere il messaggio

// questo gestisce gli orari
#define Min_Mill  60000
#define Ore_Min  5
#define quar 40
#define ritardoIrrSalt 6000 

//poichè i relè iniziano il collegamento al pin 41 si considererà nr - 40 = varrà come numero del pin
int Irrigatori[] = {
  41, //goggia a goccia lato cucina
  42, //irrigatore OS 140 lato sud
  43, // irrigatore vicino garage
  44, //goggia a goccia lato ovest garage
  45, // irrigatore lato ovest
  46, //irrigatore OS 140 lato nord ingresso
  47  //goggia a goccia lato nord ingresso
};

//minimo da cui leggere e scrivere per le varie irrigazioni
#define StartOraIrr  700
#define MaxOraIrr 1023
byte OraLocMem = 1;
#define StartByte 0
#define MaxByte 254

// variabili che servono per il debouncing dei pulsanti
unsigned long tempodb = 0;
#define deb_delay  200


//servono per  la pausa
//considerando l'ora di accensione alle 12 mezzogiorno
// fino alle 12 di notte sono: 12 ore che in mille secondi sono:
// 12 x 60 x 60 x 1000 = 43200000 millisecondi
// poi sarà ogni 24 ore  quindi 86.400.000 millisecondi
unsigned long intervallo =  43200000;
unsigned long oraInizio  = 0;
unsigned long oraFine  = 0;
#define giorno  86400000

// quanti irrigatori, quante voci sono? questo se si aggiungono altri irrigatori
#define  LunArr   sizeof(Irrigatori) / sizeof(Irrigatori[0])


/****  PULSANTI ***/

//Pulsante e variabile per irrigazione saltuaria
#define Pin_Saltuaria 4


//Pulsante per tarare gli irrigatori
#define Pin_Taratura  5


//Pulsante per VARIARE I TEMPI DI IRRIGAZIONE
#define Pin_Tempi_Taratura  6
#define INC_Tempi_Taratura  8
#define DEC_Tempi_Taratura  9

//Pulsante per cambio orario gli irrigatori
#define Pin_Var_Orario  7
#define INC_Pin_Var_Orario  10
#define DEC_Pin_Var_Orario  11

//led di segnalzaione

#define led_Taratura 22
#define led_Orario 23
#define led_Irrigo 24

//costanti di messaggio

const char ciao = 'CIAO'; //OK
const uint8_t SEG_CIAO[] = {
  SEG_A | SEG_D | SEG_D | SEG_E | SEG_F, // C
  SEG_B | SEG_C,  // I
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // A
  SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F
}; // O

const char salt = 'salt'; //OK
const uint8_t SEG_SALT[] = {
  SEG_A | SEG_C | SEG_D | SEG_F | SEG_G, // S
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // A
  SEG_D | SEG_F | SEG_E, // L
  SEG_E | SEG_F | SEG_G | SEG_D
};//t

const char tara = 'tara'; //OK
const uint8_t SEG_TARA[] = {
  SEG_E | SEG_F | SEG_G | SEG_D, //t
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G, // A
  SEG_E | SEG_G, // r
  SEG_A | SEG_B | SEG_C | SEG_E | SEG_F | SEG_G // A
};

//const char fine = 'fin'; //OK
const char end = 'end'; //OK
const uint8_t SEG_END[] = {B01111001, B01010100, B01011110, B00000000};

const char done = 'done'; //OK
const uint8_t SEG_DONE[] = {
  SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
  SEG_C | SEG_D | SEG_E | SEG_G, // O
  SEG_C | SEG_E | SEG_G, // n
  SEG_A | SEG_D | SEG_E | SEG_F | SEG_G
}; // E

const char orario = 'orar'; //OK
const uint8_t SEG_ORAR[] = {B00111111, B01010000, B01110111, B01010000};

//const char ir = 'ir'; //OK
const uint8_t SEG_IR[] = {B00010000, B01010000};

//const char t = 't'; //OK
const uint8_t SEG_T[] = {B01111000};

const char irri = 'irri'; //OK
const uint8_t SEG_IRRI[] = {B00010000, B01010000, B01010000, B00010000};

const char pros = 'pros'; //OK
const uint8_t SEG_PROS[] = {B01110011, B01010000, B01011100, B01101101};

const char totx = 'totx';
const uint8_t SEG_TOTX[] = {B01111000, B01011100, B01111000, B01011111};

const char clear = 'cz'; //OK

const char play = 'play';
const uint8_t PLAY[] = {B01110011, B00111000, B01011111, B01101110};

const uint8_t celsius[] = {B01100011};

void setup()
{

  //***********************************************/
  //questo dipende dall'Arduino utilizzato

#define UltimoPinInput  13 // logici + analogici
#define PrimoPinInput  2 //i primi 2 sono inutilizzzabili
  Serial.begin(9600);// questo deve essere messo per forza qui
  for (byte x = PrimoPinInput; x < UltimoPinInput; x++) {
    //pinMode(x, OUTPUT);
    pinMode(x, INPUT);
  }

// io non conoscevo i relè a  'comando alto' anche se consigliato da Standardoil per cui ho comprato i relè sbagliati

#define ReleSpento HIGH
#define ReleAcceso LOW
#define UltimoPinOutput  53 // logici 
#define PrimoPinOutput 30
  for (byte x = PrimoPinOutput; x < UltimoPinOutput; x++) {
    pinMode(x, OUTPUT);
    digitalWrite(x, ReleSpento);
  }
  display.setBrightness(0x0f);
  visStringa(ciao);
  visStringa(pros);
  visStringa(irri);
  VisualizzaOrario( OraIrrigazione());
  delay(ritardoSuDisplay);
  visStringa(clear);
}

void loop()
{

  /* questa pausa serve sia per l'avviamento alle 12
    sia per l'irrigazione giornaliera a mezzanotte
  */
  pausa(intervallo);

  //digitalWrite(led_Irrigo, HIGH);

  // immagazzino l'ora di inizio perché non so quanto dura l'irrigazione
  unsigned long oraInizioIrr = millis();
 
  byte  oraIrrigaz = 0;
  OraLocMem = 0;//perché viene riportato subito a 1
  byte MinutiDaMezzanotte = 0;
  for (int Ora = (StartOraIrr ); Ora < MaxOraIrr; Ora++) {
    OraLocMem++;
    oraIrrigaz = OraIrrigazione();
    if (oraIrrigaz > 0 )
    {
      pausa((oraIrrigaz - MinutiDaMezzanotte) * Ore_Min * Min_Mill );
      digitalWrite(led_Irrigo, HIGH);
      IrrigazioneSaltuaria();
      digitalWrite(led_Irrigo, LOW);
      display.clear();
      MinutiDaMezzanotte += oraIrrigaz;
    }
  }

  unsigned long oraFineIrr  = millis();
  intervallo = giorno - (oraFineIrr - oraInizioIrr );
  //visPosizione( 13);
  digitalWrite(led_Irrigo, LOW);
  display.clear();
} //loop

/******effettua la pausa desiderata
**********************************
**************************************
**************************************
*/
void pausa(long unsigned attesa ) {
  /*********************************************
    qua si blocca ed attende
  **********************************************/

  oraInizio = millis();
  do // questo è il blocco principale
  {
    /*********************************************
      IRRIGAZIONE SALTUARIA
    **********************************************/

    if (digitalRead(Pin_Saltuaria))
    {
      // Serial.println("IrrigazioneSaltuaria dal blocco proncipale");
      //deciderer dove accendere i led
      bool procedo = true;
      if (debouncing()) {
        visStringa(irri);
        visStringa(salt);
        visPosizione(OraLocMem);

        /******************
          questo viene messo per avere la possibilità di annullare
          l'irrigazione saltuaria ed effettuarne un'altra
        *************************/

        for (int k = 0; k < ritardoIrrSalt; k++)
        {
          if (digitalRead(Pin_Taratura))  {
            if (debouncing()) {
              VisualizzaTutto();
            }
          }

          if (digitalRead(Pin_Saltuaria))  {
            if (debouncing()) {
              procedo = false;
              visStringa(end);
              break;
            }
          }
        }


        // se non è stata annullata
        if (procedo) {
           IrrigazioneSaltuaria();
        }
        
        visStringa(done);
        visStringa(clear);
      }
    }


    /*********************************************
      TARATURA GETTO DEGLI IRRIGATORI
    **********************************************/
    if (digitalRead(Pin_Taratura))
    {
      //Serial.println("ProvaIrrigatori dal blocco proncipale");
      if (debouncing()) {
        visStringa(tara);
        //visPosizione(40 );
        ProvaGettoIrrigatori();
        //visPosizione(401 );
        visStringa(end);
        visStringa(clear);
      }
    }

    /*********************************************
         MODIFICA GLI ORARI NOTTURNI DI IRRIGAZIONE
     **********************************************/
    if (digitalRead(Pin_Var_Orario))
    {
      if (debouncing()) {
        // Serial.println("modifica orari irrigazione");
        visStringa(orario);
        // visPosizione( 60);
        OrariIrrigazione();
        // visPosizione(601 );
        visStringa(done);
        visStringa(clear);
      }
    }
    oraFine = millis();
  } while ((oraFine - oraInizio) < attesa );

} // pausa

/*irrigazione saltuaria*/
void IrrigazioneSaltuaria() {
  for (byte y = 0; y < LunArr; y++) {
    byte minuti = MinutiIrrigazione( Irrigatori[y]);
    visNumero(minuti);
    VisNrIrrigatore (Irrigatori[y]);
    VisMinIrrigatore (minuti);
    //visPosizione(33);
    if (minuti > 0 ) {
      //visPosizione(34);
      digitalWrite(led_Irrigo, HIGH);
      digitalWrite(Irrigatori[y], ReleAcceso);
      Attendi(minuti);
      digitalWrite(Irrigatori[y], ReleSpento);
      // visPosizione(35);
      digitalWrite(led_Irrigo, LOW);
    }
  }//for
}//IrrigazioneSaltuaria



/* blocca acceso gli irrigatori per
  orientare il getto*/
void ProvaGettoIrrigatori() {
  digitalWrite(led_Irrigo, HIGH);
  for (byte y = 0; y < LunArr; y++) {
    //visPosizione(41 );
    VisNrIrrigatore (Irrigatori[y]);
    digitalWrite(Irrigatori[y], ReleAcceso);
    bool prossimo = true;
    do {
      if (digitalRead(Pin_Taratura))
      {
        if (debouncing()) {
          prossimo = false;
        }
      }
    } while (prossimo);
    digitalWrite(Irrigatori[y], ReleSpento);
  }//(byte y = 0; y < LunArr; y++)
  //visPosizione( 42);
  //visStringa(end);
  //clear c'è dopo
  digitalWrite(led_Irrigo, LOW);
}//ProvaGettoIrrigatori


/********************************
  questo serve per modificare gli orari di
  irrigazione notturni
  *************************************/
void OrariIrrigazione() {

  digitalWrite(led_Orario, HIGH);
  bool PossoTarare = true;

  //visPosizione(61);
  visStringa(orario);
  visPosizione(OraLocMem);
  VisualizzaOrario(OraIrrigazione());

  do {

    if (digitalRead(Pin_Tempi_Taratura)) {
      if (debouncing()) {
        // visPosizione(62);
        ModOrarioIrrNotturno();
        // visPosizione(63);
        visPosizione(OraLocMem);
        VisualizzaOrario(OraIrrigazione());
      }
    }

    /************************************
      da qui si gestisce i vari orari di irrigazione notturni
      *************************************/
    if (digitalRead(Pin_Var_Orario)) {
      if (debouncing()) {
        PossoTarare = false;//per chiudere
        break;//*******************************************
        //Serial.println(" chiudo PossoTarare");
        //visPosizione(64 );
      }
    }

    if (digitalRead(INC_Pin_Var_Orario)) {
      if (debouncing()) {
        /*Serve solo ad incrementare o a diminuire il valore di OraLocMem*/
        if (OraLocMem < (MaxOraIrr - StartOraIrr)) {
          OraLocMem++;
          //Serial.println("");
          visPosizione(OraLocMem);
          //visPosizione( 65);
          VisualizzaOrario(OraIrrigazione());
        }
      }
    }

    if (digitalRead(DEC_Pin_Var_Orario)) {
      if (debouncing()) {
        /*Serve solo ad incrementare o a diminuire il valore di OraLocMem*/
        if (OraLocMem > 1) {
          OraLocMem--;
          /*Serial.println("");
            Serial.println(OraLocMem);*/
          visPosizione(OraLocMem);
          //visPosizione(66 );
          VisualizzaOrario(OraIrrigazione());
        }
      }
    }
    /*********************************************
         VISUALIZZA IL TEMPO DI TUTTI GLI IRRIGATORI SENZA MODIFICARLI
          **********************************************/

    if (digitalRead(Pin_Taratura))
    {
      if (debouncing()) {
      
        VisualizzaTutto();
        visStringa(orario);
        visPosizione(OraLocMem);
        VisualizzaOrario(OraIrrigazione());
      }
    }
  } while (PossoTarare);
  digitalWrite(led_Orario, LOW);
}//OrariIrrigazione ModificaOrari

/*********************************************
     VISUALIZZA IL TEMPO DI TUTTI GLI IRRIGATORI SENZA MODIFICARLI
      **********************************************/
void VisualizzaTutto() {
  int totaleOra = 0;

  for (byte y = 0; y < LunArr; y++) {
    byte minuti = MinutiIrrigazione(Irrigatori[y]);
    totaleOra = totaleOra + minuti;
    VisNrIrrigatore (Irrigatori[y]);
    VisMinIrrigatore (minuti);
  
  }//for (byte y = 0; y < LunArr; y++)
  visStringa(totx);
  visNumero(totaleOra);
 
  delay(ritardoSuDisplay);

  display.clear();
}//VisualizzaTutto

/************************************************
  MODIFICA L'ORARIO NOTTURNO DI IRRIGAZIONE
**************************************************/
void ModOrarioIrrNotturno() {

  digitalWrite(led_Taratura, HIGH);
  byte orario = OraIrrigazione();
  bool condizione = true;//esce dal loop
  visStringa(play);

  VisualizzaOrario(orario);
  do {
    //esce dal loop
    if (digitalRead(Pin_Tempi_Taratura )) {
      if (debouncing()) {
        condizione = false;
       
        EEPROM.update((OraLocMem + StartOraIrr), orario);
        visStringa(done);

        break;
      }
    }
    if (digitalRead(INC_Tempi_Taratura)) {
      if (debouncing()) {
        orario++;
       
        VisualizzaOrario(orario);
      }
    }
    if (digitalRead(DEC_Tempi_Taratura )) {
      if (debouncing()) {
        orario--;
     
        VisualizzaOrario(orario);
      }
    }
    if (digitalRead(Pin_Taratura))
    {
      if (debouncing()) {
       
        TaraDurataIrrigatori();
      }
    }

  } while (condizione);//do

  digitalWrite(led_Taratura, LOW);
  visStringa(clear);
}//ModOrarioIrrNotturno

/************************************************
  AGGIORNA DURATA DI IRRIGAZIONE
**************************************************/
void  TaraDurataIrrigatori() {

  digitalWrite(led_Irrigo, HIGH);
 
  for (byte y = 0; y < LunArr; y++) {
    int LocMemMinuti = ((OraLocMem * LunArr) + Irrigatori[y]);
 
    bool condizione = true;//esce dal loop ed avanza y
 
    byte MinutiXIrrigatore = MinutiIrrigazione(Irrigatori[y]);
  

    VisNrIrrigatore (Irrigatori[y]);
    VisMinIrrigatore (MinutiXIrrigatore);
    do {
      if (digitalRead(Pin_Taratura)) {
        //questo permette di avanzare di un irrigatore
        if (debouncing()) {
        
          condizione = false;
          break;
        }
      }
      if (digitalRead(Pin_Tempi_Taratura)) {
        if (debouncing()) {
 
          EEPROM.update((LocMemMinuti), MinutiXIrrigatore);

          VisNrIrrigatore (Irrigatori[y]);
          VisMinIrrigatore (MinutiXIrrigatore);
          visStringa(done);
          VisNrIrrigatore (Irrigatori[y]);

        }
      }

      if (digitalRead(INC_Tempi_Taratura) ) {
        if (debouncing()) {
          MinutiXIrrigatore++;
          VisMinIrrigatore (MinutiXIrrigatore);
       

        }
      }

      if (digitalRead(DEC_Tempi_Taratura) ) {
        if (debouncing()) {
          MinutiXIrrigatore--;
          VisMinIrrigatore (MinutiXIrrigatore);
          
        }
      }
    } while (condizione);
  }//(byte y = 0; y < LunArr; y++)
  digitalWrite(led_Irrigo, LOW);

}//TaraIrrigatori

/*Routin che aspetta il tempo
  che dovrebbero essere minuti
  In questa routin si potrebbe misurare il tempo che la differenza*/
void Attendi (unsigned long tempoAtt) {
  tempoAtt = tempoAtt * Min_Mill;//1 Minuti = 60000 Millisecondi
 
  unsigned long previousMillis = millis();
  unsigned long currentMillis = 0;
  do {
   
    currentMillis = millis();
  } while ((currentMillis - previousMillis) < tempoAtt);
  //visPosizione(42);
}
/* questa routine serve per evitare che il pulsante invii doppio click
**************************
*/
bool debouncing() {
  unsigned long precedenteMillis = millis();
  if (( precedenteMillis - tempodb) > deb_delay) {
    tempodb = precedenteMillis;
    return true;
  } else {
    return false;
  }
}//debouncing


//legge l'orario 
byte OraIrrigazione() {
  byte orairr = EEPROM.read(OraLocMem + StartOraIrr);

  if ((orairr > StartByte) && (orairr < MaxByte)) {
    return orairr;
  } else {
    return 0;
  }
}

byte MinutiIrrigazione(byte irrigatore) {

  byte min = EEPROM.read((OraLocMem * LunArr) + irrigatore) ;
  
  if ((min >  StartByte) && (min < MaxByte)) {
    return min;
  } else {
    return 0;
  }
}

/*************************************
 ***********VISUALIZZA SUL DISPLAY************
 * *******************************************
 * ********************************/

void VisNrIrrigatore (byte NrIrrigatore)
{
  display.setSegments(celsius, 1, 1);
  display.setSegments(SEG_IR, 2, 2);
  display.showNumberDec(NrIrrigatore - quar,  false, 1, 0);
  delay(ritardoSuDisplay);
}

void VisMinIrrigatore (byte MinIrrigatore)
{
  display.setSegments(SEG_T, 1, 0);
  display.showNumberDec(MinIrrigatore,  false, 3, 1);
  delay(ritardoSuDisplay);
}

void VisualizzaOrario(int Ora) {

  int Orario = 0;
  Ora = Ora * 5;
  int PP = Ora / 60;

  int PS = (Ora % 60);
  Orario = (PP * 100) + PS;
  display.showNumberDecEx(Orario, 0b11100000, true, 4, 0);
}

void visPosizione (int numero) {
  display.clear();
  display.setSegments(celsius, 1, 3);
  byte Posizione = 2;
  byte q = 1;
  if (numero > 9) {
    Posizione = 1;
    q = 2;
  }
  if (numero > 99) {
    Posizione = 0;
    q = 3;
  }
  display.showNumberDec(numero, false, q, Posizione);
  delay(ritardoSuDisplay);
}

void visNumero(int numero) {
  display.showNumberDec(numero,  false, 4, 0);
  delay(ritardoSuDisplay);
}


void visStringa(char stringa) {
  // prende l'ultima lettera del valore della stringa
  switch (stringa) {

    case tara:
      display.setSegments(SEG_TARA);
      break;

    case done:
      display.setSegments(SEG_DONE);
      break;

    case end:
      display.setSegments(SEG_END);
      break;

    case ciao:
      display.setSegments(SEG_CIAO);
      break;

    case orario:
      display.setSegments(SEG_ORAR);
      break;

    case irri :
      display.setSegments(SEG_IRRI);
      break;

    case pros:
      display.setSegments(SEG_PROS);
      break;

    case salt:
      display.setSegments(SEG_SALT);
      break;

    case totx:
      display.setSegments(SEG_TOTX);
      break;

    case play:
      display.setSegments(PLAY);
      break;

    default:
      display.clear();
      break;

  }
  delay(ritardoSuDisplay);
}


type or paste code here

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