Почитайте коменты, там вроде как нашли решение! Я не вникал т.к. у меня нет такого дивайса!dmsergei писал(а): ↑Сб дек 22, 2018 6:38 pmТоже встала такая задача . Да ещё и три фазы . Методом счётчика не подходит - на то много причин.
Вот нарыл
https://pikabu.ru/story/monitoring_yene ... no_6314209
Теперь остаётся прикрутить это к MojorDoMo
Задам вопрос в разделе железо - наверное так будет правильнеею
К примеру этот комент "Ларчик открывался просто) Вот код считывания показаний:" с его кодом
Код: Выделить всё
#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);
}
}