Alleen 3 regels uit p1 poort

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Mrt 2020, 10:33

Nu gebruik ik dus naar volle tevredenheid deze code:
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;

unsigned long mEVLT;   // Meterstand Elektra - verbruik laag tarief
//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( 9600);   // 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);//waardes uit de meter, om te vergelijken

    // 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)
        if( sscanf( buffer, PSTR( "(%ld.%ld%*s"), &tl, &tld) == 2)//ESP versie
        {
          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)
      else if( sscanf( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)//ESP versie
      {
        // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
        mEVLT = tl * 1000 + tld;
       // mEVLT = tl ;  // test voor juiste weergave
        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)
      else if( sscanf( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "1-0:2.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "1-0:2.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "1-0:1.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "1-0:2.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "0-1:24.3.0(%6ld%4ld%*s"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "0-1:24.2.1(%*ld%*c)(%ld.%3ld*m3)"), &tl, &tld) == 2)//esp versie
      {
        // 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)
      else if( sscanf( buffer, PSTR( "!%4x\n"), &crc) == 1)//esp versie
      {
        // 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;
  }
}


Als ik in deze regel :
Code: Alles selecteren
 }
      //else if( sscanf_P( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)//ESP versie
      {

de data naar mijn lcd wil schrijven, hoe pak ik dit aan?

Alles wat ik hierin lijk te willen schrijven krijg ik foutmeldingen..

Advertisement

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Mrt 2020, 10:40

Als ik dan bijvoorbeeld serial print wil toevoegen zoals dit:
Code: Alles selecteren
 }
      //else if( sscanf_P( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if( sscanf( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2)//ESP versie
      Serial.println(test);
     


Dan krijg ik deze foutmelding:
Code: Alles selecteren
 error: expected '}' before 'else'

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Alleen 3 regels uit p1 poort

Berichtdoor nicoverduin » 12 Mrt 2020, 12:50

Dan mis je nog een of meer sluit accolades
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Mrt 2020, 13:20

Als ik de code zo laat dan is het goed maar als ik er alleen Serial.println(test); bij zet krijg ik die melding, dat vind ik gek en kan het niet plaatsen...

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 12 Mrt 2020, 15:57

Mijn voorkeur heeft dat je de hele sketch laat zien, als je ook maar een spatie of komma wijzigt.

De '{' en '}' maken een groep van een paar statements. Als je er eentje weg haalt, dan valt de hele if-else-if structuur uit elkaar.
Daarbinnen kun je vanzelfsprekend van alles toevoegen.

Die rode pijlen wijzen naar de accolades.
Die groene pijl wijst naar de statement die bij elkaar in een groep zijn gezet binnen de '{' en '}'.

Dat je dit weet, dat snap ik ook wel, maar waarschijnlijk heb je even niet opgelet en zitten knoeien met de '{' of de '}' :|
Je hebt toch wel het inspringen van de tekst en zo netjes gehouden ?
Anders zeg ik misschien dat het een puinhoop is als er een spatie verkeerd staat :lol:
Bijlagen
accolades.png
accolades.png (30.11 KiB) 7063 keer bekeken

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Mrt 2020, 16:10

De hele code staat iets verder naar boven.
Als ik die verifieer dan gaat dat goed .

Het stukje waar het om gaat is dit:


Code: Alles selecteren
//else if( sscanf_P( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if ( sscanf( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2) //esp versie
   


Als ik de serial.println erbij zet dan gaat het mis en die snap ik niet..

Code: Alles selecteren
//else if( sscanf_P( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2)
      else if ( sscanf( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2) //esp versie
      Serial.println( "test tekst");

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 12 Mrt 2020, 16:30

Kun je de hele sketch laten zien met die wijziging ? Het gaat om die accolades.

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 12 Mrt 2020, 16:38

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;

unsigned long mEVLT;   // Meterstand Elektra - verbruik laag tarief
//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( 9600);   // 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);//waardes uit de meter, om te vergelijken

    // 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)
        if ( sscanf( buffer, PSTR( "(%ld.%ld%*s"), &tl, &tld) == 2) //ESP versie
        {
          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)
      else if ( sscanf( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2) //ESP versie
      {
        // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
        mEVLT = tl * 1000 + tld;
        // mEVLT = tl ;  // test voor juiste weergave
        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)
      else if ( sscanf( buffer, PSTR( "1-0:1.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2) //esp versie
        Serial.println( "test tekst");

      {
        // 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)
      else if ( sscanf( buffer, PSTR( "1-0:2.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2) //esp versie

      {
        // 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)
      else if ( sscanf( buffer, PSTR( "1-0:2.8.2(%ld.%3ld*kWh)"), &tl, &tld) == 2) //esp versie
      {
        // 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)
      else if ( sscanf( buffer, PSTR( "1-0:1.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2) //esp versie
      {
        // 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)
      else if ( sscanf( buffer, PSTR( "1-0:2.7.0(%ld.%3ld*kW)"), &tl, &tld) == 2) //esp versie
      {
        // 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)
      else if ( sscanf( buffer, PSTR( "0-1:24.3.0(%6ld%4ld%*s"), &tl, &tld) == 2) //esp versie
      {
        // 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)
      else if ( sscanf( buffer, PSTR( "0-1:24.2.1(%*ld%*c)(%ld.%3ld*m3)"), &tl, &tld) == 2) //esp versie
      {
        // 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)
      else if ( sscanf( buffer, PSTR( "!%4x\n"), &crc) == 1) //esp versie
      {
        // 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;
  }
}

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor Koepel » 12 Mrt 2020, 20:44

Je zult toch echt zelf moeten zien waar het mis gaat, ik ga niet de schets voor je corrigeren door die ene regel op de juiste plaats te zetten.

Een if-statement met veel if-else-if-enzovoorts ziet er zo uit:
cpp code
if( conditie)
statement;
else if( andere conditie)
een ander statement;
else
weer een ander statement;


Bijvoorbeeld:
cpp code
if( paprika == ROOD)
maakPaella();
else if( paprika == GEEL)
eetDePaprika();
else
lustIkNiet();


Er is dus steeds maar ruimte voor één statement. Als je er meerdere wilt, dan groepeer je die bij elkaar met de accolades:
cpp code
if( paprika == ROOD)
{
koopZeevruchten();
maakPaella();
}
else if( paprika == GEEL)
{
snijDePaprikaInStukjes();
eetDePaprika();
}
else
{
Serial.println("Is deze paprika groen of zo?");
lustIkNiet();
}


Wat jij doet is de hele if-else-if structuur met de '{' en '}' in de war gooien, door die ene regel die je hebt toevoegd.
Kijk nu nog eens naar mijn plaatje met de rode en groene pijlen.

P.S.: De sscanf() is de normale functie die al vele tientallen jaren bestaat in de 'c' programmertaal. De sscanf_P() is een extra functie die alleen bestaat voor de eenvoudige Arduino boards zoals de Arduino Uno en Arduino Mega 2560. Ik had dat als extraatje gedaan om geheugen te besparen, maar dat was eigenlijk nergens voor nodig.

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

Re: Alleen 3 regels uit p1 poort

Berichtdoor DeDraak » 13 Mrt 2020, 11:42

Hmm ik ben niet blond maar ik kom er echt niet uit..

De reden dat ik in dat stukje iets wil doen omdat ik die waarde naar een lcd wil schrijven.
De waarde achter else if wil ik dus naar een lcd schrijven.
En juist die else if staat niet tussen accolades of zie ik het gewoon niet?

Code: Alles selecteren
{
        // 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)
      else if ( sscanf( buffer, PSTR( "1-0:1.8.1(%ld.%3ld*kWh)"), &tl, &tld) == 2) //ESP versie
      {
        // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0)
        mEVLT = tl * 1000 + tld;
        // mEVLT = tl ;  // test voor juiste weergave
        Serial.print( F( "Elektra - meterstand verbruik LAAG tarief (Wh): "));
        Serial.println( mEVLT);
      }

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: efaviuduzol en 7 gasten