Landis+gyr E350

Apr 20, 2015 at 7:01 PM
Ook ik had wat moeite om de E350 aan de gang te krijgen. Er kwamen vreemde waardes naar boven waar ik niet zoveel mee kon. Daarom heb ik e.e.a. aangepast in de code en het werkt nu lekker.
Hardwarematig zit er ook een kleine wijziging in aangezien de data continu binnenkwam wat een potentiele overflow gaf. in plaat van de 5V aansluiting van de P1 poort, heb ik deze aangesloten op pin 13 van de arduino. Verder heb ik de standaard transistormethode gebruikt. Het voordeel nu is dat ik een echte request for data kan geven aan de slimme meter en er niet continu van alles binnenkomt.
P1Power.cpp is als volgt geworden:
#include "P1Power.h"

P1Power::P1Power(HardwareSerial *serIn, int sid, byte t, int f) : BaseSensor(1000,sid,f) // 1000 is dummy. not used for P1
{
  Type = t; // default = 24, same as ferraris sensor: log net consumption
  serial = serIn;
}

void P1Power::Begin(byte i)
{
  BaseSensor::Begin(i);
  serial->begin(115200);
}

void P1Power::Reset()
{
  Today    = 0;
  Midnight = (m1+m2) - (m3+m4); 
  BaseSensor::Reset();
} 

void P1Power::CalculateActuals()
{
  Actual = PowerUsage - PowerSolar;
  if(Peak < abs(Actual)) Peak = Actual; 
  todayCnt = ((m1+m2)-(m3+m4)) - Midnight;
  Today = todayCnt;
}

void P1Power::Loop(int m) {
  char c;
  long tl,tld;
  int i,j;

  
  digitalWrite(13, HIGH);
  c = ' ';
  while (c != '!'){
    if (Serial1.available()){
      c = Serial1.read();
      c &= ~(1 << 7);
      Serial.print(c);
      
      if (c == '\n'){
        buffer[bufpos] = '\0';
        bufpos = 0;
        
        if (sscanf(buffer,"1-0:%d.8.%d(%ld.%ld" , &i, &j, &tl, &tld)==4){ 
          tl *= 1000;
          tl += tld;
          if(i == 1){
            if(j == 1) m2= tl;
            if(j == 2) m1 = tl;
          }
          if(i == 2){
            if(j == 1) m4 = tl;
            if(j == 2) m3 = tl;
          }
        }
        if (sscanf(buffer,"1-0:%d.7.0(%ld.%ld" , &i, &tl , &tld) == 3){ 
          tl *= 1000;
          tl += tld;
          if(i == 1) PowerUsage = tl;
          if(i == 2) PowerSolar = tl;
        }
        if (sscanf(buffer,"0-1:24.2.1(%*ld %*c %*c %*c %ld.%ld" , &tl , &tld) == 2){
          tl *= 1000;
          GasUsage = tl + ( tld );
        }
        
        
      } else {
        buffer[bufpos++] = c&127;
      }
    }
      
  }
  digitalWrite(13, LOW);
}



void P1Power::Status(Print& client)
{
  BaseSensor::Status(client);
  client << F("<td>PowerUsage=") << PowerUsage;
  client << F(" PowerSolar=") << PowerSolar;
  client << F(" GasUsage=") << GasUsage;
  client << F(" M1=") << m1;
  client << F(" M2=") << m2;
  client << F(" M3=") << m3;
  client << F(" M4=") << m4;
}
Verder in de void setup() van Solarmeter.ino aangeven dat pin 13 een output moet zijn:
pinMode(13,OUTPUT);
Bij mij werkt dit prima, ook de gasmeterstand komt goed door, hetzij in dm3 ipv m3.

Misschien nuttig voor anderen met de E350 meter.
Jun 5, 2015 at 7:18 AM
Kan dit ook werken op een Uno Niek? dus met 1 seriële poort.

Als ik het wijzig in:
  digitalWrite(13, HIGH);
  c = ' ';
  while (c != '!'){
    if (Serial.available()){
      c = Serial.read();
      c &= ~(1 << 7);
      //Serial.print(c);
Of zijn er nog andere zaken die ik over het hoofd zie?
Klopt mijn aanname dat je code voor een Mega 2560 bedoeld is?

Bedankt alvast!
Jun 5, 2015 at 7:46 AM
Lijkt goed voor een Uno. Ik heb het niet getest, dus laat maar even weten of het inderdaad voor de UNO zo werkt.
Ik gebruik inderdaad een MEGA 2560.