Alleen 3 regels uit p1 poort

Arduino specifieke Software
Berichten: 239
Geregistreerd: 03 Okt 2015, 13:39

Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 05 Dec 2019, 16:39

Hallo Allemaal,

Na een paar dagen stoeien en zoeken op onder andere dit forum maar eens kijken of iemand mij kan helpen.

Als eerste mijn sketch die ik gevonden heb op het net..

Code: Alles selecteren
#include <AltSoftSerial.h>
// AltSoftSerial always uses these pins:
//
// Board          Transmit  Receive   PWM Unusable
// -----          --------  -------   ------------
// Teensy 2.0         9        10       (none)
// Teensy++ 2.0      25         4       26, 27
// Arduino Uno        9         8         10
// Arduino Mega      46        48       44, 45
// Wiring-S           5         6          4
// Sanguino          13        14         12
 
AltSoftSerial altSerial;
 
char input; // inkomende seriele data (byte)
bool readnextLine = false;
#define BUFSIZE 75
char buffer[BUFSIZE]; //Buffer voor seriele data om \n te vinden.
int bufpos = 0;
long mEVLT = 0; //Meterstand Elektra - verbruik laag tarief
long mEVHT = 0; //Meterstand Elektra - verbruik hoog tarief
long mETLT = 0; //Meterstand Elektra - teruglevering laag tarief
long mETHT = 0; //Meterstand Elektra - teruglevering hoog tarief
long mEAV = 0;  //Meterstand Elektra - actueel verbruik
long mEAT = 0;  //Meterstand Elektra - actueel teruglevering
float mG = 0;   //Meterstand Gas
 
void setup() {
  Serial.begin(9600);
  altSerial.begin(9600);
}
 
void loop() {
long tl = 0;
long tld =0;
 
  if (altSerial.available()) {
    input = altSerial.read();
   
    // --- 7 bits instelling ---
    input &= ~(1 << 7);
    char inChar = (char)input;
    // --- 7 bits instelling ---
 
    //Serial.print(input); //Debug
 
    // Vul buffer tot en met een nieuwe lijn (\n)
    buffer[bufpos] = input&127;
    bufpos++;
 
    if (input == '\n') { // we hebben een lijn binnen (gegevens tot \n)
 
      // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
      if (sscanf(buffer,"1-0:1.8.1(%ld%.%ld%*s" , &tl, &tld) >0 ) {
        mEVLT = tl * 1000 + tld;
        if (mEVLT > 0) {
          Serial.print("Elektra - meterstand verbruik LAAG tarief (Wh): ");
          Serial.println(mEVLT);
          mEVLT = 0;
        }
      }
 
      // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
      if (sscanf(buffer,"1-0:1.8.2(%ld%.%ld%*s" , &tl, &tld) >0 ) {
        mEVHT = tl * 1000 + tld;
        if (mEVHT > 0) {
          Serial.print("Elektra - meterstand verbruik HOOG tarief (Wh): ");
          Serial.println(mEVHT);
          mEVHT = 0;
        }
      }
 
      // 1-0:1.7.0 = Elektra actueel verbruik (DSMR v4.0)
      if (sscanf(buffer,"1-0:1.7.0(%ld.%ld%*s" , &tl , &tld) >0 ) {
        mEAV = tl * 1000 + tld * 10;
        if (mEAV > 0) {
          Serial.print("Elektra - actueel verbruik (W): ");
          Serial.println(mEAV);
          mEAV = 0;
        }
      }
 
      // 1-0:2.8.1 = Elektra teruglevering hoog tarief (DSMR v4.0)
      if (sscanf(buffer,"1-0:2.8.1(%ld%.%ld%*s" , &tl, &tld) >0 ) {
        mETLT = tl * 1000 + tld;
        if (mETLT > 0) {
          Serial.print("Elektra - meterstand teruglevering LAAG tarief (Wh): ");
          Serial.println(mETLT);
          mETLT = 0;
        }
      }
 
      // 1-0:2.8.2 = Elektra teruglevering hoog tarief (DSMR v4.0)
      if (sscanf(buffer,"1-0:2.8.2(%ld%.%ld%*s" , &tl, &tld) >0 ) {
        mETHT = tl * 1000 + tld;
        if (mETHT > 0) {
          Serial.print("Elektra - meterstand teruglevering HOOG tarief (Wh): ");
          Serial.println(mETHT);
          mETHT = 0;
        }
      }
 
      // 1-0:2.7.0 = Elektra actueel teruglevering (DSMR v4.0)
      if (sscanf(buffer,"1-0:2.7.0(%ld.%ld%*s" , &tl , &tld) >0  ) {
        mEAT = tl * 1000 + tld * 10;
        if (mEAT > 0) {
          Serial.print("Elektra - actueel teruglevering (W): ");
          Serial.println(mEAT);
          mEAT = 0;
        }
      }
 
      // 0-1:24.3.0 = Gas (DSMR v4.0)
      if (sscanf(buffer,"0-1:24.3.0(%6ld%4ld%*s" , &tl, &tld) > 0  ) {
        readnextLine = true; // we moeten de volgende lijn hebben
      }
      if (readnextLine){
        if (sscanf(buffer,"(%ld.%ld%*s" , &tl, &tld) >0  ) {
          mG = float ( tl * 1000 + tld ) / 1000;
          Serial.print("Gas - meterstand (m3): ");
          Serial.println(mG);
          Serial.println("");
          readnextLine = false;
        }
      }
 
      // Maak de buffer weer leeg (hele array)
      for (int i=0; i<75; i++)
      { buffer[i] = 0;}
      bufpos = 0;
    }
  }
}



Ik heb verschillende meters waarop ik kan testen waaronder DSMR 4.0.
Als ik deze code gebruik met mijn Uno en SN74LS00N dan komen er maar 3 regels uitrollen.

Laag verbruik en Hoog verbruik en Actueel verbruik.

Weet iemand wat hier niet goed gaat?
Ik heb het vermoeden dat het met snelheid te maken heeft.
Ik heb gezocht op dit forum maar dit probleem ben ik niet tegen gekomen.
Ook de gas stand krijg ik dus niet door!

Advertisement

Gebruikers-avatar
Berichten: 2336
Geregistreerd: 06 Aug 2016, 01:03

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 05 Dec 2019, 17:57

Welk Arduino board gebruik je ?

Is de meter 9600 baud of 115200 baud ? De 9600 kan nog wel met AltSoftSerial. Maar 115200 baud kan een Arduino Uno echt niet met AltSoftSerial.

Kun je het volledige telegram laten zien ? Of laat ze allemaal zien van alle meters.
De gasmeter waarden kunnen er op verschillende manieren in zitten. Je zou iets kunnen maken dat alle manieren van die waarden inleest.

De sketch is bedoeld voor 7-bit tekens. Er waren inderdaad meters die 7-bit tekens gaven. Maar de mijne geeft gewoon 8-bit met 115200 baud en normale tekst.

De sketch is recht-toe-recht-aan, geen bijzonderheden. Er ontbreekt alleen een controle op een buffer overflow; de verdeling tussen globale en lokale variabelen kan beter; en AltSoftSerial heeft zo zijn eigen eigenaardigheden.

Ik zou het zo doen:
Code: Alles selecteren
    // Vul buffer tot en met een nieuwe lijn (\n)
    buffer[bufpos] = input;
    if( bufpos < BUFSIZE - 2)   // laat het laatste teken een '\0'
    {
      bufpos++;
    }

Gebruikers-avatar
Berichten: 140
Geregistreerd: 22 Jan 2013, 16:40

Re: Alleen 3 regels uit p1 poort

Berichtdoor zuid » 05 Dec 2019, 18:03

Volgens mij is een DSMR 4.0 meter inderdaad 115200 Baud en 8 bit
[url]files.domoticaforum.eu/uploads/Smartmetering/DSMR%20v4.0%20final%20P1.pdf[/url]

[url]domoticx.com/p1-poort-slimme-meter-hardware/[/url]

Berichten: 239
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 05 Dec 2019, 19:23

Koepel schreef:Welk Arduino board gebruik je ?

Is de meter 9600 baud of 115200 baud ? De 9600 kan nog wel met AltSoftSerial. Maar 115200 baud kan een Arduino Uno echt niet met AltSoftSerial.

Kun je het volledige telegram laten zien ? Of laat ze allemaal zien van alle meters.
De gasmeter waarden kunnen er op verschillende manieren in zitten. Je zou iets kunnen maken dat alle manieren van die waarden inleest.

De sketch is bedoeld voor 7-bit tekens. Er waren inderdaad meters die 7-bit tekens gaven. Maar de mijne geeft gewoon 8-bit met 115200 baud en normale tekst.

De sketch is recht-toe-recht-aan, geen bijzonderheden. Er ontbreekt alleen een controle op een buffer overflow; de verdeling tussen globale en lokale variabelen kan beter; en AltSoftSerial heeft zo zijn eigen eigenaardigheden.

Ik zou het zo doen:
Code: Alles selecteren
    // Vul buffer tot en met een nieuwe lijn (\n)
    buffer[bufpos] = input;
    if( bufpos < BUFSIZE - 2)   // laat het laatste teken een '\0'
    {
      bufpos++;
    }


Ik doe het nu met een UNO.
Ik heb meters met 9600 en 115200 baudrate, bij alle meters krijg ik maar 3 regels te zien. Wat ik precies te zien krijg kan ik morgen laten zien.
Hij gooit allen de lage en hoge tarief eruit en het actuele verbruik.
Dit doet hij niet bij elke "verversing" overigens. soms mist hij bv het lage verbruik en soms het actuele verbruik.

Ik heb o.a een Landis 350 en 360 en een Iskra mt380 en 355 zo uit mijn hoofd.

Het 7bit en het 8 bit verhaal is me onduidelijk in deze..
Ik kan het morgen wel even met een Mega proberen..

Gebruikers-avatar
Berichten: 2336
Geregistreerd: 06 Aug 2016, 01:03

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 05 Dec 2019, 22:59

Ik denk dat het niet nodig is om het 8-ste bit weg te halen.

Een Arduino Uno die de seriële monitor gebruikt en ook nog stabiel 115200 kan inlezen, dat gaat echt niet lukken met iedere seconde een telegram tot 1000 tekens.
Een Arduino Uno samen met AltSoftSerial kan tot 38400 baud. Met 9600 baud kan dus wel, maar of de Uno dan nog gewoon werkt, dat is maar de vraag.

Ik heb een Arduino Uno met AltSoftSerial op 38400 baud verbonden met een Nextion schermpje voor een klok/alarm die altijd aan staat. Ik hou bij hoeveel fouten er ontstaan. Nu na een jaar zijn er nog geen fouten. Dus dat werkt, maar het zijn maar kleine berichtjes, die nog gemakkelijk in een buffer passen.

Voor die 115200 baud heb je een Arduino Mega 2560 of een Arduino Leonardo (of Micro of Pro Micro) of een Arduino Zero/M0/MKR of een ESP32 of ESP8266 nodig.
https://www.arduino.cc/reference/en/language/functions/communication/serial/

De ESP8266 is een beetje onhandig, maar ik dacht dat die ook van een "tweede" seriële poort kon inlezen. Ik ben vergeten hoe het precies zat, waarschijnlijk is het nodig om een extra verbinding tussen pinnen te maken. Er is ook een SoftwareSerial voor de ESP8266 en die werkt gelukkig vele malen soepeler dan de gewone SoftwareSerial.

De SoftwareSerial library geeft heel heel heel veel problemen (3 keer heel).
De AltSoftSerial library geeft heel heel veel problemen (2 keer heel) ;)
Zodra je zo'n library gebruikt, dan vraag je dus om problemen. En die wil je niet :o

Gebruikers-avatar
Berichten: 2336
Geregistreerd: 06 Aug 2016, 01:03

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 06 Dec 2019, 03:27

Ik heb twee keer je bericht niet goed heb gelezen. Sorry :oops: Je schreef al over een Uno en daarna over een Mega.
Gebruik je dan wel een hardware seriële poort van de Mega ? Dus zonder AltSoftSerial.

Je kunt de "P1 poort tester" eens kunnen proberen: https://www.arduinoforum.nl/viewtopic.php?f=8&t=3535&start=60#p25499.
Als je het een uur of een paar uur laat draaien, dan zou er geen enkele fout mogen optreden.
Die gebruikt voor het inlezen de RX van Serial1, dat is pin 19 op de Arduino Mega 2560, zoals hier staat: https://www.arduino.cc/reference/en/language/functions/communication/serial/.
In de sketch wordt die op 115200 gezet, maar die kun je natuurlijk ook op 9600 zetten. Dat is de regel: Serial1.begin( 115200)

Berichten: 239
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 06 Dec 2019, 11:37

Ik heb zojuist de Mega draaiend gehad met de P1 poort tester op een Landis + Gyr E350 DSMR 4.0.
Dit ging volgens mij goed zo te zien.
Hij geeft wel een fout melding onderaan?

Daarna heb ik de P1 poort tester op een ISKRA MT382 geprobeerd maar daar zonder resultaat. Dit is volgens mij een meter met 9600 Baudrate want deze meter werkte wel met mijn UNO met de sketch die ik in de opening vraag had bijgevoegd. Uiteraard had ik de Serial1.begin(115200); aangepast naar de 9600!



===================================================
De sketch "P1 poort tester" loopt
===================================================
/XMX5LGBBFFB231189743

1-3:0.2.8(42)
0-0:1.0.0(191206095357W)
0-0:96.1.1(4530303035303031353832333630333134)
1-0:1.8.1(037667.243*kWh)
1-0:2.8.1(000000.000*kWh)
1-0:1.8.2(072824.655*kWh)
1-0:2.8.2(000000.000*kWh)
0-0:96.14.0(0002)
1-0:1.7.0(02.585*kW)
1-0:2.7.0(00.000*kW)
0-0:96.7.21(00035)
0-0:96.7.9(00024)
1-0:99.97.0(10)(0-0:96.7.19)(190814064345S)(0000055605*s)(190812071947S)(0000147540*s)(190810072913S)(0000056200*s)(190809073041S)(0000057330*s)(190808071849S)(0000057150*s)(190807072047S)(0000055850*s)(190806071925S)(0000056100*s)(190805062654S)(0000150650*s)(190803065700S)(0000054000*s)(190802060037S)(0000044490*s)
1-0:32.32.0(00013)
1-0:52.32.0(00008)
1-0:72.32.0(00000)
1-0:32.36.0(00000)
1-0:52.36.0(00000)
1-0:72.36.0(00000)
0-0:96.13.1()
0-0:96.13.0()
1-0:31.7.0(003*A)
1-0:51.7.0(007*A)
1-0:71.7.0(003*A)
1-0:21.7.0(00.578*kW)
1-0:41.7.0(01.446*kW)
1-0:61.7.0(00.560*kW)
1-0:22.7.0(00.000*kW)
1-0:42.7.0(00.000*kW)
1-0:62.7.0(00.000*kW)
0-1:24.1.0(003)
0-1:96.1.0(473030
---------------------------------------------------
Aantal telegrammen: 1
Waarvan foute CRC : 1
Telegram iedere : 6.24 seconden
--------------------------------------------------

Gebruikers-avatar
Berichten: 2336
Geregistreerd: 06 Aug 2016, 01:03

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 06 Dec 2019, 13:11

Een enkele fout is mogelijk als je de verbinding maakt of los haalt. Als je echter één telegram hebt gelezen en die is ook nog fout, dat is er iets goed mis. Waarom heb je die "P1 poort tester" niet een uur laten lopen ? Of heb je toevallig één telegram per toeval ontvangen in een uur ?

Waarom de "P1 poort tester" niet werkt met een ISKRA MT382, dat begrijp ik niet. Misschien heeft die iets aparts. De sketch die jij liet zien, die haalt alleen de gegevens uit het telegram en kijkt niet naar de rest.

Die sketch die je liet zien, die heeft extra code om een fout in de waarde van het gas op te vangen. Een heel stel meters heeft een bug waardoor de waarde van het gas over twee regels verdeelt wordt.
De nieuwe meters hebben die fout niet. Dus de sketch zal met beide situaties om moeten kunnen gaan.

Het klinkt nog niet betrouwbaar. Ik heb zelf een Landis + Gyr E350, en die geeft toch echt precies iedere seconde een telegram. Die kan een uur lopen zonder een fout met iedere seconde een telegram. Er staat op dat hij van 2016 is, ik weet niet of hij "DSMR 4.0" is.
Ik inverteer het signaal met een transistor, en die schakeling is geschikt voor 3.3V en 5V. De "enable" (RTS) van de meter krijgt 5V.
Heb je een schema van je hardware ?

Berichten: 239
Geregistreerd: 03 Okt 2015, 13:39

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 06 Dec 2019, 16:15

Ik heb hem 26 registers laten lezen, Aantal telegrammen 26 en 26 fout kreeg ik te zien.

Bijgevoegd een schema van mijn hardware
P1.jpg
P1.jpg (78 KiB) 337 keer bekeken

Gebruikers-avatar
Berichten: 2336
Geregistreerd: 06 Aug 2016, 01:03

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 06 Dec 2019, 18:26

Kun je de verbindingen nog eens goed nakijken ?
Zit het op een breadboard ? Die maken soms (vaak) slecht contact.
Kun je de weerstanden eens doormeten of ze de juiste waarde hebben.
Heb je een lange kabel ?
De 115200 baud over een telefoonkabel is niet geschikt voor lange afstanden.

Ik heb 2k2 voor het signaal van de P1 poort. Daar heb jij 4k7, dat zou geen probleem mogen zijn.

Ergens zit er iets verkeerd. Kun je misschien een tweede circuit met ook een eigen kabel naar de P1 poort maken ? Bij voorkeur gesoldeerd zonder breadboard.

Ik begrijp het symbool van de connector niet. Als je daar een probleem met GND hebt, dan kun je ook dit soort problemen krijgen.
Ik heb dit:
1. 5V niet aangesloten
2. RTS verbonden met Arduino 5V
3. GND verbonden met Arduino GND
4. NC niet aangesloten
5. TXD naar inverter
6. GND niet aangesloten
Volgens mij heb jij wat anders. De ene GND is niet hetzelfde als de andere GND. Ik heb begrepen dat de GND op pin 3 bij de meeste meters aanwezig is.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten