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

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

  1. Bor2121

    Bor2121 Нуб

    Доброго дня!
    Тут : s =""; в кавычках?
    тогда будет формироваться 2 сообщения в сторону MQTT, То что я впишу и второе ваше, предусмотренное скетчем?
    В Домотиксе счетчик как бы тупее вашего проекта ;) Он учитывает импульс, то есть каждые 10 литров(условно) ему отправляется 10, потом 10 и он уже сам собирает данные. Ему не нужны количества. ;-)
     
  2. Slacky

    Slacky Гик

    s="" и последующие s+= заменяете на Ваше.

    Например
    Код (C++):
    s = "\"idx\" : 3, \"name\" : \"Cold_Water\", \"svalue\" : \"10\"";
    Т.е. примерно будет выглядеть так

    Код (C++):
    /* If counter of hot water was added */
      if (counterHotWater > 0) {
        wmConfig.hotTime = localTimeT();
        s ="\"idx\" : 2, \"name\" : \"Hot_Water\", \"svalue\" : \"10\"";
        if (DEBUG) {
          Serial.print(mqttTopicHotOut + " <== "); Serial.println(s);
        }
        if (mqttClient.connected()) mqttClient.publish(mqttTopicHotOut.c_str(),s.c_str());
        else saveConfig();
        counterHotWater = 0;
      }

      /* If counter of cold water was added */
      if (counterColdWater > 0) {
        wmConfig.coldTime = localTimeT();
        s ="\"idx\" : 3, \"name\" : \"Cold_Water\", \"svalue\" : \"10\"";
        if (DEBUG) {
          Serial.print(mqttTopicColdOut + " <== "); Serial.println(s);
        }
        if (mqttClient.connected()) mqttClient.publish(mqttTopicColdOut.c_str(),s.c_str());
        else saveConfig();
        counterColdWater = 0;
      }
    Но это не совсем корректно, если счетчик больше 1. Там нужно учесть, что если счетчик больше 1, например 2, то перердавать не 10 литров, а 20 и т.д
     
  3. Bor2121

    Bor2121 Нуб

    Скеч проверю как толь комп дома настрою специально под хобби ;-) Спасибо за помощь.

    "Но это не совсем корректно, если счетчик больше 1. Там нужно учесть, что если счетчик больше 1, например 2, то передавать не 10 литров, а 20 и т.д"

    Тут вот какое дело, я проверил работу счетчика в Домотиксе, отсылая фейковые сообщения на MQTT брокер с топиком dimoticz/in. сколько отправишь в сообщении столько виртуальный счетчик и плюсует в свою базу данных.
    То есть повторяя это сообщение на брокера:
    mosquitto_pub -h 127.0.0.1 -m '{ "idx" : 3, "name" : "Cold_Water", "svalue" : "10" }' -t 'domoticz/in' Домотикс видит это сообщение и инкрементный счетчик Домотикса копит эти данные и собирая статистику.
    И если я правильно понял инструкцию на свой водяной счетчик, то там обычный оборот "колёсика" принят за 10 литров. Вот и подумал, что Домотиксу достаточно отправлять расход по 10ке. А он уже сам накопит данные. (тут конечно если потеря связи или дургой катаклизм - то данные потеряются. Переписать ваш скетч для проверки данных в домотиксе и на карте памяти - это для меня совсем за гранью. Мне с этим то поразбираться некогда особо ;( а очень хочется.
    У вас же сделано очень по уму ;-) Учитываете разные моменты и тд. Еще с батарей поколдую - БаттериШилд как у вас продаётся только у одного китайса ;) попробую с ней, если пришлет.
     
  4. Slacky

    Slacky Гик

  5. Bor2121

    Bor2121 Нуб

    Именно! Уже жду со дня на день. и еще немного для других экспериментов. Где бы время взять только ;-)

    ЗЫ: Хотя нет, когда я заказывал - в ВЕМОСе не было такой.
    Жду из другого магаза. проверим.
     
  6. Bor2121

    Bor2121 Нуб

    Собрал,подключил, под Домотикс адаптировал. Смотрю литры бегут быстрее счетчика. И даже Горячие литры при использовании холодной ;-) Похоже не канает схема... У меня скорее всего цепь Намур в счетчиках. а не просто контакты ;(
     
  7. Slacky

    Slacky Гик

    Ну намур отличается только сопротивлением в цепи, которое падает в два раза при замыкании геркона. Если проводов два, то да, возможно и просто геркон, и намур. Если три, то можно реализовать обе схемы. В любом случае нужно смотреть спецификацию на счетчик или тупо измерить сопротивление между контактами ...
     
  8. Bor2121

    Bor2121 Нуб

    В моих счетчиках 2 провода, по паспорту так и есть - НАМУР. Как изменить схему наверно не соображу ;(
     
  9. Slacky

    Slacky Гик

    Ну можно попробовать так - измерить сопротивление разомкнутого и замкнутого состояния. В инете сходу нарвался на 5к6 при разомкнутом и 2к2 при замкнутом. Убрать внутреннюю подтяжку PULLUP (там вроде 12кОм) и подобрать сопротивление на ножку через +3.3v чтобы при разомкнутом четко читалась единица, а при замкнутом ноль.

    Все IMHO, так как я тоже специалист не очень :))
     
  10. AntonKos87

    AntonKos87 Нуб

    при компиляции выходит ошибка
    'prog_uint32_t' does not name a type
    у всех так?
    строка
    static PROGMEM prog_uint32_t crc_table[16] = {
    0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
    0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c
    };
    Arduino 1.8.7
     
  11. alsaut

    alsaut Нуб

    ага не скомпилиться так, поменяй на: PROGMEM const uint32_t crc_table[16] = ........
     
  12. Vampik

    Vampik Нуб

    Если кому надо, сделал несколько исправлений.
    • исправление ошибки компиляции, указанное выше.
    • исправление ошибки "ISR not in IRAM" при запуске прошивки скомпилированной с последними версиями платформы
    • исправление SD пина по умолчанию (на актуальных платах теперь это D4)
    • исправление имени хоста (обрезалось из-за подставления номера версии с точкой в нем)
    Также отключил проверку внешнего питания по умолчанию (как здесь уже заметили, зачем уходить в сон при питании от батареи, если все рассчитано на кратковременное пропадание питания, а не на длительную автономную работу).

    Также удалил код поддержки mqttwarn и самодельного веб-интерфейса, упростил MQTT сообщения. В таком виде все очень легко интегрируется в Home Assistant, а самоделки по моему мнению не нужны.

    Репозиторий здесь - https://github.com/vampik/watermeter

    Дальнейшие обновления не планируются, я просто исправил и подправил под себя.
     
  13. Vampik

    Vampik Нуб

    По результатам опытной эксплуатации выявилась такая же проблема. Самопроизвольно накручивается счетчик. Изучение кода выявило недочет в алгоритме устранения дребезга - кратковременное падение сигнала приводит к инкрементированию счетчика. Переделал алгоритм, повесив прерывание не только на рост сигнала, но и на его падение, и модифицировал код с отслеживанием состояния. Единственный минус, полностью удалил поддержку спящего режима, т.к. не знаю, как его адаптировать к новому алгоритму. Уже несколько дней полет нормальный, считает как часы, ни единого ложного срабатывания.
    Код на гитхабе, и туда же выложил уже скомпилированный бинарник.
     
  14. SergeiL

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

    ИМХО, не нужны тут ни прерывания ни сон.
    Все прекрасно может работает с опросом по таймеру.
    Вариант устранения дребезга - по желанию, у меня любимый вариант - вертикальные счетчики. (на первой странице обсуждалось)

    Открыл посмотрел свои водяные счетчики :
    • разница по холодной воде - пропущено 3 импульса
    • разница по горячей воде - пропущено 2 импульса.
    Устанавливал года полтора назад. Разница - 2-3 единицы в сотых куба воды. Ни о чем.
    Сохранения в EEPROM у меня нет, батареи - тоже нет.
    Все работает через mqtt. ( выключили / включили питание - устройство получило последнее значение счетчика по mqtt)
    Дальше считает и передает по mqtt
     
  15. Vampik

    Vampik Нуб

    Ну, я не гуру в программировании, просто переделал то что есть, чтобы оно нормально работало. ;) У меня исходный вариант за несколько дней сосчитал по пол-куба (!) лишних на каждом счетчике. Переделанный алгоритм за те же несколько дней работает как часы.