Hiện tại tôi đang phát triển một hệ thống LCD đồ họa để hiển thị nhiệt độ, dòng chảy, điện áp, năng lượng và năng lượng trong hệ thống bơm nhiệt. Việc sử dụng màn hình LCD đồ họa có nghĩa là một nửa SRAM của tôi và ~ 75% đèn flash của tôi đã được sử dụng bởi bộ đệm màn hình và chuỗi.
Tôi hiện đang hiển thị số liệu tối thiểu / tối đa / trung bình cho năng lượng Vào nửa đêm khi con số hàng ngày đặt lại, hệ thống sẽ kiểm tra xem mức tiêu thụ trong ngày cao hơn hoặc thấp hơn mức tối thiểu hoặc tối đa trước đó và lưu trữ giá trị. Trung bình được tính bằng cách chia mức tiêu thụ năng lượng tích lũy cho số ngày.
Tôi muốn hiển thị trung bình hàng ngày trong tuần và tháng trước (4 tuần cho đơn giản) tức là trung bình cán. Hiện tại, điều này liên quan đến việc duy trì một mảng các giá trị trong 28 ngày qua và tính trung bình trên toàn bộ mảng cho hàng tháng và 7 ngày cuối tuần.
Ban đầu tôi đã thực hiện việc này bằng cách sử dụng một mảng số float (vì năng lượng ở dạng "12.12kWh"), nhưng điều này đã sử dụng 28 * 4 byte = 112 byte (5,4% SRAM). Tôi không ngại chỉ có một độ phân giải thập phân duy nhất, vì vậy tôi đã đổi sang sử dụng uint16_t và nhân số đó với 100. Điều này có nghĩa là 12.12 được biểu thị là 1212 và tôi chia cho 100 cho mục đích hiển thị.
Kích thước của mảng hiện giảm xuống còn 56 byte (tốt hơn nhiều!).
Không có cách tầm thường nào để giảm con số xuống uint8_t mà tôi có thể thấy. Tôi có thể chấp nhận mất vị trí thập phân ("12.1kWh" thay vì "12.12kWh"), nhưng mức tiêu thụ thường cao hơn 25,5kWh (255 là giá trị cao nhất được biểu thị bằng số nguyên không dấu 8 bit). Tiêu thụ chưa bao giờ dưới 10,0kWh hoặc trên 35,0kWh, vì vậy có thể hình dung tôi có thể trừ 10 từ các số liệu được lưu trữ, nhưng tôi biết rằng một ngày nào đó chúng ta sẽ vượt quá các giới hạn này.
Sau đó tôi đã kiểm tra mã để đóng gói các giá trị 9 bit vào một mảng. Điều này cho phạm vi 0-51.2kWh và sử dụng tổng cộng 32 byte. Tuy nhiên, việc truy cập vào một mảng như thế này khá chậm, đặc biệt là khi bạn phải lặp lại tất cả các giá trị để tính trung bình.
Vì vậy, câu hỏi của tôi là - có cách nào hiệu quả hơn để tính trung bình di chuyển với ba cửa sổ - trọn đời, 28 ngày và 7 ngày? Hiệu quả có nghĩa là nhỏ hơn về việc sử dụng SRAM, nhưng không bị phạt bởi mã lớn. Tôi có thể tránh lưu trữ tất cả các giá trị?