Считывание счетчика воды по WiFi на Wemos D1 mini (esp8266) под Arduino IDE

Тема в разделе "Глядите, что я сделал", создана пользователем Slacky, 22 ноя 2017.

  1. Slacky

    Slacky Гик

    Напишу и сюда, потому что этот форум помогал мне в качестве справочного материала тоже :)))

    По большому счету, как потом выяснилось, реализаций такого рода устройств множество. Потому можно сказать, что я изобрел очередной велосипед :)))

    Предыстория.

    Решил я поискать решения для дистанционного снятия счетчиков воды по WiFi. Набрел на пару уже готовых решений, но , во-первых дороговато, во-вторых - все равно это нечто "самодельное".

    На одном форуме (что-то типа cyber-place) админ что-то такое сделал, но проект у него был коммерческий, да на тот момент он что-то не спешил продать готовое устройство (хотя ценник был уже более гуманный, но я так понял, что все еще макетка, а не готовое устройство).

    Теперь о проекте.

    Сделано на базе Wemos D1 mini. Также понадобятся шилды зарядки батареи (нужно доработать, припаяв сопротивление порядка 12 кОм между входным напряжением +5в и пином D0) и SD-карты от этого же производителя. И АКБ, типа 18650.

    Поначалу было сделано аппаратное устранение дребезга контактов (так мне было проще) на микросхеме 74LVC14AD.118. Но система работала плоховато и все равно дребезг полностью не устраняла. Поэтому было переделано на MC14490. Но потом выяснилось что и специализированная микросхема не спасает (ну или у меня руки кривые) полностью и за длительный период счетчик все равно убегает вперед. Потому код был изменен - был написан кусок устраняющий дребезг программно.

    Есть web-интерфейс для вывода показаний, настройки и заливки кода для обновления ...

    Конфиг записывается или на SD (если есть) или во флэш.

    Данные отсылаются на mqtt сервер, где mqttwarn их складывает в базу sqlite3 (ну не сам конечно, а с помощью скрипта на Perl). mqttwarn в процедуре execute пришлось немного доработать, добавив одну строку, чтобы топик передавался вторым аргументом.

    При пропадании внешнего питания модуль переходит в режим light_sleep с малым потреблением. При восстановлении питания и при очередном срабатывании счетчика, модуль просыпается и работает в штатном режиме. Если в режиме сна питание не восстановилось, то при срабатывании счетчика это учитывается и модуль опять засыпает.

    Наваял еще пару php и html, чтобы можно было статистику смотреть не на самом устройстве, а на сервере, куда данные отсылаются. За день, за месяц и за год.

    На самом устройстве можно просто посмотреть кол-во куболитров [​IMG], например вот - http://watermeter.slacky.ru/

    Сервер у меня локально крутится на Debian 9.

    Все подробности тут - https://github.com/slacky1965/watermeter

    Собранная плата без АКБ.

    [​IMG]

    Конфиг

    [​IMG]

    Статистика на локальном http сервере из базы sqlite

    [​IMG]
    Не программист ни разу, это так, хобби.

    Готов ответить на вопросы, если таковые будут.
     
    Bor2121 и Tomasina нравится это.
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Насколько хватает аккумулятора?
     
  3. Slacky

    Slacky Гик

    АКБ - 2600 mAh. При включенном WiFI потребление на USB-амперметре показывало 0.06А, при выключении WiFi - 0.01А, то в light-sleep он показывает 0.00А, т.е. он уже не может измерить такой мелкий ток. Из документов esp8266 в режиме light_sleep потребляет от 0.4 mA до 1.8 mA. Считайте.

    Но АКБ был прикручен не в целях питания от него, а в целях пережить кратковременное отключение электричества в московской квартире ...
     
  4. Bor2121

    Bor2121 Нуб

    Доброго дня, мечтал все начать Ардуинку осваивать... решил на вашем проекте попробовать. Спасибо вам за труды..
    Не подскажете 2 простых вопроса, все скетчи из вашего проекта компилятся и заливаются одновременно? ТО есть открыты 10шт и при нажатии Загрузить, все 10 компилятся и прошиваются?
    Различные однолистиговые вещи вроде получилось, а тут смутил проект с 10 листами... или как-то доработать напильником как то доработать надо?
     
  5. parovoZZ

    parovoZZ Гуру

    Боишься нажать на кнопку компилировать и посмотреть?
    Все листы со ссылками друг на друга собираются линковщиком и компилятся одновременно.
     
  6. Bor2121

    Bor2121 Нуб

    Нет, я все попробовал, мне уточнить просто хотелось. Я же только начинаю. И не совсем пока понимаю фидбека от этих устройств. Уже попробовал, и на порту вижу реакцию. Но ка кто не всегда... Просто мне китайцы прислали немного другую плату питания... и на ней уже распайка другая... попробую собрать. Элементы даже распаяны другие и по другому.
     
  7. Slacky

    Slacky Гик

    Это не 10 скетчей, это все один. Просто разбит на разные файлы для удобства восприятия написанного ...
     
  8. Bor2121

    Bor2121 Нуб

    Огромное спасибо, теперь понял, просто не сталкивался ;)
    А можно по монтажу пару вопросов?
     
  9. Slacky

    Slacky Гик

    Попробуйте, но не факт что я смогу ответить :)
     
  10. Bor2121

    Bor2121 Нуб

    Очень простые вопросы ;-)
    Микросхема от дребезга припаивается всеми выводами к площадке или только нужными в схеме ? А остальные контакты изолировать от площадки? ;)
    Ну и физически счетчики подключить нужно к выводам S1 и S2 а вторые провода счетчиков на 8 ногу? D1 и D2 это контакты к плате питания?
     
  11. Slacky

    Slacky Гик

    В общем-то да. Но в последней версии, что на хитхабе лежит, я убрал микросхему подавления и сделал все программно.
     
  12. Bor2121

    Bor2121 Нуб

    Но там в схеме она присутствует ;) а как тогда изменится обвязка под BatterySheild ? ;-)
     
  13. Slacky

    Slacky Гик

    Обвязка под batterySheild никак не изменится, так как одно к другому не относится ...

    Да и вообще, реализация устранения дребезга контактов по прерываниям та еще задача (во всяком случае для меня). Нашел интересный алгоритм устранения дребезга - http://embedders.org/blog/gdi/debouncing.html Но он основан на таймерном опрашивании состояния пинов. Но под Ардуиной это все не завелось, так как после выходда из режима Light_Sleep таймер перестает работать. А повторный запуск таймера приводит к исключению.

    Поэтому сейчас весь проект переписывается на UDK и исключительно на SDK. Но там свои заморочки ...
     
    Последнее редактирование: 27 апр 2018
  14. Bor2121

    Bor2121 Нуб

    Я имел в виду обвазка вокруг микрухи, она остаётся в схеме, несмотря на устранение дребезга программно ? У меня еще и Баттери Шилд другая, не соображу куда 12ком там подпаять... на моей даже детали другие.
    А конфиг на карту памяти - это папка CONFIG ? Карты памяти на 1-2Гб поддерживается ?
     
  15. SergeiL

    SergeiL Оракул Модератор

    Давно использую только данный вариант устранения дребезга, ничего лучше не видел.
    Работает надежно быстро и код компактен.
    Даже как то тему создал здесь :). Но...
    А зачем Вам Light_Sleep?
    Вы же пишите, что аккумулятор у Вас только для кратковременных прерываний электричества.
     
  16. Slacky

    Slacky Гик

    Да не нужна обвязка, а два конца счетчика кинуть так - один на массу, второй в D1. Ну и соответственно второй так же, только на D2.
    Про конфиг не очень понял, карту испытывал 8 гиг ...
     
  17. Bor2121

    Bor2121 Нуб

    То есть микруху от дребезга совсем убираем с шилда вместе с конденсатором ?
    "Конфиг записывается или на SD (если есть) или во флэш." - вот про это... Какой КОНФИГ и в какую ФЛЭШ ? ;-)))
    А на карту он в логах что должен сказать? И что на ней должно создаться? ;)

    Пардон за нубские вопросы, просто не все пояснения и схемы сходу понятны, жуть как интересно все это освоить ;-)
     
  18. SergeiL

    SergeiL Оракул Модератор

    Если выключать только Wi-Fi, при отключении электроэнергии, Вы пишите что потребление равно 0,01А.
    Посчитаем время автономной работы: 2,6/0,01/24 = 10,8 дней :)
    И таймер будет нормально работать.
     
  19. Slacky

    Slacky Гик

    Да, все убираем и кондер тоже. Про конфиг - сохраняется на карте а папке wmeter с именем wmeter.dat. Описан в watermeter.ino
    Код (C++):
    /* Directory and name of config files for SD card */
    #define DELIM "/"
    #define WM_DIR DELIM "wmeter"                    /* Drirectory for config file        - "/wmeter"             */
    #define WM_CONFIG_FILE WM_DIR DELIM "wmeter.dat" /* Full path and name of config file - "/wmeter/wmeter.dat"  */
     
    Создавать специально ничего не нужно, заполните форму конфиг через вебброузер, вот эти данные и сохранятся ...
     
  20. Slacky

    Slacky Гик

    Ну во первых можно поставить какой-нибудь малый АКБ, да и вообще это правильно, при пропадании внешнего питания убирать лишние источники потребления ...