PZEM004T

Модератор: Alex

svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

PZEM004T

Сообщение svetozar161 » Вс сен 23, 2018 4:38 pm

Здравствуйте друзья. Пришел наконец мне этот, я думаю уже известный всем, измеритель энергии.
Peacefair EnergyMonitor AC 100A
2018-09-23_16-17-30.png
2018-09-23_16-17-30.png (705.02 КБ) 6613 просмотров
Теперь думаю как его прикрутить к нашему любимому АМС. Надеюсь это будет актуально.
Есть библиотека на гихабе (во вложении)
Есть пример работы с сериалом

Код: Выделить всё

#include <SoftwareSerial.h> // Arduino IDE <1.6.6
#include <PZEM004T.h>

PZEM004T pzem(10,11);  // (RX,TX) connect to TX,RX of PZEM
IPAddress ip(192,168,1,1);

unsigned long LstRd =0; 
byte Ncycle = 1;

#define RdDly  1000  // задержка мс между обращениями к PZEM004T


void setup() {
  Serial.begin(9600);
  pzem.setAddress(ip);
  LstRd = millis();
}

void loop() {
  if (Ncycle == 1 && millis() - LstRd > RdDly)
  {
  Ncycle++; LstRd = millis();
  Serial.print("V="); 
  float v = pzem.voltage(ip); if (v < 0.0) v = 0.0; Serial.print(v);
  Serial.print(" ("); Serial.print(millis()- LstRd); Serial.print(") ");
  }

  if (Ncycle == 2 && millis() - LstRd > RdDly)
  {
  Ncycle++; LstRd = millis();
  Serial.print("I="); 
  float i = pzem.current(ip); if(i < 0.0) i = 0.0; Serial.print(i);
  Serial.print(" ("); Serial.print(millis()- LstRd); Serial.print(") ");
  }
  
  if (Ncycle == 3 && millis() - LstRd > RdDly)
  {
  Ncycle++; LstRd = millis();
  Serial.print("P="); 
  float p = pzem.power(ip); if(p < 0.0) p = 0.0; Serial.print(p); 
  Serial.print(" ("); Serial.print(millis()- LstRd); Serial.print(") ");
  }
  
  if (Ncycle == 4 && millis() - LstRd > RdDly)
  {
  Ncycle = 1; LstRd = millis();
  Serial.print("E="); 
  float e = pzem.energy(ip); if(e < 0.0) e = 0.0; Serial.print(e);
  Serial.print(" ("); Serial.print(millis()- LstRd); Serial.print(") ");
  Serial.println();
  }
  
}
При загрузке скетча в порт валится 4 показателя
ток, мощность, напряжение, потребленная электроэнергия(думаю что активная мощность все же)
Теперь нужно переделать его под наши условия. Например отправка данных на мажордомо. В данном виде скетч предполагает опрос измерителя через IP.
Нашел еще php скрипт для него

Код: Выделить всё

 <?php
$dev = '/dev/ttyUSB0';

function dev($dev, $tx){
    exec("stty -F $dev 9600 raw -echo");
    if ($handle = fopen($dev, "r+")){
        fwrite($handle, $tx);
        $rx = fread($handle, 7 );
        fclose($handle);
        //echo bin2hex($rx).PHP_EOL;
        if (check($rx) === true)
            return $rx;
        else
            return false;
    }
    else 
        return false;
}

function check($in){
    $arr = str_split(bin2hex($in),2);
    $summ = 0;
    for ($i = 0; $i <= 5; $i++)
        $summ += hexdec($arr[$i]); //hex to dec    
    if (substr(dechex($summ),-2) == $arr[6]) //last 2 chr. from hex 
        return true;
    else
        return false;
}

//voltage
$arr = str_split(bin2hex(dev($dev,hex2bin('B0C0A80101001A'))),2);
$voltage = hexdec($arr[1].$arr[2]) + hexdec($arr[3])/10;
//current
$arr = str_split(bin2hex(dev($dev,hex2bin('B1C0A80101001B'))),2);
$current = hexdec($arr[2]) + hexdec($arr[3])/100;
//active
$arr = str_split(bin2hex(dev($dev,hex2bin('B2C0A80101001C'))),2);
$active = hexdec($arr[1].$arr[2]);
//energy
$arr = str_split(bin2hex(dev($dev,hex2bin('B3C0A80101001D'))),2);
$energy = hexdec($arr[1].$arr[2].$arr[3]);

echo 'Voltage:'.$voltage.PHP_EOL;
echo 'Current:'.$current.PHP_EOL;
echo 'Active:'.$active.PHP_EOL;
echo 'Energy:'.$energy.PHP_EOL;
?>
Кому интересно, можно пообсуждать. Спасибо за внимание.
Вложения
PZEM004T-master.zip
(9.4 КБ) 257 скачиваний
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: PZEM004T

Сообщение serghei » Вс сен 23, 2018 4:56 pm

Покажи вывод в сериале. Как выглядит строка?
И вообще он Такой??
И по сериалу уже легко связывать два девайса ))
  • 26.2 C , 32.4% ,754.2 mm.Hg.
    1970-01-01 00:05:04 3843 (47%)
    [21;1;1;0;5;90;255;3;0;9;2080874 ]
Это вывод стороннего аппарата в сериале AMS/
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: PZEM004T

Сообщение svetozar161 » Вс сен 23, 2018 5:33 pm

Я еще не заливал скетч, просто нашел примеры. Там надо переделывать под наши потребности, поубирать loop и delay а то сервер умрет от прерываний я так думаю))
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: PZEM004T

Сообщение svetozar161 » Вс сен 23, 2018 5:39 pm

Вот что мне приехало
20180923_173315.jpg
20180923_173315.jpg (3.08 МБ) 6597 просмотров
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: PZEM004T

Сообщение serghei » Вс сен 23, 2018 5:43 pm

Прежде чем что то поломать и прикрутить к нам , надо железяку запустить в штатном режиме , посмотреть что она умеет , вычислить косяки ( в теме МД было очень много жалоб на пустые сообщения от неё). А вот потом уже думать как проще приделать к АМС.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: PZEM004T

Сообщение olehs » Вс сен 23, 2018 6:11 pm

Т.к. библиотека моя), могу о железяке рассказать все.
Железяка отдает по 2 показателя за раз, потом не отвечает около секунды (видимо вычисляет RMS).
Библиотека по умолчанию ждет, пока железяка отдаст показания. Если показания - это не основная задача вашего скетча, то есть выход.
Уменьшить таймаут (setReadTimeout) и самому обрабатывать ошибки ожидания.
За это сообщение автора olehs поблагодарили (всего 2):
svetozar161 (Вс сен 23, 2018 6:14 pm) • VooDooN (Вс сен 23, 2018 10:12 pm)
Рейтинг: 2.33%
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: PZEM004T

Сообщение olehs » Вс сен 23, 2018 6:36 pm

Во вложении пример веб-сервера, отдающего по запросу показания в JSON.
Там как раз использован прием с таймаутом, о котором я говорил.
Вложения
PowerMon.zip
(195.06 КБ) 274 скачивания
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: PZEM004T

Сообщение serghei » Вс сен 23, 2018 6:50 pm

Ну AMS на 8266 умеет ползать на сайт погоды и получать в ответ JSON и выводить на свою страницу. Вот только без реальной железки очень сложно мне что то подсказать по делу....
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: PZEM004T

Сообщение olehs » Вс сен 23, 2018 6:55 pm

Это если PZEM подключать к отдельному контролеру по сети. А если напрямую - то достаточно одну функцию (check) скопипастить из скетча и вызывать ее в основном цикле (ну и плюс setup)
svetozar161
Сообщения: 72
Зарегистрирован: Пт янв 13, 2017 11:48 pm
Благодарил (а): 6 раз
Поблагодарили: 3 раза

Re: PZEM004T

Сообщение svetozar161 » Вс сен 23, 2018 8:35 pm

Залил на Мегу пример HwSerial я так понял из библиотеки Олега (спасибо ему огромное за эту библиотеку), получил в сериале вот это

Код: Выделить всё

231.90V; 0.00A; 0.00W; 14.00Wh; 
232.80V; 0.00A; 0.00W; 14.00Wh; 
233.30V; 0.00A; 0.00W; 14.00Wh; 
233.00V; 0.00A; 0.00W; 14.00Wh; 
233.20V; 0.00A; 0.00W; 14.00Wh; 
232.50V; 0.00A; 0.00W; 14.00Wh; 
229.50V; 0.00A; 0.00W; 14.00Wh; 
229.40V; 0.00A; 0.00W; 14.00Wh; 
229.70V; 0.00A; 0.00W; 14.00Wh; 
229.90V; 0.00A; 0.00W; 14.00Wh; 
232.40V; 0.00A; 0.00W; 14.00Wh;
То есть плата живая, уже хорошо. Теперь надо думать как ее прикрутить в скетч АМС, чтобы она слала GET раз в минуту на мажордомо
Ответить