Alleen 3 regels uit p1 poort

Arduino specifieke Software
Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 11 Dec 2019, 15:18

En nu zonder AltSoftSerial.

Advertisement

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 11 Dec 2019, 15:25

Koepel schreef:En nu zonder AltSoftSerial.


Ja die ga ik morgen even testen, ik vervang Altserial dan voor Serial1 bedoel je toch?

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 11 Dec 2019, 15:28

Ja, de hardware Serial1 poort met RX op pin 19.

De Arduino Mega 2560 is niet sneller dan een Arduino Uno. Dus alle problemen met SoftwareSerial en AltSoftSerial gelden ook voor de Mega 2560.

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 11 Dec 2019, 16:01

Als dat zo is waarom draait die P1 poort tester van jou niet op een Uno dan?

Ik ga morgen even die eerste p1 sketch (waar die Altserial in stond) testen op een mega zonder die Altserial. Dan laat ik dat daarna even weten hoe dat ging.

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 11 Dec 2019, 18:25

Omdat de Arduino Uno geen vrije hardware seriële poort over heeft. En de SoftwareSerial of AltSoftSerial geven heel heel heel / heel heel veel problemen (3 x heel of 2 x heel, afhankelijk van welke je kiest).

De Arduino Leonardo heeft een vrije hardware seriële poort, en die kan daarmee dus 115200 baud inlezen.
De Arduino Mega 2560 heeft wel drie vrije hardware seriële poorten.

De Arduino Uno / Mega / Leonardo boards zijn allemaal 16MHz boards met microcontrollers van de AVR family. De snelheid is zo ongeveer hetzelfde.

Zoals ik al schreef: Zodra je SoftwareSerial of AltSoftSerial gaat gebruiken, dan vraag je om problemen. En die wil je niet.

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 11 Dec 2019, 20:23

En de ESP32? Ik had al een fout met: #include <util/crc16.h> Dit zal wel niet gaan met ESP?!

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 11 Dec 2019, 21:31

DeDraak schreef:En de ESP32? Ik had al een fout met: #include <util/crc16.h> Dit zal wel niet gaan met ESP?!
Daar ben ik nog niet aan toe.

Kun je de getallen van deze sketch controleren voor DSMR v5.0 ? Dat klopt volgens mij wel. Kun je daarna ook een oudere meter proberen. Als je een waarde niet ziet, of een getal klopt niet, kun je dan die regel uit het telegram laten zien ? Dan kan ik mijn sketch daar op aanpassen.

Code: Alles selecteren
// Aangepast voor Arduino Mega 2560
// Het geinverteerde P1 poort signaal wordt verbonden met pin 19 (Serial1 RX).
//

const int buttonPin = 2;    // schakelaar op pin 2, hoog voor 115200, laag voor 9600.
int lastButtonState;

bool readnextLine = false;

#define BUFSIZE 75
char buffer[BUFSIZE];    // Buffer voor seriele data voor een regel tot \n
int bufpos = 0;

unsigned long previousMillis;

long mEVLT;   // Meterstand Elektra - verbruik laag tarief
long mEVHT;   // Meterstand Elektra - verbruik hoog tarief
long mETLT;   // Meterstand Elektra - teruglevering laag tarief
long mETHT;   // Meterstand Elektra - teruglevering hoog tarief
long mEAV;    // Meterstand Elektra - actueel verbruik
long mEAT;    // Meterstand Elektra - actueel teruglevering
float mG;     // Meterstand Gas


void setup()
{
  Serial.begin( 115200);   // seriele monitor op de computer
  Serial.println( "Gestart");

  // Ik heb RTS aan pin 13
  // pinMode( 13, OUTPUT);
  // digitalWrite( 13, HIGH);

  pinMode( buttonPin, INPUT_PULLUP);      // de schakelaar aan pin 2 en GND

  int buttonState = digitalRead( buttonPin);
  if( buttonState == LOW)
  {
    Serial1.begin( 9600);
    Serial.println( F( "P1 poort op 9600 baud"));
  }
  else
  {
    Serial1.begin( 115200);
    Serial.println( F( "P1 poort op 115200 baud"));
  }
  lastButtonState = buttonState;
}


void loop()
{
  // -------------------------------
  // Verwerk de data van de P1 poort
  // -------------------------------

  long tl = 0;
  long tld = 0;
  unsigned int crc;    // 16 bits crc

  if( Serial1.available())     // iets van de P1 poort ?
  {
    char inChar = Serial1.read();

    // Het zou 8N1 kunnen zijn, maar ook 7E1.
    // Verwijder de eventuele parity bit in het hoogste bit.
    inChar &= 0x7F;
   
    // Vul buffer tot en met een nieuwe lijn (\n)
    buffer[bufpos] = inChar;

    // Voor debuggen:
    // Serial.write( inChar);

    // Laat de laatste positie een nul, zodat het een zero-terminated string blijft.
    // De laatste positie is "BUFSIZE - 1".
    // Het laatste teken kan dan nog op "BUFSIZE - 2".
    if( bufpos < BUFSIZE - 2)
    {
      bufpos++;
    }

    if( inChar == '\n')        // we hebben een lijn binnen (gegevens tot \n)
    {
      if( readnextLine)
      {
        // Er zit een bug in sommige telegrammen, waardoor de gaswaarde over twee regels is verdeeld.
        // Als de eerste regel is ontvangen, dan kan de volgende regel gelezen worden.
        // Die tweede regel moet de gaswaarde bevatten.
        // Als dat niet zo is, dan wordt de gaswaarde niet meer gelezen.
        if( sscanf_P( buffer, PSTR( "(%ld.%ld%*s"), &tl, &tld) == 2)
        {
          mG = float( tl * 1000 + tld ) / 1000.0;
          Serial.print( F( "Gas     - meterstand (m3): "));
          Serial.println( mG);
        }
        readnextLine = false;
      }
      else if( buffer[0] == '/')
      {
        // Het telegram begint met een slash '/'.
        unsigned long currentMillis = millis();
        float t = float( currentMillis - previousMillis) / 1000.0;  // de tijd tussen twee telegrammen in seconden
        Serial.print( F( "---> Telegram iedere : "));
        Serial.print( t, 2);
        Serial.println( F( " seconden"));
        previousMillis = currentMillis;
      }
      else if( sscanf_P( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      {
        // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
        mEVLT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand verbruik LAAG tarief (Wh): "));
        Serial.println( mEVLT);
      }
      else if( sscanf_P( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      {
        // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0)
        mEVHT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand verbruik HOOG tarief (Wh): "));
        Serial.println( mEVHT);
      }
      else if( sscanf_P( buffer, PSTR( "1-0:2.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      {
        // 1-0:2.8.1 = Elektra teruglevering hoog tarief (DSMR v4.0)
        mETLT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand teruglevering LAAG tarief (Wh): "));
        Serial.println( mETLT);
      }
      else if( sscanf_P( buffer, PSTR( "1-0:2.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      {
        // 1-0:2.8.2 = Elektra teruglevering hoog tarief (DSMR v4.0)
        mETHT = tl * 1000 + tld;
        Serial.print( F( "Elektra - meterstand teruglevering HOOG tarief (Wh): "));
        Serial.println( mETHT);
      }
      else if( sscanf_P( buffer, PSTR( "1-0:1.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)
      {
        // Dit is mogelijk anders voor DSMR v4.0 en DSMR v5.0.
        // Hieronder staat voor 5.0
        // 1-0:1.7.0 = Elektra actueel verbruik
        mEAV = tl * 1000 + tld;
        Serial.print( F( "Elektra - actueel verbruik (W): "));
        Serial.println( mEAV);
      }
      else if( sscanf_P( buffer, PSTR( "1-0:2.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)
      {
        // Dit is mogelijk anders voor DSMR v4.0 en DSMR v5.0.
        // Hieronder staat voor 5.0
        // 1-0:2.7.0 = Elektra actueel teruglevering
        mEAT = tl * 1000 + tld;
        Serial.print( F( "Elektra - actueel teruglevering (W): "));
        Serial.println(mEAT);
      }
      else if( sscanf_P( buffer, PSTR( "0-1:24.3.0(%6ld%4ld%*s"), &tl, &tld) == 2)
      {
        // 0-1:24.3.0 = Gas (DSMR v4.0)
        // Dit is de gaswaarde met de bug, waardoor dit over twee regels is verdeeld.
        readnextLine = true; // we moeten de volgende lijn hebben
      }
      else if( sscanf_P( buffer, PSTR( "0-1:24.2.1(%*ld%*c)(%ld.%3ld*m3)"), &tl, &tld) == 2)
      {
        // De gaswaarde zonder de bug (DSMR v5.0)
        mG = float( tl * 1000 + tld ) / 1000.0;
        Serial.print( F( "Gas     - meterstand (m3): "));
        Serial.println( mG, 3);
      }
      else if( sscanf_P( buffer, PSTR( "!%4x\n"), &crc) == 1)
      {
        // Kijk of er een checksum voorbij komt
        Serial.print( F( "---> CRC checksum gedetecteerd: "));
        Serial.println( crc, HEX);
      }

      // Maak de buffer weer leeg (hele array)
      memset( buffer, 0, BUFSIZE);
      bufpos = 0;
    }
  }


  // -------------------------------
  // Kijk of de schakelaar wordt omgezet
  // -------------------------------
  int buttonState = digitalRead( buttonPin);
  if( buttonState != lastButtonState)
  {
    // reset sommige variabelen voor de zekerheid
    readnextLine = false;
    memset( buffer, 0, BUFSIZE);
    bufpos = 0;
    previousMillis = millis();
   
    if( buttonState == LOW)
    {
      Serial1.end();
      Serial1.begin( 9600);
      Serial.println( F( "P1 poort op 9600 baud"));
    }
    else
    {
      Serial1.end();
      Serial1.begin( 115200);
      Serial.println( F( "P1 poort op 115200 baud"));
    }

    lastButtonState = buttonState;
  }
}

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Dec 2019, 13:36

Hallo Koepel,

Ik heb hem zojuist op een DSMR5.0 getest (Landis+Gyr E360) En daar kreeg ik de volgende gegevens uit.
Ik zie alleen dat mijn elektra meterstanden niet helemaal kloppen maar dit ter info.. Deze moeten gedeeld worden denk ik. Mijn echte standen zijn:

Laag: 1528 Kw
Hoog: 1392 Kw
Gas : 336M3

Actueel verbruik klopte wel in Watts.

Dit ziet er dus goed uit! Ik zal morgen even de DSMR2.2 meter testen op 9600.


Code: Alles selecteren
12:32:20.432 -> Gestart
12:32:20.432 -> P1 poort op 115200 baud
12:32:20.467 -> ---> CRC checksum gedetecteerd: 9690
12:32:21.025 -> ---> Telegram iedere : 0.62 seconden
12:32:21.058 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:21.092 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391858
12:32:21.092 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:21.092 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:21.129 -> Elektra - actueel verbruik (W): 2756
12:32:21.129 -> Elektra - actueel teruglevering (W): 0
12:32:21.312 -> Gas     - meterstand (m3): 335.530
12:32:21.450 -> ---> CRC checksum gedetecteerd: 350A
12:32:22.041 -> ---> Telegram iedere : 1.00 seconden
12:32:22.074 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:22.074 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391859
12:32:22.108 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:22.108 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:22.108 -> Elektra - actueel verbruik (W): 2778
12:32:22.142 -> Elektra - actueel teruglevering (W): 0
12:32:22.319 -> Gas     - meterstand (m3): 335.530
12:32:22.462 -> ---> CRC checksum gedetecteerd: 2310
12:32:23.041 -> ---> Telegram iedere : 1.00 seconden
12:32:23.075 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:23.075 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391860
12:32:23.075 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:23.110 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:23.110 -> Elektra - actueel verbruik (W): 2760
12:32:23.143 -> Elektra - actueel teruglevering (W): 0
12:32:23.320 -> Gas     - meterstand (m3): 335.530
12:32:23.464 -> ---> CRC checksum gedetecteerd: 6888
12:32:24.031 -> ---> Telegram iedere : 1.00 seconden
12:32:24.069 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:24.069 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391860
12:32:24.103 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:24.103 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:24.103 -> Elektra - actueel verbruik (W): 2634
12:32:24.137 -> Elektra - actueel teruglevering (W): 0
12:32:24.319 -> Gas     - meterstand (m3): 335.530
12:32:24.458 -> ---> CRC checksum gedetecteerd: E2C3
12:32:25.042 -> ---> Telegram iedere : 1.00 seconden
12:32:25.079 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:25.079 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391861
12:32:25.079 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:25.117 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:25.117 -> Elektra - actueel verbruik (W): 2626
12:32:25.117 -> Elektra - actueel teruglevering (W): 0
12:32:25.331 -> Gas     - meterstand (m3): 335.530
12:32:25.467 -> ---> CRC checksum gedetecteerd: 5C6D
12:32:26.017 -> ---> Telegram iedere : 1.00 seconden
12:32:26.090 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:26.090 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391862
12:32:26.090 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:26.090 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:26.127 -> Elektra - actueel verbruik (W): 2628
12:32:26.127 -> Elektra - actueel teruglevering (W): 0
12:32:26.304 -> Gas     - meterstand (m3): 335.530
12:32:26.448 -> ---> CRC checksum gedetecteerd: A419
12:32:27.036 -> ---> Telegram iedere : 1.00 seconden
12:32:27.072 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:27.072 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391863
12:32:27.106 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:27.106 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:27.106 -> Elektra - actueel verbruik (W): 2626
12:32:27.144 -> Elektra - actueel teruglevering (W): 0
12:32:27.324 -> Gas     - meterstand (m3): 335.530
12:32:27.459 -> ---> CRC checksum gedetecteerd: B83D
12:32:28.025 -> ---> Telegram iedere : 1.00 seconden
12:32:28.058 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:28.095 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391863
12:32:28.095 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:28.095 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:28.132 -> Elektra - actueel verbruik (W): 2629
12:32:28.132 -> Elektra - actueel teruglevering (W): 0
12:32:28.303 -> Gas     - meterstand (m3): 335.530
12:32:28.437 -> ---> CRC checksum gedetecteerd: F1A2
12:32:29.032 -> ---> Telegram iedere : 1.00 seconden
12:32:29.066 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:29.102 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391864
12:32:29.102 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:29.102 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:29.138 -> Elektra - actueel verbruik (W): 2627
12:32:29.138 -> Elektra - actueel teruglevering (W): 0
12:32:29.310 -> Gas     - meterstand (m3): 335.530
12:32:29.446 -> ---> CRC checksum gedetecteerd: A2E
12:32:30.034 -> ---> Telegram iedere : 1.00 seconden
12:32:30.070 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:30.070 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391865
12:32:30.104 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:30.104 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:30.104 -> Elektra - actueel verbruik (W): 2627
12:32:30.139 -> Elektra - actueel teruglevering (W): 0
12:32:30.324 -> Gas     - meterstand (m3): 335.530
12:32:30.459 -> ---> CRC checksum gedetecteerd: 60D4
12:32:31.017 -> ---> Telegram iedere : 1.00 seconden
12:32:31.086 -> Elektra - meterstand verbruik LAAG tarief (Wh): 1528692
12:32:31.086 -> Elektra - meterstand verbruik HOOG tarief (Wh): 1391866
12:32:31.086 -> Elektra - meterstand teruglevering LAAG tarief (Wh): 0
12:32:31.086 -> Elektra - meterstand teruglevering HOOG tarief (Wh): 0
12:32:31.119 -> Elektra - actueel verbruik (W): 2623
12:32:31.119 -> Elektra - actueel teruglevering (W): 0
12:32:31.297 -> Gas     - meterstand (m3): 335.530
12:32:31.442 -> ---> CRC checksum gedetecteerd: EACB

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 12 Dec 2019, 15:31

Die sketch laat de meterstanden zien in Wh. Dus het klopt wel.
Waarom weet ik ook niet, ik dacht dat jij dat zo wilde. Dat is wat die sketch met de getallen doet.
Als je het anders wilt, dan kun je de sketch wijzigen.

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Dec 2019, 16:09

Koepel schreef:Die sketch laat de meterstanden zien in Wh. Dus het klopt wel.
Waarom weet ik ook niet, ik dacht dat jij dat zo wilde. Dat is wat die sketch met de getallen doet.
Als je het anders wilt, dan kun je de sketch wijzigen.


Je hebt gelijk, Weet niet hoe ik erbij kom maar staat duidelijk Wh..

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten