EPsolar + ESP8266 - vyčitaní dat přes Modbus

Odpovědět
Le-Ze
Příspěvky: 203
Registrován: 24 črc 2017, 08:15
Reputation: 0

EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od Le-Ze » 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.

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);
 }
Bych to ale chtěl použit přes ESP8266 NodeMcu V3
https://tttapa.github.io/ESP8266/Chap04 ... oller.html
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.
Tak jsem to zkusil přes SoftwareSerial.
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);
 }
A dotaz k tomuto.
https://tttapa.github.io/ESP8266/Chap04 ... oller.html
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.
Pujde toto použít misto toho SoftwareSerial?
Na TX = GPIO15, RX = GPIO13 připojit RS485 přes kterou bych data četl a přes klasický ser. port je vypisoval?

Děkují.

Le-Ze
Příspěvky: 203
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od Le-Ze » 13 kvě 2023, 11:41

Už mám vyřešene a funguje to.
Jen bych chtél čist všechny informace.
Jsem dostal toto, ale je to nějak poplantane.

Kód: Vybrat vše

 resultMain = node.readInputRegisters(0x3100, 16);
  if (resultMain == node.ku8MBSuccess)
  {
    

Serial.println(" - - - - - - - - - - - - - - ");
  
    //----------------------------------------------------------------------------------------
    pn=node.getResponseBuffer(0x00)/ 100.0f;
    Serial.print("Panely napeti: " ); // PV Voltage
    Serial.println(pn);
     //----------------------------------------------------------------------------------------
    pp=node.getResponseBuffer(0x01)/ 100.0f; 
    Serial.print("Panely proud: ");  // PV Current
    Serial.println(pp);
    //----------------------------------------------------------------------------------------
    pv=(node.getResponseBuffer(0x02) | node.getResponseBuffer(0x03) << 16)/ 100.0f;
    Serial.print("Panely vykon: ");
    Serial.println(pv);
    //----------------------------------------------------------------------------------------
    bn=node.getResponseBuffer(0x04)/ 100.0f;
    Serial.print("Baterie napeti: "); // Battery Voltage
    Serial.println(bn);
    //----------------------------------------------------------------------------------------
    bp=node.getResponseBuffer(0x05)/ 100.0f;
    Serial.print("Baterie proud: "); // Battery Charge Current
    Serial.println(bp);
    //----------------------------------------------------------------------------------------
    bv=(node.getResponseBuffer(0x06) | node.getResponseBuffer(0x07) << 16)/ 100.0f;
    Serial.print("Baterie vykon: ");
    Serial.println(bv);
  //----------------------------------------------------------------------------------------
    bstatus=node.getResponseBuffer(0x00);
    Serial.print("Batery stav: ");
    Serial.println(bstatus);
  //----------------------------------------------------------------------------------------
    bmax=node.getResponseBuffer(0x02)/ 100.0f;
    Serial.print("Baterie max: ");
    Serial.println(bmax);
   //----------------------------------------------------------------------------------------
    bmin=node.getResponseBuffer(0x03)/ 100.0f;
    Serial.print("Baterie min: ");
    Serial.println(bmin);
    //----------------------------------------------------------------------------------------
    btemp=node.getResponseBuffer(0x0)/ 100.0f;
    Serial.print("Baterie teplota: ");
    Serial.println(dtemp);
    //----------------------------------------------------------------------------------------
    dtemp=node.getResponseBuffer(0x1)/ 100.0f;
    Serial.print("Teplota zarízeni: ");
    Serial.println(btemp);
    //----------------------------------------------------------------------------------------
    bsoc=node.getResponseBuffer(0xa)/ 100.0f;
    Serial.print("Baterie soc: ");
    Serial.println(bsoc);
    //----------------------------------------------------------------------------------------
    ednes=(node.getResponseBuffer(0x00) | node.getResponseBuffer(0x01) << 16)/ 100.0f;
    Serial.print("Baterie - energie dnes: ");
    Serial.println(ednes);
    //----------------------------------------------------------------------------------------
    Serial.print("Baterie - energie mesic: ");
    emesic=(node.getResponseBuffer(0x02) | node.getResponseBuffer(0x03) << 16)/ 100.0f;
    Serial.println(emesic);
    //----------------------------------------------------------------------------------------
    erok=(node.getResponseBuffer(0x04) | node.getResponseBuffer(0x05) << 16)/ 100.0f;
    Serial.print("Baterie - energie rok: ");
    Serial.println(erok);
    //----------------------------------------------------------------------------------------
    etotal=(node.getResponseBuffer(0x06) | node.getResponseBuffer(0x07) << 16)/ 100.0f;
    Serial.print("Baterie - energie celkem: ");
    Serial.println(etotal);
     //----------------------------------------------------------------------------------------
    cstatus=node.getResponseBuffer(0x01); 
    Serial.print("Stav nabijeni: ");
    Serial.println(cstatus);
    //----------------------------------------------------------------------------------------
    dstatus=node.getResponseBuffer(0x02);
    Serial.print("Stav zarizeni: ");
    Serial.println(dstatus);
 //----------------------------------------------------------------------------------------
   
  }
Batery stav: 6771.00
Baterie max: 97.62
Baterie teplota: 1.38

Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od Diego » 13 kvě 2023, 19:56

SoftwareSerial jsem na ESP zkousel taky ale nepovedlo se mi to rozchodit. Muzete poradit jak na to?
Diky
https://arze.cz - ARduino Zapojení Elektronika

Le-Ze
Příspěvky: 203
Registrován: 24 črc 2017, 08:15
Reputation: 0

Re: EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od Le-Ze » 13 kvě 2023, 20:19

Diego píše:
13 kvě 2023, 19:56
SoftwareSerial jsem na ESP zkousel taky ale nepovedlo se mi to rozchodit. Muzete poradit jak na to?
Diky
Vykašli se na SoftwareSerial .
Mi to normalně funguje přes ESP8266 NodeMcu V3 a kamoš to zkoučel i přes Wemos D1 mini a take funkční.Jen některe data nesehí.
Na ESP8266 připojit rs485 na rx a tx (GPIO1 a 3)

ESP8266 ma i serial1 ale přes něj se da jen odesilat data.
Na ten mám připojene dalši rs485 a odesilam ty data do raspi.

https://forum.arduino.cc/t/arduino-modbus-issues/470715
https://forum.arduino.cc/t/serial-port/648783
https://forum.arduino.cc/t/epever-registers/1097048
https://cdck-file-uploads-europe1.s3.du ... 3f756b.pdf

Uživatelský avatar
Diego
Příspěvky: 169
Registrován: 23 črc 2017, 09:43
Reputation: 0
Kontaktovat uživatele:

Re: EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od Diego » 13 kvě 2023, 20:28

Tohle chapu, me jde o muj projekt kde jsem chtel pouzit softwareserial a nakonec jsem se na esp vys... jsou s nim jen problemy
https://arze.cz - ARduino Zapojení Elektronika

ok3js
Příspěvky: 1
Registrován: 03 zář 2023, 08:18
Reputation: 0

Re: EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od ok3js » 03 zář 2023, 08:31

včera se mi konečně podařilo rozchodit vyčítání dat z elektroměru pomocí malé eps8266-01 (esp01, prevodni deska na 5v, a ttl rs485, vše dohromady do 100kc).
Esp data vyčte a odesle na server emoncms.org, kde už loguji data z měniče Siton 210.
Diky mizernému popisu knihoven, jsem zapasil 3 dny s vyčítáním long dat . Nemám ošetřeny chyby , snad je knihovna hlídá sama.

pokud bude zajem, dám se ino.

https://photos.app.goo.gl/UoWaHdaACUoDckgc7

BigSandy
Příspěvky: 220
Registrován: 23 zář 2017, 07:09
Reputation: 0

Re: EPsolar + ESP8266 - vyčitaní dat přes Modbus

Příspěvek od BigSandy » 03 zář 2023, 09:18

ok3js píše:
03 zář 2023, 08:31
včera se mi konečně podařilo rozchodit vyčítání dat z elektroměru pomocí malé eps8266-01
Co to je za elektroměr?

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Bing [Bot] a 14 hostů