Attualmente sto sviluppando un sistema LCD grafico per visualizzare temperature, flussi, tensioni, potenza ed energia in un sistema a pompa di calore. L'uso di un LCD grafico significa che metà del mio SRAM e ~ 75% del mio flash sono stati utilizzati da un buffer dello schermo e da stringhe.
Attualmente sto visualizzando i dati min / max / medi per l'energia A mezzanotte quando la cifra giornaliera viene ripristinata, il sistema controlla se il consumo per il giorno è superiore o inferiore al minimo o massimo precedente e memorizza il valore. La media viene calcolata dividendo il consumo cumulativo di energia per il numero di giorni.
Vorrei visualizzare la media giornaliera nell'ultima settimana e mese (4 settimane per semplicità), ovvero una media mobile. Attualmente ciò comporta il mantenimento di un array di valori per gli ultimi 28 giorni e il calcolo di una media sull'intero array per mensili e gli ultimi 7 giorni per settimanali.
Inizialmente stavo facendo questo usando una matrice di float (dato che l'energia è nella forma "12.12kWh"), ma questo stava usando 28 * 4 byte = 112 byte (5,4% di SRAM). Non mi dispiace avere un solo punto decimale di risoluzione, quindi ho cambiato usando uint16_t e moltiplicando la cifra per 100. Ciò significa che 12.12 è rappresentato come 1212 e divido per 100 a scopo di visualizzazione.
La dimensione dell'array è ora ridotta a 56 byte (molto meglio!).
Non c'è modo banale per ridurre la cifra a uint8_t che posso vedere. Potrei tollerare la perdita di un decimale ("12,1 kWh" invece di "12,12 kWh"), ma il consumo è spesso superiore a 25,5 kWh (255 è il valore più alto rappresentato da un numero intero senza segno a 8 bit). Il consumo non è mai stato inferiore a 10,0 kWh o superiore a 35,0 kWh, quindi è possibile che io possa sottrarre 10 dalle cifre memorizzate, ma so che un giorno supereremo questi limiti.
Ho quindi testato il codice per comprimere i valori a 9 bit in un array. Ciò fornisce un intervallo compreso tra 0 e 51,2 kWh e utilizza 32 byte in totale. Tuttavia, l'accesso a un array come questo è piuttosto lento, specialmente quando devi calcolare tutti i valori per calcolare una media.
Quindi la mia domanda è: esiste un modo più efficiente di calcolare una media mobile con tre finestre: durata, 28 giorni e 7 giorni? Efficienza significa minore in termini di utilizzo di SRAM, ma senza la penalità di un codice enorme. Posso evitare di memorizzare tutti i valori?