Мониторинг энергопотребления на базе 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)

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

Arduino & Pi

1.4K постов20.6K подписчиков

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу

1
Автор поста оценил этот комментарий
Блеать, ты придумал какую то хуйню, реализация которой есть только в твоей голове и спрашиваешь ?
раскрыть ветку (1)
3
Автор поста оценил этот комментарий

Найди другой форум и там выражайся.

показать ответы
Автор поста оценил этот комментарий

#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)
1
Автор поста оценил этот комментарий

Спасибо! Я для удобства работы с RS485 использую китайский модуль с автоматической передачей без управляющего пина(обзор этих модулей https://www.youtube.com/watch?v=yoUkjwK6X-E) Сегодня проверю приду  с работы. Так же в систему еще прикупил пару датчиков утечки газа и СО + клапан в газовую трубу на 12В - энергомонитор помалеку превращается в систему Умного Дома..

показать ответы
1
Автор поста оценил этот комментарий
1. это не форум
2. Указывать будешь своему ебырю
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Второй пункт все прояснил.. Твой психопортрет ясен. Удивляюсь что в сообществе Пикабу еще есть такие.

1
Автор поста оценил этот комментарий
Блеать, ты придумал какую то хуйню, реализация которой есть только в твоей голове и спрашиваешь ?
раскрыть ветку (1)
3
Автор поста оценил этот комментарий

mr.Negative поставил 153 плюса и 38728 минусов у тебя в жизни вообще все ок?

Автор поста оценил этот комментарий

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

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

показать ответы
1
Автор поста оценил этот комментарий
ЯННП, нахуя тут ардуина ?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

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

показать ответы
Автор поста оценил этот комментарий

пока ты делаешь, я уже сам счётчик к блинку привязал ))) но ты делай, интересно почитать.

раскрыть ветку (1)
Автор поста оценил этот комментарий

А счетчик то какой? Pzem -004 или 16?

показать ответы
Автор поста оценил этот комментарий

ну шо, где пост-то?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ок. Делаю)

показать ответы
3
Автор поста оценил этот комментарий

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

показать ответы
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
Автор поста оценил этот комментарий

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

показать ответы
1
Автор поста оценил этот комментарий

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