Actuellement, je développe un système LCD graphique pour afficher les températures, les débits, les tensions, la puissance et l'énergie dans un système de pompe à chaleur. L'utilisation d'un écran LCD graphique signifie que la moitié de ma SRAM et ~ 75% de mon flash ont été utilisés par un tampon d'écran et des chaînes.
J'affiche actuellement des chiffres d'énergie min / max / moyenne À minuit, lorsque le chiffre journalier est réinitialisé, le système vérifie si la consommation pour la journée est supérieure ou inférieure au minimum ou au maximum précédent, et enregistre la valeur. La moyenne est calculée en divisant la consommation d'énergie cumulée par le nombre de jours.
Je voudrais afficher la moyenne quotidienne de la dernière semaine et du dernier mois (4 semaines pour plus de simplicité), c'est-à-dire une moyenne mobile. Actuellement, cela implique de maintenir un tableau de valeurs pour les 28 derniers jours et de calculer une moyenne sur l'ensemble du tableau pour les mois et les 7 derniers jours pour les semaines.
Au départ, je faisais cela en utilisant un tableau de flotteurs (car l'énergie est sous la forme "12.12kWh"), mais cela utilisait 28 * 4 octets = 112 octets (5,4% de SRAM). Cela ne me dérange pas d'avoir une seule décimale de résolution, j'ai donc changé en utilisant uint16_t et en multipliant le chiffre par 100. Cela signifie que 12,12 est représenté par 1212 et que je divise par 100 à des fins d'affichage.
La taille du tableau est désormais réduite à 56 octets (bien mieux!).
Il n'y a aucun moyen trivial de réduire le chiffre à un uint8_t que je puisse voir. Je pouvais tolérer la perte d'une décimale ("12,1 kWh" au lieu de "12,12 kWh"), mais la consommation est souvent supérieure à 25,5 kWh (255 étant la valeur la plus élevée représentée par un entier non signé 8 bits). La consommation n'a jamais été inférieure à 10,0 kWh ou supérieure à 35,0 kWh, donc je pense que je pourrais soustraire 10 des chiffres stockés, mais je sais qu'un jour nous dépasserons ces limites.
J'ai ensuite testé du code pour emballer des valeurs 9 bits dans un tableau. Cela donne une plage de 0 à 51,2 kWh et utilise au total 32 octets. Cependant, l'accès à un tableau comme celui-ci est assez lent, surtout lorsque vous devez parcourir toutes les valeurs pour calculer une moyenne.
Ma question est donc - existe-t-il un moyen plus efficace de calculer une moyenne mobile avec trois fenêtres - durée de vie, 28 jours et 7 jours? L'efficacité signifie moins en termes d'utilisation de SRAM, mais sans la pénalité d'un code énorme. Puis-je éviter de stocker toutes les valeurs?