Peacefair EnergyMonitor AC 100A Теперь думаю как его прикрутить к нашему любимому АМС. Надеюсь это будет актуально.
Есть библиотека на гихабе (во вложении)
Есть пример работы с сериалом
Код: Выделить всё
#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();
}
}
ток, мощность, напряжение, потребленная электроэнергия(думаю что активная мощность все же)
Теперь нужно переделать его под наши условия. Например отправка данных на мажордомо. В данном виде скетч предполагает опрос измерителя через 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;
?>