ZMPT101b + ADS1115 + NodeMCU

Тема в разделе "ESP8266, ESP32", создана пользователем Zvere4ek, 5 мар 2019.

  1. Zvere4ek

    Zvere4ek Нерд

    Задача: контроль переменного напряжения 220В в 4-х различных точках системы АВР (автоматического ввода резерва).

    Для решения поставленной задачи я решил использовать:
    - датчики "ZMPT101b" для контроля ~220В;
    - плату с 4-мя аналоговыми входами "ADS1115" (16-битный АЦП с выходом I2C);
    - плату NodeMCU v3.

    Так как в программировании (в среде IDE) я относительно начинающий, то сначала я проверил работу более простых связок ADS1115 + NodeMCU и ZMPT101b + NodeMCU. Отдельно эти связки работают нормально.
    [​IMG]
    Код (C++):
    #include <Wire.h>
    #include <Adafruit_ADS1015.h>
    Adafruit_ADS1115 ads;

    void setup(void)
    {
      Wire.begin(D1, D2); //(SDA, SCL)
      Serial.begin(9600);

      ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV   0.1875mV (default)
      ads.begin();
    }

    void loop(void)
    {
      int adc0;
      adc0 = ads.readADC_SingleEnded(0);
      Serial.print("AIN0: ");   Serial.println(adc0);   Serial.print("Напряжение: ");   Serial.print(float((adc0*0.1875)/1000.0));   Serial.println("В");
      delay(2000);
    }
    Схему для связки ZMPT101b + NodeMCU рисовать не стал. Здесь просто датчик напряжения подключается к 3-м пинам NodeMCU: 3,3В/GND/A0.
    Код (C++):
    #include "EmonLib.h"             // Include Emon Library
    EnergyMonitor emon1;             // Create an instance

    void setup()
    {
      Serial.begin(9600);
      emon1.voltage(A0, 240, 1.7);  // Voltage: input pin, calibration, phase_shift
    }

    void loop()
    {
    emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
    float Vrms = (emon1.Vrms - 3);
    Serial.println(Vrms);
    delay(2000);
    }
    Примечание: ZMPT101b на выходе выдаёт синусойду и поэтому нужно делать несколько измерений и т.д. (по даташиту). Но в данный момент я упростил скетч, чтобы было проще разобраться с проблемой. Так что здесь я получаю одно из значений синусоиды в любой момент времени.

    И вот я дошёл до проблемной связки вышеназванных устройств и темы данной задачи. По сути, нужно всего лишь объединить два скетча в один:
    [​IMG]
    Код (C++):
    #include <Wire.h>
    #include <Adafruit_ADS1015.h>
    Adafruit_ADS1115 ads;

    #include "EmonLib.h"             // Include Emon Library
    EnergyMonitor emon1;             // Create an instance

    void setup()
    {
      Wire.begin(D1, D2); //(SDA, SCL)
      Serial.begin(9600);

      ads.setGain(GAIN_TWOTHIRDS);  // 2/3x gain +/- 6.144V  1 bit = 3mV   0.1875mV (default)
      ads.begin();
      emon1.voltage(ads.readADC_SingleEnded(0), 240, 1.7);  // Voltage: input pin, calibration, phase_shift
    }

    void loop()
    {
      int adc0;
      adc0 = ads.readADC_SingleEnded(0);
      Serial.print("AIN0: ");   Serial.println(adc0);   Serial.print("Напряжение: ");   Serial.print(float((adc0*0.1875)/1000.0));   Serial.println("В");

      emon1.calcVI(20,2000);         // Calculate all. No.of half wavelengths (crossings), time-out
      float Vrms = (emon1.Vrms - 3);
      Serial.println(Vrms);

      delay(2000);
    }
    [​IMG]
    Примечание: эта ошибка выдаётся вне зависимости от того, подключена ли NodeMCU ко всей схеме или нет, следовательно, делаю вывод, что проблема исключительно в скетче. Пробовал использовать другую NodeMCU, выдаётся та же ошибка. Пробовал перезагружать компьютер :) Пробовал вместо NodeMCU подключать Arduino Nano и с ней, как ни странно, всё нормально работает.
    У Ардуино Нано SDA и SCL находятся на выводах А4 и А5 (NodeMCU я подключаю через D1 и D2). Логика у Ардуинки 5 В (у NodeMCU 3,3 В). И касаемо скетча, при заливке в Ардуинку, я, соответственно, убираю строчку: Wire.begin(D1, D2).
    Прошу подсказать, в чём моя ошибка и что я могу не учитывать. Мозговой штурм также актуален :)
     

    Вложения:

    Последнее редактирование: 5 мар 2019
  2. KindMan

    KindMan Гуру

    Поставьте себе плагин esp exception decoder и он покажет строки, где срабатывает сторожевой таймер
     
    Zvere4ek и Daniil нравится это.
  3. Daniil

    Daniil Гуру

    А где в скетче вывод "stack" и что-то про wdt?
     
  4. KindMan

    KindMan Гуру

    Это esp пишет
     
  5. Zvere4ek

    Zvere4ek Нерд

    Спасибо за подсказку, правда у меня пока никакого вывода сделать не получилось, так как я не до конца понимаю происходящее, особенно учитывая, что в моём скетче всего 30 строк. Вот расшифровка стеков (взял 1-й и 6-й, т.к. с 1-го по 5-й расшифровка одинаковая, но вообще содержимое стеков везде разное)
    1.jpg 6.jpg
     
  6. KindMan

    KindMan Гуру

    Строка, на которой сработала собака это 26, delay(2000). Попробуйте уменьшить задержку или переписать код без неё.
    Вот эта строка что делает - emon1.calcVI(20,2000);?
     
    Zvere4ek нравится это.
  7. Zvere4ek

    Zvere4ek Нерд

    я тоже обратил внимание на единственную 26 строку, которая фигурировала в расшифровке. Это хитрая строчка относящаяся к библиотеке EmonLib, для снятия показаний с датчика напряжения ZMPT101b. Вон в комментарии написано, что она "// Calculate all. No.of half wavelengths (crossings), time-out". Я не очень хорошо понимаю, что эта магическая строчка делает, но в ней заключается великий смысл библиотеки EmonLib, используемой для данного датчика. Похоже, что синусойда делится на 20 значений (по оси Х). И 2000 - это какой-то тайм-аут. У всех ардуинщиков, работающих с датчиком ZMPT101b, в скечтах, данная строчка написана именно так и других примеров я не находил :( Так же как и не нашёл понятного описания этой строчки, да и вообще, данной библиотеки. У меня получается несколько тупиковая ситуация, так как других библиотек для работы с датчиком переменного напряжения ZMPT101b я не нашёл, все работают с EmonLib. Специфика снятия показаний переменного напряжения и специфика работы ZMPT101b для меня не так проста, как работа с обычными датчиками, которые просто выдают какое-то постоянное измеряемое значение (к примеру от 0 до 1023), при постоянных измеряемых данных. В итоге: я не очень понимаю, что именно делает эта строчка, но она здесь получается необходима. Как по-другому можно работать с этим датчиком для решения моей задачи я тоже не знаю :( Зато связка ZMPT101b + ADS1115 + Arduino_Nano работает без проблем. И отдельно ZMPT101b + NodeMCU работает как и полагается с этой нужной строчкой. Не понимаю, почему именно данная связка ZMPT101b + ADS1115 + NodeMCU не хочет работать :( Изменение параметра Delay никак не повлияло. Увеличивал до 5 сек., убирал вообще, всё равно Soft WDT reset :(
     
    Последнее редактирование: 5 мар 2019
  8. KindMan

    KindMan Гуру

    Почитал про датчик, посмотрел ваш скетч - не сходится. Вы читаете данные с ацп, это и есть информация с датчика напряжения. Но она никак не передается в библиотеку для zmpt.
     
    Zvere4ek нравится это.
  9. KindMan

    KindMan Гуру

    Этой строкой вы говорите библиотеке с какого пина читать, а она потом берёт, и через analogRead это делает. Теперь всё понятно? :)
     
    Zvere4ek нравится это.
  10. Zvere4ek

    Zvere4ek Нерд

    Я не могу быть уверен на 100%, но вроде в строке: emon1.voltage(ads.readADC_SingleEnded(0), 240, 1.7); я прописываю параметры, а затем строка emon1.calcVI(20,2000); с помощью библиотеки считывает и обрабатывает данные. Очень загадочная штука конечно, но с ардуинкой всё работает именно в этом виде.
    Да, конечно, именно вместо А0 я указываю: ads.readADC_SingleEnded(0), т.е. читать данные с А0 устройства ADS1115.
     
  11. KindMan

    KindMan Гуру

    Так, не поняли :)
    Этой строкой вы присвоили номер пина, с которого будет производится чтение. Именно номер, и библиотека ничего не знает про ваш расширитель портов. ads.read выдает вам число, что считало в этот момент, как видно в сериале, например 7607. И потом есп, пытается сделать это - analogRead(7607). Что из этого получится?
    Избавляйтесь от этой библиотеки, и считайте сами, на её основе, и всё получится. Удачи!
     
    Zvere4ek нравится это.
  12. Zvere4ek

    Zvere4ek Нерд

    Спасибо, кажется я понял. Но как же тогда Ардуинка работает в связке: ZMPT101b + ADS1115 + Arduino_Nano и именно с этим скетчем? Она ведь тоже получается не должна работать? А она вот, работает:
    Nano1.jpg
     
  13. KindMan

    KindMan Гуру

    Приложите схему подключения к ардуино, и скетч. И с работающего устройства вывод сериала приложите, когда напряжения подано и снято с датчика. И я вам объясню.
     
    Zvere4ek нравится это.
  14. Zvere4ek

    Zvere4ek Нерд

    Похоже Вы правы. Я ещё раз всё пересобрал и перепроверил с Ардуинкой. Да, работать - работает. Никаких ребутов нет, но данные выдаёт какие-то некорректные. Vrms почему-то вначале запуска Ардуинки высокий (около 400), а затем потихоньку снижается примерно до 10. И это не зависит от поданного на датчик напряжения ~220 В. :( Получается, что ZMPT101b + ADS1115 + NodeMCU нельзя скрестить, если пользоваться библиотекой EmonLib?! Это конечно очень досадно :( Теперь остаётся два варианта, либо самому копаться в математике с физикой, чтобы научиться снимать показания синусоиды, либо выкидывать из связки ADS1115 и пользоваться вместо неё Ардуинкой, связывая последнюю с NodeMCU по средствам, например, UART... :confused:
     
  15. KindMan

    KindMan Гуру

    Нет, можно покапаться в интернете.
    Вам только наличие нужно проверять 220?
     
    Zvere4ek нравится это.
  16. Zvere4ek

    Zvere4ek Нерд

    Спасибо за ссылку.
    Мне хорошо бы всё-таки какие-то показания напряжения иметь, но большой точности мне не нужно.
     
  17. KindMan

    KindMan Гуру

    Ну если всё получится, отпишитесь, кому нибудь пригодится.
     
    Zvere4ek нравится это.
  18. Zvere4ek

    Zvere4ek Нерд

    Хорошо! Спасибо Вам большое! Попробую вручную поковыряться (и с помощью ссылки :) ). Если что путное выйдет, то обязательно тут поделюсь :rolleyes:
     
    KindMan нравится это.
  19. parovoZZ

    parovoZZ Гуру

    Есть же у китайцев электросчётчик с выходом уарт и эспиай. Стоит, правда, не 3 копейки, но и разрабатываемый АВР тож поди не простой? Иначе почему бы не поставить обычное реле напряжения?
     
  20. Zvere4ek

    Zvere4ek Нерд

    Вы не в ту сторону подумали :) АВР готовый, ноу-хау компании Generac, котором была долгая история с реле напряжения.
    Долго я мучился, разбираясь в схеме и алгоритмах работы этого АВР. Практически всё понял, хотя остались кое-какие моменты, так как никто схем этого чуда не давал и куда там куча проводов идёт, тоже покрыто тайной, о которой я могу только догадываться. Пришлось на живую разбираться (иначе пришлось бы вызывать специально обученных людей за немалые деньги). Так вот, время от времени там выходит из строя Реле напряжения, хотя никакую серьёзную нагрузку оно не коммутирует. Чисто релюшкой щёлкает по линии 220В и ещё какой-то солиноидной фиговиной по цепи управления, но токи там практически 0. И всё бы ничего, но при выходе из строя Реле напряжения, включается газовый генератор и начинает расходовать кучу газа. Дом используется как дача, так что расходы газа могут быть очень значительными, пока там никого нет, особенно зимой. Поэтому, я хочу иметь полный контроль за напряжениями в этом щитке АВР, и иметь возможность удалённо переключать нужные цепи (по средствам интернета), если Реле напряжения снова выйдет из строя или заглючит (да и качество напряжения не лишним было бы анализировать с логированием на SD карту). Вначале там лет 5 проработало РНПП-311М (что является хорошим сроком для РН), затем два раза я покупал DigiTOP Vp-380B, которые проработали по 1...2 месяца и не просто вышли из строя, а глючили со страшной силой, жёстко насилуя постоянной коммутацией остальное оборудование. Сейчас снова поставил РНПП-311М, но кто знает, сколько оно прослужит...
     
    Последнее редактирование: 5 мар 2019