Считать импульсы с Меркурий 201

Тема в разделе "Arduino & Shields", создана пользователем avgaz, 13 авг 2015.

  1. avgaz

    avgaz Нерд

    Вопрос заключается в следующем есть счетчик Меркурий 201 со светодиодом который мигает 3200имп/1кв.ч как составить скетч что бы он подсчитывал кол имп с помощью фоторезистора и выдавал текущий расход электро энергии? в сети есть статьи но там показания отправляются на ПК и он уже строит графики и тд мне этого не нужно, мне бы что бы дуина выдавала текущий расход.
     
  2. DrProg

    DrProg Вечный нерд

    Сколько импульсов в секунду максимум получается?
     
    ИгорьК нравится это.
  3. avgaz

    avgaz Нерд

    Ну максимум зависит от потребления, к примеру если потребление 5кв.ч у меня обычно больше не бывает, то получается 5*3200/3600=4,44 имп (мигание диода) в секунду

    Попробовал вот так
    Код (Text):
    int light;
    /*int pin = 7;
    unsigned long duration; */
    int counter = 0;
    int counter2 = 0;
    float data = 0;
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
    long previousMillis = 0;  // здесь будет храниться время последнего изменения состояния светодиода
    long interval = 10000;
    void setup()
    {
      Serial.begin(9600);
      lcd.init();                      // initialize the lcd
      lcd.backlight();
    }
    void loop()
    {
      light = analogRead(1);
      if (light < 200){
        counter++;
        delay(100);
      }
    if (millis() - previousMillis > interval) {
        previousMillis = millis();
        counter2 = counter;
        counter = 0;
        lcd.clear();
    }
    lcd.setCursor(0,0);
    lcd.print(light);
    lcd.print("---");
    lcd.print(counter);
    lcd.setCursor(0,1);
    lcd.print(counter2);
    lcd.print("---");
    data = counter2*0.3125/1000*360;
    lcd.print(data);
    lcd.print(" Kw");

    }
    То есть считается количество миганий за 10сек далее рассчитывается сколько это квт.ч и сбрасывается счетчик.
    Но какие то странные показания вернее они плавают выдает к примеру 1.3квт через 10 сек уже 1.5квт, а ещё через 10сек может выдать 1квт при этом нагрузка в это время так не плавает. Такое ощущение что дело в задержке delay(100); но если её убрать то за одно моргание может со считаться 2 раза или 3
     
    Последнее редактирование: 14 авг 2015
  4. DrProg

    DrProg Вечный нерд

    delay вообще использовать не рекомендуется, надо ловить импульсы по перепаду постоянно их и подсчитывать. Думаю, что если в пределах 5Гц, то отследит фоторезистор, в крайнем случае можно придумать что-нибудь на оптопаре например, первое что в голову пришло. Надо будет попробовать с резистором. но мне кажется что справится легко.

    Если надо текущий расход, то считать продолжительность импульса и из нее вычислять моментальый расход. Если нужно расхрд за какое то время, то кол-во импульсов в этот промежуток. Как то так.
     
    ИгорьК нравится это.
  5. avgaz

    avgaz Нерд

    без delay не получается, так как за одно моргание диода тогда считывается несколько раз счетчик.
    Если не сложно приведите пример как считать продолжительность импульса, там просто под импульсом подразумевается моргание светодиодом, а без расхода он постоянно горит.
     
  6. Megakoteyka

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

    Не нужно считывать продолжительность, достаточно просто определить количество переходов из "0" (светодиод не горит) в "1" (светодиод горит).
    Сперва нужно экспериментально проверить наличие дребезга. Напишите скетч, который считает переходы из "0" в "1" без всяких задержек и проверьте показания. Если будет много лишних импульсов, нужно будет добавить в код алгоритм подавления дребезга. Для проверки хорошо бы сделать светодиодную мигалку, которая будет моргать только по кнопке - будет проще отлаживаться.
     
  7. DrProg

    DrProg Вечный нерд

    Импульс это не горящий светодиод это время между переходами из негорящего в горящий (или наоборот). В IDE есть готовая функция pulseIn(), можно использовать ее, предварительно отрегулировав и переведя показание датчика в цифровой вид. Но можно сделать все в программе самому. Алгоритм такой: запоминаем показание фоторезистора, заходим в луп постоянно считываем новые показания, если они меняются щелкаем счетчиком, запоминаем новое показание и снова ждем пока оно изменится и так далее. Опрос даже самый дохленкий МК может делать сотни и тысячи раз в секунду, фоторезистор слегка более инертен, но 5 раз в секунду наверное сможет.

    Вопрос такой, вы хотите решить задачу самостоятельно или важно просто сделать? Спрашиваю чтобы уточнить силу помощи которую вам надо оказать.
     
    ИгорьК нравится это.
  8. avgaz

    avgaz Нерд

    У меня нет доступа к светодиоду по этому определить горит он или нет можно только фоторезистором, который меняет сопротивление, так что посчитать 0 или 1 не получится.

    Дак pulseIn() считает HIGH или LOW у меня, же сопротивление с 250 меняется на 150 к примеру, перевести в цифру это как? просто на какой то пин подавать скажем LOW но тогда когда сопротивление меняется на 150 и считать pulseIn() с этого пина? дак pulseIn() не знаю как правельно выразится останавливает МК то есть во время работы pulseIn() фоторезистор не считается.
    важно сделать и понять как работает.
     
  9. DrProg

    DrProg Вечный нерд

    Переделать аналоговое показание в цифровое можно аппаратным путем, например при помощи вот этой детальки. Но потребуется регулировка, калибровка, подбор сопротивлений и прочее, поэтому я бы пошел другим путем и вычислял виртуальный HIGH-LOW из показаний аналогового датчика. Например при переходе показаний свыше 250 считать HIGH, при падении ниже 150 - LOW.

    Если уж так надо давайте сделаю эту штуку, скетч напишу. Самому интересно справится ли фоторезистор с таким кол-вом импульсов в секунду.
     
    ИгорьК нравится это.
  10. avgaz

    avgaz Нерд

    был бы признателен а то я не смог понять как с pulseIn() делать по этому и сделал через couter++ считал сколько раз светодиод моргает за 10 сек и высчитывал сколько это квт.ч но тут есть косяки
     
  11. DrProg

    DrProg Вечный нерд

    Окей, попробую может даже сегодня, но попозже.
     
    ИгорьК нравится это.
  12. Megakoteyka

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

    Считаем, что больше 230 соответствует отсутствию сигнала, а меньше 170 соответствует наличию - вот и получилась цифра. А дальше отслеживаем переходы из "0" в "1".
     
  13. DrProg

    DrProg Вечный нерд

    Подключите фоторезистор как в этом примере. Загрузите скетч, установите цифру при которой точно светло (по умолчанию поставил 250) и смотрите результат в сериал портe(у).

    Код (Text):
    int schet = 0; // счетчик
    bool flag;
    bool oldFlag;
    byte valHigh = 250;              // вместо 250 ставим значение выше которого гарантировано светло

    void setup() {
      Serial.begin(9600);
      pinMode(A0, INPUT);
      flag = (analogRead(A0) > valHigh);
      oldFlag = flag;
    }

    void loop() {
      flag = (analogRead(A0) > valHigh);
      if (flag != oldFlag) {
        schet++;
        oldFlag = flag;
      }
      Serial.println(schet / 2);    // функция печати в сериал порт занимает некоторое время, а потому тормозит программу, если события сменяются слишком часто это может стать причиной пропусков
    }
    Уверенность срабатываний зависит от правильно установленного положения яркости и отсутствия помех. Обратите внимание, что при выводе результата я делю значение на два, потому что в данном скетче подсчитывается общее количество переходов светло-темно и темно-светло.

    Проверял проводя пальцами перед лампой, вроде бы успевает.

    В идеале бы проверять светло или темно по двум разным настройкам с пропуском "сумрачной зоны", но это попробуйте сделать самостоятельно.
     
    ИгорьК нравится это.
  14. avgaz

    avgaz Нерд

    Спасибо.
    Но не понял, чем этот код отличается от моего? просто без delay ? а дальше как я понимаю мне по моему примеру нужно подсчитывать определенный промежуток времени и рассчитать уже квт.ч а далее обнулить schet и так по кругу?
     
  15. DrProg

    DrProg Вечный нерд

    Отличается хотя бы тем, что считает количество смен освещенности, а ваш количество 1/10 секунд проведенных датчиком в темноте вне зависимости от того сколько раз был импульс.

    Промежуток можно вычислять задавая таймер при каждой смене с LOW на HIGH (или наоборот) и сравнивая его с millis при такой же следующей смене.

    Да, и очень рекомендую вычислять потребление и выводить результат не постоянно, а через некоторые промежутки времени, например раз в секунду и реже. Вычисления и вывод в ком-порт на каждой итерации достаточно долгие чтобы пропускать импульсы. Делать надо так: некоторое время (например секунд несколько) датчик считывает мигания, потом делит это количество на время и вычисляет потребление в среднем за этот промежуток времени. Чем длиннее промежуток тем выше точность.
     
    Последнее редактирование: 15 авг 2015
    ИгорьК нравится это.
  16. MDV

    MDV Гик

    Вставлю свои пять копеек. На одном из сайтов подробно расписан про около обмена счётчика.
    Подумайте не лучше получать информацию сразу от МК счётчика, стабильность системы повысится в разы.
     
  17. avgaz

    avgaz Нерд

    Не как, счетчик за пломбирован по этому или считать мигания диода или снимать показания нагрузки с провода трансформатором. Пробовал с помощью sct-013-000 но там в обще жуть нормально не сделать не откалибровать и тд с диодом погрешность и то меньше.
     
  18. DrProg

    DrProg Вечный нерд

    Мой скетч то попробовали? Или решили что тоже самое без delay?
     
    ИгорьК нравится это.
  19. MDV

    MDV Гик

    Фактически у всех меркуриев есть IRDA порт. Связь можно организовать через данный порт
     
  20. avgaz

    avgaz Нерд

    Буду пробовать, на столе особой разницы не ощутил.
    Возможно и есть, но он находится под пломбой и не факт что туда разрешат подключится, если просить перепланировать.