Massime e minime orario

Salve a tutti! Volevo chiedervi: voi sapete un modo per salvare la data e l'orario in cui viene rilevata una massima e una minima di temperatura ad esempio? Sono in possesso già di un rtc, il ds3231 Voglio praticamente che quando venga rilevata la massima segni l'orario del momento in cui l'ha captata. Ovviamente già ho fatto con lo sketch le massime e minime, però vorrei sapere questo particolare, sul come segnare da qualche parte l'orario in cui è stata rilevata. Avevo pensato che dentro l'if delle massime e minime ci mettevo tipo un serial.print o scrivevo su lcd, però non ho spazio nel display... Allora pensavo di scriverla sul server dove vengono trasmessi i dati, visto che sono in possesso dell'ethernet shield e già più o meno ho fatto una pagina con tanti dati http://www.lineameteo.it/files/images/1789/immagine_1450610590_972162.png

Puoi usare una struct per aggregare valore e momento della misura:

struct TimedTemperature {
  int temp;
  time_t time;
};

TimedTemperature min = {0}, max = {0};

void loop () {
  // In qualche modo leggi la temperatura attuale
  int temp = getTemp ();

  if (temp > min.temp) {
    min.temp = temp;
    min.time = now ();   // Dove questa è una funzione che ti dà l'ora attuale

    // Puoi anche scrivere l'intera struct in EEPROM
    EEPROM.put (0, min);
  }

  // Idem per il max
}

Se usi la EEPROM, nel setup caricherai i valori salvati di min e max con EEPROM.get().

Capisco, però ho provato e mi dà sempre zero l'orario, e là dove tu scrivi min.time, non posso scriverci un dato float mi dice, visto che la temperatura minima è un float. Dove è che sbaglio?

Beh, cambia temp da int a float.

Come ottieni l'orario corrente?

Allora nel setup metto setSyncProvider(RTC.get); e poi scrivo l'ora sul display, scrivendo semplicemente tipo: tft.print(hour()); e così via per minuti secondi giorni etc perché rtc now non mi faceva con questo ds3231

RTC.now() ritorna un time_t che, senza entrare nei dettagli, rappresenta un istante "completo", cioé giorno + mese + anno + ora, non solo l'ora. Per fare quanto stiamo discutendo è la funzione ideale per riempire la stuct di cui sopra.

Per stampare un time_t in modo sensato, la libreria Time mette a disposizione la funzione breakTime(), che la converte in una struttura con tutti gli elementi separati:

tmElements_t t;
breakTime (max.time, t);
Serial.print ("Temperatura massima raggiunta alle ")
Serial.print (t.Hour);
Serial.print (":");
Serial.println (t.Minute);

Grazie SUkko ci sono riuscito :wink: Le ho salvate pure nella eeprom.h… Comunque adesso se volessi farlo per tutti questi valori? xd devo creare altre molteplici struct? Come si fa?

Sembra che siano tutti float, per cui dovresti poter riutilizzare sempre questa struttura, magari cambiale solo il nome in qualcosa di non legato alla temperatura, visto che ora diventa "universale" ;).

Si l’ho fatto e anche se non utilizzo almeno per ora il template, ho fatto la grafica così che è molto meglio, occupa un po’ ma il mega ce la fa :wink: