EPsolar + ESP8266 - vyčitaní dat přes Modbus
Napsal: 13 kvě 2023, 07:42
Dobrý den.
Už si nevím rady tak bych chtěl poprosít o pomoc.
arduino mega a funkční.
Modbus a RS485 je připojena na ser. port1, přes který čte data a přes ser. port je vypisuje.
Bych to ale chtěl použit přes ESP8266 NodeMcu V3
https://tttapa.github.io/ESP8266/Chap04 ... oller.html
Pro čtení z Modbus jsem použil
SoftwareSerial mySerial(0, 2); // RX, TX na d3 a d4 pin
A pro přepinaní 485 modulu
#define MAX485_DE 16 //GPI16 je D0
#define MAX485_RE_NEG 5 //GPIO5 je D1
Něco z toho mi zpusobuje restart ESP8266 - Soft WDT reset.
A dotaz k tomuto.
https://tttapa.github.io/ESP8266/Chap04 ... oller.html
Na TX = GPIO15, RX = GPIO13 připojit RS485 přes kterou bych data četl a přes klasický ser. port je vypisoval?
Děkují.
Už si nevím rady tak bych chtěl poprosít o pomoc.
arduino mega a funkční.
Modbus a RS485 je připojena na ser. port1, přes který čte data a přes ser. port je vypisuje.
Kód: Vybrat vše
// MAX485_RO → 19 RX Pin Arduino
// MAX485_DI → 18 TX Pin Arduina
#include <ModbusMaster.h>
#define MAX485_DE 3
#define MAX485_RE_NEG 2
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
float batvol = 0;
void setup()
{
// put your setup code here, to run once:
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// debug / monitor serial port
Serial.begin(9600);
Serial1.begin(115200);
node.begin(1, Serial1);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
// put your main code here, to run repeatedly:
uint8_t resultMain;
resultMain = node.readInputRegisters(0x3100, 6);
// Serial.println( resultMain );
if (resultMain == node.ku8MBSuccess)
{
batvol=(node.getResponseBuffer(0x04) / 100.0f);
Serial.println(" - - - - - - - - ");
Serial.println("PV Voltage: ");
Serial.println(node.getResponseBuffer(0x00) / 100.0f);
Serial.println("PV Current: ");
Serial.println(node.getResponseBuffer(0x01) / 100.0f);
Serial.println("Battery Voltage: ");
Serial.println(node.getResponseBuffer(0x04) / 100.0f);
Serial.println("Battery Charge Current: ");
Serial.println(node.getResponseBuffer(0x05) / 100.0f);
}
delay(5000);
}
https://tttapa.github.io/ESP8266/Chap04 ... oller.html
Tak jsem to zkusil přes SoftwareSerial.ESP8266 má dva hardwarové UARTS (sériové porty):
UART0 na pinech 1 a 3 (TX0 a RX0 resp.) a UART1 na pinech 2 a 8 (TX1 a RX1 resp.), nicméně pro připojení flash čipu se používá GPIO8 . To znamená, že UART1 může pouze odesilat data.
Pro čtení z Modbus jsem použil
SoftwareSerial mySerial(0, 2); // RX, TX na d3 a d4 pin
A pro přepinaní 485 modulu
#define MAX485_DE 16 //GPI16 je D0
#define MAX485_RE_NEG 5 //GPIO5 je D1
Něco z toho mi zpusobuje restart ESP8266 - Soft WDT reset.
Kód: Vybrat vše
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(0, 2); // RX, TX na d3 a d4 pin
#define MAX485_DE 16 //GPI16 je D0
#define MAX485_RE_NEG 5 //GPIO5 je D1
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
float batvol = 0;
void setup()
{
// put your setup code here, to run once:
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// debug / monitor serial port
Serial.begin(9600);
Serial.println("Serial 9600 Check");
Serial1.begin(115200);
node.begin(1, mySerial);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
// put your main code here, to run repeatedly:
uint8_t resultMain;
resultMain = node.readInputRegisters(0x3100, 6);
// Serial.println( resultMain );
if (resultMain == node.ku8MBSuccess)
{
batvol=(node.getResponseBuffer(0x04) / 100.0f);
Serial.println(" - - - - - - - - ");
Serial.println("PV Voltage: ");
Serial.println(node.getResponseBuffer(0x00) / 100.0f);
Serial.println("PV Current: ");
Serial.println(node.getResponseBuffer(0x01) / 100.0f);
Serial.println("Battery Voltage: ");
Serial.println(node.getResponseBuffer(0x04) / 100.0f);
Serial.println("Battery Charge Current: ");
Serial.println(node.getResponseBuffer(0x05) / 100.0f);
}
delay(5000);
}
https://tttapa.github.io/ESP8266/Chap04 ... oller.html
Pujde toto použít misto toho SoftwareSerial?ESP8266 má dva hardwarové UARTS (sériové porty):
UART0 na pinech 1 a 3 (TX0 a RX0 resp.) a UART1 na pinech 2 a 8 (TX1 a RX1 resp.), nicméně pro připojení flash čipu se používá GPIO8 . To znamená, že UART1 může pouze odesilat data.
UART0 má také hardwarové řízení toku na pinech 15 a 13 (RTS0 a CTS0 resp.).Tyto dva kolíky lze také použít jako alternativní kolíky TX0 a RX0.
Chcete-li použít alternativní piny (TX = GPIO15, RX = GPIO13), použijte Serial.swap()po Serial.begin.
Na TX = GPIO15, RX = GPIO13 připojit RS485 přes kterou bych data četl a přes klasický ser. port je vypisoval?
Děkují.