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

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

  1. Slacky

    Slacky Гик

    Это "костыли" все. У Ардуины свои заморочки и мне не нарвится, что правильно написаннный код приводит к корке ... Вот потому сейчас я и смотрю в сторону чистого SDK (хотя говорят там своих косяков хватает, но хотя бы убираются косяки Ардуины) ...
     
  2. Bor2121

    Bor2121 Нуб

    Ок спасибо, буду пробовать, а 12Ком на плате питания как правильно запаять? D0 понятно, а вот на плате у меня нет таких деталей вообще, или просто 5v найти при подключенном акуме и туда?
     
  3. Slacky

    Slacky Гик

    Найти 5 вольт при использовании внешнего источника (не АКБ), которые будут пропадать, когда внешнее питание снято ...
     
  4. Bor2121

    Bor2121 Нуб

    понял, а USB порт на самой D1 не запитывается?, используется питание только с BatterySheild? А диоды при этом должны гореть, то есть внешне как то видно что устройство активно?
     
    Последнее редактирование: 27 апр 2018
  5. SergeiL

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

    Тогда - все ясно, вопросов нет! :)
    Все относительно :), у каждого свое видение на "костыли", мне например другое кажется "костылями" :).

    Ардуино или NodeMcu на ESP - это тоже в принципе "костыли".

    Вот взять процессор, ту же Мегу, написать без Ардуино, на Си, добавить ESP c родной АТ-шной прошивкой - это не "костыли"? И работать от батареи будет хоть год.

    Но как по мне, так лучше поставить чуть больший аккумулятор, и не заниматься совершенствованием рабочего прибора, а сделать что ни будь еще, что пользу принесет. Но это ИМХО.

    В принципе, для проверки состояния входа, через определеннгый промежуток времени, можно таймер и не использовать. Достаточно в loop() millis() контролировать.
     
  6. Bor2121

    Bor2121 Нуб

    А если не настроено подключение в качестве клиента, то при включении должен включиться режим точки доступа? Ни могу найти место где это описано,
    WiFi.softAP(wmConfig.apSsid, wmConfig.apPassword); тут как переменные из конфига или надо ручками вписать?
     
  7. Bor2121

    Bor2121 Нуб

    Чтобы заполнить через браузер - оно должно завестись в режиме точки доступа, пока с этим проблема.
    Мониторинг порта говорит
    External power low.
    Light sleep now ...
    Wake up from sleep.
    External power low.
    Light sleep now ...
     
  8. Slacky

    Slacky Гик

    И что Вам ясно? :)
    А вот так делать не рекомендую.Будете пропускать импульсы ...
     
  9. Slacky

    Slacky Гик

    В самом начале watermeter.ino есть много интересного ...

    Например.
    Код (C++):
    #define DEBUG true                                /* Send debug messages if true          */
    #define EXT_POWER_CONTROL true                    /* Check external power if true         */
    #define SLEEP_MODE_ON true                        /* To pass into sleep mode if true      */
    #define NOT_READ_EEPROM false                     /* Dont't read from EEPROM if true      */
     
    Меняете на
    Код (C++):
    #define EXT_POWER_CONTROL false
    И модуль перестанет реагировать на пропажу внешнего напряжения ....
     
  10. Slacky

    Slacky Гик

    В тесте можно запитать и от USB модуля. В работающем под раковиной устройстве там пусто ...
     
  11. Bor2121

    Bor2121 Нуб

    Я завел, интерфейс есть. Скетчи изучаю. С доп питанием точка доступа стартанула. Буду дальше копать, спасибо что не бросили ;)
    А какая логика работы, если я переключаю Вемос на работу с роутером, а коннект не удался или потом разорвётся, на SD она не сохранит же данные счетчиков? И не отправит после восстановления? И че то ругается на внешнее питание ;( ОТ разных источников...
     
    Последнее редактирование: 28 апр 2018
  12. Slacky

    Slacky Гик

    Если не может отправить на сервер, сохраняем значение на SD или во флешь. После восстановления соединения все отправится на сервер. Если система перегрузилась, послденее значение берется с SD или флешь. Отправляется на сервер. Если на сервере значение меньше, то считатем то, что в модуле, Если на сервере больше, то берем это.
     
  13. Bor2121

    Bor2121 Нуб

    Ок, понял... но испытания привели плату в ступор, в мониторе порта крякозябры нескончаемо, диод на плате горит постоянно. Странно... на обед только отошел, вернулся изделие мертвое ;(
    Испытания не удались, хотя работающую систему посмотрел, литры считало... Жаль. Похоже с баттериШилдой что-то не так... как только собираю конструкцию с ней - не стартует (крякозябры в порту), как отдельно - все нормально заводится ;(
     
    Последнее редактирование: 28 апр 2018
  14. Bor2121

    Bor2121 Нуб

    Запустил, собрал. НО моя баттеришилд все же другая, 12ком перемычку нашел куда поставить, но тогда батерейка показывает 1.7вольта, если заменить резистор на простую перемычку то 2.7вольта примерно, хотя на выходе она 4.2 примерно. Тревога по внешнему питанию пропадает с перемычкой - но криво отображает батарейку. ;(
     
  15. Slacky

    Slacky Гик

    Подогнать только если :))

    Проверить в true ли установлена
    Код (C++):
    #define EXT_POWER_CONTROL true                    /* Check external power if true         */
    Если да, ну тогда только подобрать константу в функции

    Код (C++):
    /* Vcc or Battery in volt */
    String returnVccStr() {
      String v = "";
      String Vcc;
      int volt;
      int voltInt;

      if (!EXT_POWER_CONTROL) {
        Vcc = "Vcc: ";
        voltInt = ESP.getVcc();
        volt = (voltInt*117+5000)/100;
      } else {
        Vcc = "Battery: ";
        voltInt = analogRead(BAT_VOLT_PIN);
        volt = 5000/1024*voltInt*1.19;
      }
    /*  Serial.printf("voltInt: %d\n", voltInt);*/

        v += volt;

        Vcc += v.substring(0, 1);
        Vcc += ',';
        Vcc += v.substring(1, 3);
        Vcc += 'V';

        return Vcc;
     
    }
     
  16. Bor2121

    Bor2121 Нуб

    Да показания типа Battery: 7,1V или Battery: 6,6V наверно константой не выровнять ;) Все время прыгает.
    А вот к умному дому как бы прикрутить, на MQTT сообщения идут, но Domoticz их не видит, топик менял на "domoticz/in" и так и сяк. Тут надо переписать скетч наверно... эх. ладно добирусь может.
    Спасибо!
     
  17. Bor2121

    Bor2121 Нуб

    Ааааа, все работает класс. Спасибо!
    Помогите переделать MQTT сообщения под формат Domoticz ;-) Даже в NodeRed не могу переделать сообщение...
     
  18. Slacky

    Slacky Гик

    Ну нужно знать, в каком формате принимает Domoticz ... Я не знаю :))
     
  19. Bor2121

    Bor2121 Нуб

    На Domiticz нужно отправлять топик domoticz/in (это из доков), руками я пробовал этот топик берет отлично и в сообщении id устройства и значение литров. Дальше он сам собирает статистику, графики то се (если нужно).
    Строка в mqtt типа
    mosquitto_pub -h 127.0.0.1 -m '{ "idx" : 3, "name" : "Cold_Water", "svalue" : "10" }' -t 'domoticz/in' увеличивает счетчик на сервере на 10, где idx - счетчик, Имя похоже не обязательно, ни где не учитывает, ну и значение на которое увеличить счетчик svalue. Вот такой топик Domoticz ест ;-) по идее нужно передать только 10 (ну или сколько положено по паспорту.
    Скорее всего нужно сильно переписать скетч, у вас он монументален просто ;-)
     
  20. Slacky

    Slacky Гик

    Нен надо ничео сильно переписывать.

    В цикле loop ищем вот такие части

    Код (C++):
     /* If counter of hot water was added */
      if (counterHotWater > 0) {
        wmConfig.hotTime = localTimeT();
        s = "";
        s += wmConfig.hotTime;
        wmConfig.hotWater += counterHotWater * wmConfig.litersPerPulse;
        s = s + " " + wmConfig.hotWater;
        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 = "";
        s += wmConfig.coldTime;
        wmConfig.coldWater += counterColdWater * wmConfig.litersPerPulse;
        s = s + " " + wmConfig.coldWater;
        if (DEBUG) {
          Serial.print(mqttTopicColdOut + " <== "); Serial.println(s);
        }
        if (mqttClient.connected()) mqttClient.publish(mqttTopicColdOut.c_str(),s.c_str());
        else saveConfig();
        counterColdWater = 0;
      }
    И в строку s набиваем необходимое.

    Брокера и топик можно без проблем заменить через web-конфиг ...