28

Мониторинг энергопотребления на базе PZEM-016 Modbus + Arduino

Всем доброго времени суток. Прикупил у братьев китайцев интересный девайс PZEM-016 счетчик энергии с интерфейсом modbus

Мониторинг энергопотребления на базе PZEM-016 Modbus + Arduino Arduino, Микроконтроллеры, Программирование, Начинающий

Есть описание протокола https://drive.google.com/file/d/1SdMvZ2awGcM7vNbjEqgSgx2Kgb_...  Высылаю на модуль команду F8040000000A6464(подсмотрел формат команды на линии rs485 - к модулю идет програмка на комп) получаю ответ(пример) F8 04 14 09 19 00 00 00 00 00 00 00 00 00 01 00 00 01 F4 00 00 00 00 4E A9 расшифровываю на сайте http://modbus.rapidscada.net/ получаю значения регистров.

F8 Slave address 0xF8 (248)

04 Function code 0x04 (4) - Read Input Registers

14 Byte count 0x14 (20)

09 19 00 00 00 00 00 00 00 00 00 01 00 00 01 F4 00 00 00 00 Register value 0x0919 (2329), 0x0000 (0), 0x0000 (0), 0x0000 (0), 0x0000 (0), 0x0001 (1), 0x0000 (0), 0x01F4 (500), 0x0000 (0), 0x0000 (0)

4E A9 CRC 0x4EA9 (20137)

Вопрос кто поможет с сохданием библиотеки(скетча) под ардуино - как я понял нужно сформировать запрос чтения регистров с счетчика и после получения байтов расшифровать ответ. у

Дубликаты не найдены

+2
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку 5
+6

К любой неведомой херне прикручивай ардуино)))

+1

хочет поток расшифровать и отображать, как я понимаю.

раскрыть ветку 3
0
Комментарий удален. Причина: данный аккаунт был удалён
раскрыть ветку 2
+2

PZEM-004T счетчик электроэнергии (тот который с UART) работает в тестовом режиме без нареканий в связке с ESP8266-даные отправляю в облако Blynk(использую как  интерфейс отображения на  тел) + написал интернет функцию в Azure - через POST отправляю даные в свою базу MS SQL Server и триггер который раз в неделю  и в конце месяца отрабатывает и присылает на почту отчет. Если кому будет интересно сделаю отдельный пост.

раскрыть ветку 1
0

Делай.

0

У меня получилось опрашивать и отправлять данные аруинкой с помощью ModbusMaster.h библиотеки, если надо могу кинуть готовый скетч.

раскрыть ветку 3
-1

Буду благодарен.

раскрыть ветку 2
0

#include <ModbusMaster.h>


/*!

Для начала можно проверить работу MODBUS прокотола напрямую через USB, без использования RS-485 конвертеров. Если используется MAX-485 конвертер, то не забываем подключить DE, RE_NEG и отсоединять RX/TX на время компиляции и аплоада.

*/

#define MAX485_DE 3

#define MAX485_RE_NEG 2

#define first_led_pin 13

#define RIR_addr 0x0001 //modbus function code 04


// instantiate ModbusMaster object

ModbusMaster node;


int filterstate = 3;


void setup()

{

pinMode(MAX485_RE_NEG, OUTPUT);

pinMode(MAX485_DE, OUTPUT);

pinMode(first_led_pin, OUTPUT);


// Init in receive mode

digitalWrite(MAX485_RE_NEG, 0);

digitalWrite(MAX485_DE, 0);


// Modbus communication runs at 9600 baud

Serial.begin(9600);


node.begin(1, Serial); // Modbus slave ID 1


// Callbacks allow us to configure the RS485 transceiver correctly

node.preTransmission(preTransmission);

node.postTransmission(postTransmission);

}


void loop()

{

uint8_t result;

uint16_t data[6];


result = node.readInputRegisters(RIR_addr, 1); //читаем 1 параметр по адресу RIR_addr (read input registers)

if (result == node.ku8MBSuccess)

{

filterstate = node.getResponseBuffer(0x00); //если всё ок, то записываем ответ в переменную

}

else filterstate = 3;


switch(filterstate)

{

case 0: first_led_low(); break;

case 1: first_led_high(); break;

case 3: first_led_error(); break;

default: first_led_error(); first_led_error();

}


delay(5000); //опрашиваем каждые 5 секунд

}


void preTransmission()

{

digitalWrite(MAX485_RE_NEG, 1);

digitalWrite(MAX485_DE, 1);

}


void postTransmission()

{

digitalWrite(MAX485_RE_NEG, 0);

digitalWrite(MAX485_DE, 0);

}


void first_led_low()

{

digitalWrite(first_led_pin, LOW);

delay(1000);

}


void first_led_high()

{

digitalWrite(first_led_pin, HIGH);

delay(1000);

}


void first_led_error()

{

digitalWrite(first_led_pin, HIGH);

delay(200);

digitalWrite(first_led_pin, LOW);

delay(200);

digitalWrite(first_led_pin, HIGH);

delay(200);

digitalWrite(first_led_pin, LOW);

delay(200);

digitalWrite(first_led_pin, HIGH);

delay(200);

digitalWrite(first_led_pin, LOW);

delay(200);

}

раскрыть ветку 1
0

Вариант без гемора: счётчик LE-01M, на борту Modbus по RS-485, далее куда хотите.

P.S. Не для коммерческого учета

0

А чем плох ардуино?) По моему удобство простота и скорость разработки перекрывает много минусов. Хотя для многих проэктов использую ESP8266 + Stm32. ардуино потому что сразу могу в облако данные закинуть- в Blynk например.

раскрыть ветку 1
0

Так и с ESP8266 можно закинуть. А начать отсюда: https://esp8266.ru/forum/threads/modbus-tcp-rtu-rs-485-web-s...

0
Вот интересно, а libfreemodbus уже портировали?
0

Понятно-понятно (нет)  ))

0

у меня есть программа для ПК, расшифровывает
Хотя там всё просто

я под Ардуинку не пишу. Хотя могу сделать прошивку, зальёте hex в МК и будет работать...

-1

Ларчик  открывался просто) Вот код считывания показаний:

#include <ModbusMaster.h>

#include <SoftwareSerial.h>


#define BAUD_RATE 9600

SoftwareSerial swSer(13, 15, false, 256);

/*!

We're using a MAX485-compatible RS485 Transceiver.

Rx/Tx is hooked up to the hardware serial port at 'Serial'.

The Data Enable and Receiver Enable pins are hooked up as follows:

*/

#define MAX485_DE 3

#define MAX485_RE_NEG 2


// instantiate ModbusMaster object

ModbusMaster node;


void preTransmission()

{

digitalWrite(MAX485_RE_NEG, 1);

digitalWrite(MAX485_DE, 1);

}


void postTransmission()

{

digitalWrite(MAX485_RE_NEG, 0);

digitalWrite(MAX485_DE, 0);

}


void setup()

{

pinMode(MAX485_RE_NEG, OUTPUT);

pinMode(MAX485_DE, OUTPUT);

// Init in receive mode

digitalWrite(MAX485_RE_NEG, 0);

digitalWrite(MAX485_DE, 0);


Serial.begin(BAUD_RATE);

swSer.begin(BAUD_RATE);


// Modbus slave ID 1

node.begin(248, Serial);

// Callbacks allow us to configure the RS485 transceiver correctly

node.preTransmission(preTransmission);

node.postTransmission(postTransmission);

}


bool state = true;


void loop()

{

uint8_t j, result;

uint16_t data[6];


// Read 16 registers starting at 0x3100)

result = node.readInputRegisters(0x0000, 10);


if (result == node.ku8MBSuccess)

{

for (j = 0; j < 10; j++)

{

data[j] = node.getResponseBuffer(j);

}

swSer.print("Napr: ");

float napr = node.getResponseBuffer(0x00);

napr = napr / 10.0f;

swSer.println(napr);

unsigned int responseHigh = (unsigned int) data[2];

unsigned int responseLow = (unsigned int) data[1];

unsigned int amper = (responseHigh) + responseLow;

uint32_t result = (uint32_t)responseHigh << 16 + (uint32_t)responseLow;

swSer.print("Old Method Current A: ");

swSer.println(amper);

swSer.print("New Method Current A: ");

swSer.println(result);

responseHigh = (unsigned int) data[4];

responseLow = (unsigned int) data[3];

result = (uint32_t)responseHigh << 16 + (uint32_t)responseLow;

swSer.print("Power W: ");

swSer.println(result);


responseHigh = (unsigned int) data[6];

responseLow = (unsigned int) data[5];

swSer.print("Energy Wh: ");

result = (uint32_t)responseHigh << 16 + (uint32_t)responseLow;

swSer.println(result);

swSer.print("Freq Hz: ");

float freq = node.getResponseBuffer(0x07);

freq = freq / 10.0f;

swSer.println(freq);

swSer.print("PowerFactor : ");

swSer.println((node.getResponseBuffer(0x08)));

swSer.print("Alarm Status 1 - is alarm, 0 - is not alarm : ");

swSer.println((node.getResponseBuffer(0x09)));

swSer.println("=========================================================");

swSer.println();

delay(200);


}


}

-2

Нашел реализацию библиотеки для счетчика Eastron SDM220 Modbus - https://github.com/peninquen/Modbus-Energy-Monitor-Arduino/t...  вечером попробую отпишусь. А идея такова - есть даный девайс(PZEM-016) + есп8266 + конвертер ТТЛ-РС485.  Можно все бросать в облако Blynk красивый дизайн и програмируется легко, но я хочу еще даные сохранять - для этого выбрал БД Sql Server в связке с Azure Functions дают супер возможности как то - отправка отчетов по Email смс(MailJet сервис) и многое другое что реализую в свободное время(о результате  будет отдельный пост)

-7
ЯННП, нахуя тут ардуина ?
раскрыть ветку 6
-1

А как выслать данные в облачную базу?? Raspberry дорого для такой херни - Arduino nano+RS485+Ethernet = 10 у.е

ещё комментарии
ещё комментарии
Похожие посты
Возможно, вас заинтересуют другие посты по тегам: