memorizzare i tempi quando è in funzione un relè

salve ho necessità di monitore quando si accende e si spegne il relè che aziona in automatico la pompa dell'acqua per irrigare, ho scritto già lo skecht che aziona in automatico la pompa quando arriva al liv max e spegne quando arriva al liv min, ma visto che lo fa in automatico non so per quante ore ha irrigato, quindi la necessità di memorizzare tali dati, sarebbe bello riuscire a visualizzare su uno schermo lcd a 4 linee gli start e stop che sono stati eseguiti es:

18-02-20-10:30- pompa ON
18-02-20-12:30- pompa OFF
18-02-20-16:30- pompa ON
18-02-20-18:30- pompa OFF
18-02-20-22:30- pompa ON

magari a scorrimento fino a 10 precedenti e memorizzare tutto su sd

premetto che nel codice manca l'inserimento del monitor e relativo pulsante di scorrimento, il modulo SD presente sulla shield ethernet e il modulo Ds 3231 RTC per data e ora, che faro a breve.........la cosa più difficile se potreste aiutarmi è risolvere quanto descritto prima

Grazie a tutti!

/*ATTIVAZIONE RELè CON SENSORI DI LIV MAX E MIN */
/*
    50 led rosso livello acqua min 50 mt
    51 led verde livello acqua max 35 mt
    52 led rosso pompa spenta
    53 led verde pompa accesa
    A0 sensore livello acqua max 35 mt
    A1 sensore livello acqua min 50 mt
    22 relè pompa
    
*/
#define pompa 22 // relè pompa
#define led_liv_min 50
#define led_liv_max 51
#define led_pompa_off 52
#define led_pompa_on 53
#define liv_max A0
#define liv_min A1

const int soglia_minima = 800; //sensore di livello mimino
const int soglia_massima = 400; //sensore di livello massimo

void setup()
{
  Serial.begin(9600);
  pinMode(50, OUTPUT);  //led rosso livello acqua min 50 mt
  pinMode(51, OUTPUT);  //led verde livello acqua max 35 mt
  pinMode(52, OUTPUT);  //led verde pompa accesa
  pinMode(53, OUTPUT);  //led rossa pompa spenta
  pinMode(pompa, OUTPUT);  //relè pompa
  pinMode(A0, INPUT);   // sensore livello acqua min 50 mt
  pinMode(A1, INPUT);   // sensore livello acqua max 35 mt

}

void loop()
{
  int sensorValue_1 = analogRead(A0); //Legge il valore analogico liv MAX
  {

    if (sensorValue_1 <= soglia_massima)
    {
      Serial.println("pompa accesa livello acqua ok");
      digitalWrite(pompa, LOW); //Accendi pompa
      digitalWrite(led_pompa_on, HIGH); //Accendi led VERDE pompa
      digitalWrite(led_liv_max, HIGH); //Accendi led VERDE liv MAX
      digitalWrite(led_liv_min, LOW); //Spegni led ROSSO liv min
      digitalWrite(led_pompa_off, LOW); //Spegni led ROSSO pompa
    }
  }

  int sensorValue_2 = analogRead(A1); //Legge il valore analogico liv Min
  {

    if (sensorValue_2 >= soglia_minima)
    {
      Serial.println("pompa spenta livello acqua Basso" );
      digitalWrite(pompa, HIGH); //spegni pompa
      digitalWrite(led_pompa_on, LOW); //Spegni led VERDE pompa
      digitalWrite(led_liv_max, LOW); //Spegni led VERDE liv MAX
      digitalWrite(led_liv_min, HIGH); //Accendi led ROSSO liv min
      digitalWrite(led_pompa_off, HIGH); //Accendi led ROSSO pompa
    }
  }

  delay(2000); //Attende due secondi
}

Boh, non è che si capisca molto qual'e' il problema di preciso.
Inoltre finchè non metti dentro RTC, SD e lcd viene difficile darti indicazioni.

Come suggerimenti io ti direi:
Dove ora fai Serial.print dello stato della pompa, semplicemente mandi sia su seriale, che su display che su sd la stessa frase, prendendo dal RTC l'ora corrente.
Io ti suggerisco di NON fare tutto dentro a questo programma, per ora.
Fai un programma in cui capisci come gestire il lcd, poi un altro sketch per RTC, etc.
Poi potrai mettere le cose insieme. Fai prima esperienza con i singoli elementi.

Poi, gestire invece lcd con pulsanti a scorrimenti di quei dati sarà una cosa successiva (e non semplicissima) e i delay() sono da eliminare perchè bloccano Arduino.
Inoltre secondo me una cosa è visualizzare quando va ON e OFF un'altra è calcolare il tempo di irrigazione.
Tieni conto poi che memorizzare i 10 precedenti, bisogna minimizzare le cose, Arduino Uno ha poca memoria (mi raccomando, NON visualizzare i dati riprendendoli dalla SD, sarebbe pesantissimo x Arduino).

Se ti accontenti di qualcosa di semplice e approssimativo (che per il tuo scopo dovrebbe essere accettabilissimo), puoi semplicemente annotare millis() in un array di variabili unsigned long. L'array verrà scritto ciclicamente e dovrà avere un numero di elementi pari al numero di eventi trascorsi che vuoi visualizzare. Supponendo di voler visualizzare gli ultimi 10 eventi, puoi dimensionare un array
unsigned long tempo[10];
che avrà 10 elementi dall'indice 0 all'indice 9 in cui memorizzerai millis() a ogni evento, e un altro array
uint8_t stato[10];
con le stesse dimensioni del primo in cui memorizzerai che cosa è accaduto.
Quindi, ogni volta che la pompa parte o si ferma verrà annotato millis() in "tempo" e 1 se la pompa si è avviata o 0 se la pompa si è fermata in "stato". Quando il contatore degli eventi raggiunge 10, viene immediatamente riportato a 0 e viene usato tale valore.
Fatto tutto ciò, è facile scorrere gli eventi, dividendo "tempo" per 3600000 per conoscere il tempo trascorso in ore tra un evento e l'altro, quindi la durata di accensione e quella di spegnimento. :slight_smile:
Dovrai armeggiare un po' con il display, ma non è difficile: ruotando un encoder o premendo due pulsanti incrementi o decrementi una variabile da 0 a 6; in base a tale valore, verranno visualizzate 4 righe che andranno dall'indice pari alla variabile fino a quello pari alla variabile +3:
da 0 a 3
da 1 a 4
da 2 a 5
da 3 a 6
da 4 a 7
da 5 a 8
da 6 a 9.