programmazione settimanale cronotermostato

Salve a tutti,
mi piacerebbe per diletto realizzare un cronotermostato con arduino mega, e sto facendo un po' di brain storming sulla programmazione delle temperature giornaliere, in quanto è il pensiero maggiore al momento.

L'idea è quella di avere 3 temperature programmabili all'interno della giornata con salti di 30 minuti:

  • T1 = temperatura della casa a regime (quindi quando si sta a casa, es: 20°)
  • T2 = temperatura della casa di mantenimento, quando praticamente non c'è nessuno (es: 17°)
  • T3 = temperatura minima della casa (es: 4°) sotto la quale non deve mai scendere (utilizzabile anche come caldaia spenta)

2 programmazioni settimanali configurabili

per fare ciò, stavo pensando di utilizzare, 3 float per ogni programma dove salvo T1, T2 e T3 ed un array per ogni programma per ogni giorno della settimana di 48 float per contenere le temperature desiderate...

il problema è che l'array, che salverei poi nell'eeprom, sarebbe di 4 byte (float) * 48 (le "mezz'ore" del giorno) * 7 (giorni della settimana) * 2 (programmi) =2688 Byte

a questo dovrei aggiungere qualche libreria che utilizza il progmem che se non sbaglio appoggia i dati nella eeprom (in che posizione? rischio l'accavallassi con i miei dati?), qualche altro dato come t1, t2 e t2 sempre di tipo float, ho timore che inizio a starci un po' stretto...

In primo luogo avevo pensato di farmi una bitfield, ma avendo T1, T2 e T3 starei decisamente stretto, potrei però fare una bitfield per ogni temperatura e per ogni giorno, quindi avrei:
3 (bit per T1, T2 e T3) * 48 (le "mezz'ore" del giorno) * 7(giorni della settimana) * 2 (programmi) = 2016 bit/8 = 252 Byte

Vorrei chiedervi: quale metodo è preferibile secondo voi? Conoscete alternative?

grazie 1000

ciao

Ma perché sprecare un float per memorizzare una temperatura quando basta un byte?

Se T1, T2 e T3 sono sempre le stesse non devi memorizzare ogni mezz'ora la temperatura voluta ma solo quale delle 3 che vuoi.

Per usare meno memoria possibile ti bastato 6 byte (48 bit) dove ogni bit rappresenta mezz'ora e ti dice se la (ad esempio) T1 è "attiva".
ad esempio:

00000000-00000000-001111111-11111111-00000000-000000

leggilo da sinistra a destra: ogni mezz'ora leggi il bit che ti dice che T1 è attiva o no.

In questo modo ti serve 1 byte per memorizzare la temperatura voluta e 42 byte (6 * 7 giorni) per il programma settimanale.
Moltiplica per 3 temperature possibili e 2 programmi settimanali fanno 258 byte.

ciao
pippo72

pippo72:
ciao

Ma perché sprecare un float per memorizzare una temperatura quando basta un byte?

Se T1, T2 e T3 sono sempre le stesse non devi memorizzare ogni mezz'ora la temperatura voluta ma solo quale delle 3 che vuoi.

Per usare meno memoria possibile ti bastato 6 byte (48 bit) dove ogni bit rappresenta mezz'ora e ti dice se la (ad esempio) T1 è "attiva".
ad esempio:

00000000-00000000-001111111-11111111-00000000-000000

leggilo da sinistra a destra: ogni mezz'ora leggi il bit che ti dice che T1 è attiva o no.

In questo modo ti serve 1 byte per memorizzare la temperatura voluta e 42 byte (6 * 7 giorni) per il programma settimanale.
Moltiplica per 3 temperature possibili e 2 programmi settimanali fanno 258 byte.

ciao
pippo72

grazie 1000 pippo72, era quello che avevo provato a spiegare (l'avevo spiegato veramente da cani!!!) nella soluzione a 252 byte però non capisco come salvare una temperatura tipo 20.5 in un byte... siccome come precisione mi basterebbe il mezzo grado, potrei utilizzare il segno - per indicarlo:

char temperatura=20;
if (temperatura>0){
   printf("temperatura=%d", temperatura;
}else{
  printf("temperatura=%d, temperatura+.5);
}

come ti sembra?

Ciao
In un byte puoi salvare un nunero da 0 a 255.
Ma se tu quel numero lo dividi per 2.0 ?
La temperatura 22,5 corrisponde all'intero 45 ecc.
Te lo gestisci a livello di sketch

Ciao
pippo72

pippo72:
Ciao
In un byte puoi salvare un nunero da 0 a 255.
Ma se tu quel numero lo dividi per 2.0 ?
La temperatura 22,5 corrisponde all'intero 45 ecc.
Te lo gestisci a livello di sketch

Ciao
pippo72

sei un grande! Non c'avevo minimamente pensato! Nel w.e. abbozzo un po' di codice... per salvare sulla eeprom, pensi che potrei utilizzare eeprom.put/eeprom.get e passarli la typedef della bitfield? Non l'ho mai utilizzata...

Sarò anche un grande ma ci ho messo 5 minuti per capire il significato di w.e. :confused:
Per il resto non ho mai usato la eeprom, non ti saprei dire.

Ciao
Pippo72