karnhack:
Ora provando a scrivere sulla ram dell'RTC richiamando la libreria WIRE....
....
Wire.beginTransmission(0x68); //attiva la comunicazione con il DS1307 all'indirizzo RTC 0x68
Wire.write((byte)0x00); //il primo byte stabilisce il registro iniziale da scrivere i SECONDI da 0x00 a 0x59
Wire.write((byte)0x10); //il secondo byte specifica il tempo MINUTI da 0x00 a 0x59
Wire.write((byte)0x80 | 0x10); //il terzo byte specifica il tempo da 0x00 a 0x24
Wire.endTransmission();
Manca il byte di indirizzamento:
Wire.beginTransmission(0x68); //attiva la comunicazione con il DS1307 all'indirizzo RTC 0x68
Wire.write((byte)0x00); //il primo byte stabilisce il registro iniziale su cui scrivere
Wire.write((byte)0x00); //il secondo specifica i SECONDI da 0x00 a 0x59 (scritti nel registro 0)
Wire.write((byte)0x10); //il terzo byte specifica i MINUTI da 0x00 a 0x59 (scritti nel registro 1)
Wire.write((byte)0x80 | 0x10); //il quarto byte specifica le ORE da 0x00 a 0x24 (scritte nel registro 2)
Wire.endTransmission();
La libreria RTClib accede all'RTC usando la WIRE esattamente come stai provando a fare, ma permette un accesso a livello più alto (leggi comodo) senza doversi occupare dei registri dell'RTC e della conversione BCD dei valori. In altre parole i valori nell'RTC sono memorizzati in formato BCD, e se non si effettua una conversione alle 20 leggi 32, alle 12 leggi 18 ecc.
Mi è venuta in mente l'EEPROM ma io ignoro il 99% delle vie possibili quindi può essere una stupidaggine bella e buona usarla
Se serve mantenere un'informazione anche in caso di mancanza alimentazione/reset non solo è una buona idea ma anche indispensabile. Poi come emerso successivamente l'RTC ha anche lui uno spazio utile (56 byte di RAM) per salvare qualche dato utente. E a seconda del modulino RTC può esserci anche un'ulteriore EEPROM esterna, quindi posti dove salvare le cose ce ne sono in esubero
Ma allora oltre a un semplice orario va salvata anche qualche informazione sulla fase in corso, in modo che all'accensione/reset la si possa rileggere e riconoscere, per scegliere il comportamento opportuno.
maubarzi:
vorrei tornare sulla struttura di base per cercare di fare un po' di ordine, in primis, nella mia testa.
Mi sono un po' perso anch'io... nel senso che non mi è più totalmente chiara la sequenza (se non sbaglio le 24 ore si dovrebbero aspettare solo al primissimo giro), e non è ancora chiaro come gestire il momento di concimazione più o meno in corrispondenza dell'irrigazione, avevo pensato a una cosa del genere... che prevede anche dei rabbocchi se il bidone perde un po'...
case RIPOSO:
if (tempo_di_concimare()) { fase = CONCIMAZIONE; }
else if (ora_di_irrigare()) { fase = IRRIGAZIONE; }
else if (!troppo_pieno()) { fase = RIEMPIMENTO; }
break;
Poi per contare i tempi delle fasi avevo pensato a una funzione 'trascorso'...
bool trascorso(unsigned long secondi)
{
return (millis() - inizio) >= (secondi * 1000);
}
...e "ricaricare" il tempo in 'inizio' ogni volta che la fase cambia, quindi appena dopo lo switch:
// ricarica tempo se fase cambiata
if (fase != fase_prec) { fase_prec = fase; inizio = millis(); }
Dopo di che nelle fasi si può controllare il tempo semplicemente con:
if (trascorso(TEMPO_CONCIMAZIONE)) ...
Da notare poi che ragionando per fasi non serve neppure scrivere le varie digitalWrite nei case o nelle funzioni, perché le fasi corrispondono già ai relé da accendere.... nella fase irrigazione acceso solo il relé pompa, in quella riposo nessuno ecc. Quindi le digitalWrite si possono mettere tutte alla fine... se si usa il bistrattato ternario sono quattro righe di numero.