devbis / z03mmc

Xiaomi LYWSD03MMC Zigbee Firmware
GNU General Public License v3.0
939 stars 46 forks source link

Slow down the internal timer #21

Closed Nab0y closed 1 year ago

Nab0y commented 1 year ago

I suggest slowing down the internal timer by a factor of six. Personally, it won't make much of a difference for me whether the screen refreshes every 10 seconds or every minute. I don't experience sharp temperature fluctuations, and as a short practice has shown, the sensors don't react that quickly either. The benefits of this approach are much greater: fewer sensor queries, fewer value calculations, screen updates, and, as a result, reduced energy consumption.

I've assembled a test version for myself, and while I only have limited statistics for half a day, the battery consumption graph already looks more optimistic than it did before the changes.

Предлагаю замедлить внутренний таймер в шесть раз. Лично для меня не большая разница будет экран обновляться раз в 10 секунд или раз в минуту, таких резких перепадов температуры у меня нет, да и как показала недолгая практика сами датчики так быстро не реагируют. А пользы от такого решения намного больше, меньше опросов датчиков, меньше расчетов значений, обновлений экрана, как следствие меньше потребление энергии. Я собрал себе тестовую версию, статистики пока мало всего пол суток, но график потребления батареи уже выглядит более оптимистично, чем было до изменений. image image

My report settings are as follows image

pvvx commented 1 year ago

10 секунд иногда уже много, для возможности удерживать температуру с гистерезисом в 0.1С, а также для любых PID регуляторов. Обновление экрана не занимает времени и энергии на столько, что стоит заботиться. Это сотые процента от общего потребления. Проблемы только у версии LYWSD03MMC с контролером экрана на UART. Но они более не продаются. А вот полное отключение экрана (контроллера LCD) дает падение потребления в режиме сна чипа более чем в два раза. Типа 6..9 мкА (зависит от чипа) с включенным контроллером LCD и до 2-х мкА при выключенном.

Потребление сильнее зависит от типа датчика. Cтарые - SHTC3 (SHTV3) требуют задать команду пробуждения и измерения и ожидать от 6 мс до выполнения, затем переключать в режим сна. А в данной версии код не оптимизирован по потреблению и всё время ожидания молотит процессором на повышенной частоте, вместо сна, пожирая ток к 5 мА. См. диаграммы...

Так-же необходимо синхронизовать циклы опроса датчика и обновления экрана с таймингом процессов Zigbee. Лишнее "просыпание" SoC кушает в десятки (может и сотни) раз больше, чем отработка обновления LCD с опросом датчика SHT4x. А уж соотношение затрачиваемой энергии на передачу и прием в Zigbee вообще не сравнить с датчиком и обновлением LCD...

Правильной оптимизацией является только один вариант – когда SoC пробуждается исключительно для цикла приема-передачи и во время них делает все остальные дела, т.к. RF работает со своими FIFO-DMA и IRQ.


Сравнение показаний BLE и Zigbee устройств при одинаковом потреблении и дальности связи:

image

Т.е. нужно дорабатывать версию Zigbee до уровня передачи не менее 1 замера в 10 сек.

Nab0y commented 1 year ago

@devbis After the update 1.0.4, energy consumption has been normalized, and I think we can close this task as unnecessary.