Atualmente, estou desenvolvendo um sistema LCD gráfico para exibir temperaturas, fluxos, tensões, potência e energia em um sistema de bomba de calor. O uso de um LCD gráfico significa que metade da minha SRAM e ~ 75% do meu flash foram usadas por um buffer de tela e seqüências de caracteres.
Atualmente, estou exibindo valores mínimo / máximo / médio para energia À meia-noite, quando o valor diário é redefinido, o sistema verifica se o consumo do dia está acima ou abaixo do mínimo ou máximo anterior e armazena o valor. A média é calculada dividindo o consumo acumulado de energia pelo número de dias.
Gostaria de exibir a média diária da última semana e mês (4 semanas por simplicidade), ou seja, uma média móvel. Atualmente, isso envolve a manutenção de uma matriz de valores nos últimos 28 dias e o cálculo da média de toda a matriz nos meses mensais e nos últimos 7 dias na semana.
Inicialmente, eu fazia isso usando uma matriz de flutuadores (como a energia está na forma "12,12kWh"), mas isso estava usando 28 * 4 bytes = 112 bytes (5,4% da SRAM). Não me importo de ter apenas um único ponto decimal de resolução, então mudei para usar uint16_t e multiplique o número por 100. Isso significa que 12.12 é representado como 1212 e divido por 100 para fins de exibição.
O tamanho da matriz agora está reduzido a 56 bytes (muito melhor!).
Não há uma maneira trivial de reduzir a figura para um uint8_t que eu possa ver. Eu pude tolerar a perda de uma casa decimal ("12,1 kWh" em vez de "12,12 kWh"), mas o consumo geralmente é superior a 25,5 kWh (255 é o valor mais alto representado por um número inteiro não assinado de 8 bits). O consumo nunca ficou abaixo de 10,0kWh ou acima de 35,0kWh, então é possível subtrair 10 dos números armazenados, mas sei que um dia excederemos esses limites.
Testei o código para compactar valores de 9 bits em uma matriz. Isso fornece um intervalo de 0 a 51,2 kWh e usa 32 bytes no total. No entanto, acessar uma matriz como essa é muito lento, especialmente quando você precisa iterar sobre todos os valores para calcular uma média.
Então, minha pergunta é: existe uma maneira mais eficiente de calcular uma média móvel com três janelas - vida útil, 28 dias e 7 dias? Eficiência significa menor em termos de uso de SRAM, mas sem a penalidade de um grande código. Posso evitar armazenar todos os valores?