Кажется, я пофиксил проблему с подсчетом расхода воды. Заценить можно тут: https://github.com/lan143/navier/commit/7c1c6647900e8ee8b0bde137e6d8f843135dd3c0
Собственно, как я это сделал. Я решил, что зачем изобретать велосипед, пойду да посмотрю как это делает Ватериус. Благо он опенсурс. В коде его конечно черт ногу сломит. Особенно не очень хотелось курить даташит по attiny85 чтобы понять что там происходит (ибо по коду там вовсю всякие регистры процессора юзаются). Поэтому я решил погуглить, вдруг есть какое-то описание его работы на хабре. И таки я нашел, вот эту статью: https://habr.com/ru/articles/418573/ Судя по всему она была написана еще на первых версиях Ватериуса, когда он не поддерживал всякие намуры, и реализация считывания данных с счетчика там просто гениальная: просто каждые 250 мс проверяем состояние пина. Если он притянут к земле, то еще раз проверим через 250 мс (вдруг словили наводку), и если он так же притянут к земле, то считаем что замкнулся геркон в счетчике и плюсуем 10 литров. Блин, почему я до такого не додумался) Я начал изобретать с прерываниями и все такое. Случился короч оверинжиринг.
Дальше читать не стал, идея понятна, осталось реализовать. Я сразу доработал идею, что когда мы плюсуем 10 литров, после блокируемся до следующего поднятия пина на плюс питания. И тут возникает интересная ситуация: если вдруг счетчик остановился в момент когда геркон замкнут, и потом случилась перезагрузка контроллера, то после загрузки флаг блокировки сбросится и мы опять приплюсуем 10 литров лишние. И так будет каждую перезагрузку. Сначала я подумал, что ну чо там, редкое событие. Но, когда отлаживал код, у меня счетчик как раз встал на показании 0 литров, и каждую перезагрузку у меня было +10 литров)) Штош, надо пилить сохранение флага))
Решил сделать по простому: когда записываем показания в кольцевое хранилище, к текущим значениям выставим 1 самый левый бит в 1, в случае если есть блокировка. Затем, когда блокировка была снята, запишем еще раз значение в кольцевое хранилище, но на этот раз без крайнего бита в 1. Далее при загрузке мы можем восстановить информацию о блокировке и не делать +10 литров. Идеально вроде. Это я собственно реализовал, проверил, все отлично работает.
Кто-то может сказать, что, ну мол, ты ж теперь сможешь меньше кубов воды хранить. Но, спешу вас обрадовать - для хранения показаний у меня используется переменные типа uint32, а это 32 бита. Один бит мы отдали под флаг блокировки, получается что для показаний у нас осталось 31 бит. Максимальное значение, что мы сможем туда сохранить, будет 2 в 31ой степени - 1. А это: 2147483647 литров, или 2147483 кубометров. Что-то мне подсказывает, что такого хранилища хватит не только до конца жизни esp32 (в которой флешка сдохнет спустя 100к перезаписей) но и до конца моей тоже.
Так вот, новая версия задеплоена, будет наблюдать. Но я очень надеюсь, что все будет в порядке и этот гештальд можно будет считать закрытым. Ладно, пойду спать, до связи)
