Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
flyvert
Inlägg: 97
Blev medlem: 26 oktober 2015, 21:00:53

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av flyvert »

Postar mina hieroglyfer ikväll när jag fått ungarna i säng!
flyvert
Inlägg: 97
Blev medlem: 26 oktober 2015, 21:00:53

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av flyvert »

soo1 skrev:Jag tror det är fler än jag som skulle vilja ta del av din arduino kod för avläsningen, något du kan tänka dig att dela med dig av?
Här är det som jag kompilerade sist och för tillfället kör på.
- det kan finnas fel... är som sagt helt ny på detta. Samma variabler deklareras flera gånger, m.m. Städning återstår!
- koden kör en gång i minuten o väntar på svar i 100 x 25 ms = 2.5 sekund. LED13 lyser från fråga till emottagit svar/timeout.
- själva mottagningen i 1200 baud tar <0.5 sek när den väl fått första biten men nån gång ibland får jag timeout utan en enda bit efter 2.5s...
- paritetskontrollen går säkert att effektivisera 300% men för att tolka 79 tecken en gång per minut räcker det nog.
- while ( r != 0x0A) är en kvarleva från första försöken (o koden från den danska Wikin; while ( 1 ) är nog bättre o förhindrar att snurran hoppar ur pga en LF)
- avkodningen till flyttal är inte nödvändig men förenklade min tolkning i det Python-skript som tar emot på andra sidan

Kod: Markera allt

#include <SoftwareSerial.h>

// Pin definitions
#define PIN_KAMSER_RX  9  // Kamstrup IR interface RX
#define PIN_KAMSER_TX  10  // Kamstrup IR interface TX
#define PIN_LED        13  // Standard Arduino LED

SoftwareSerial kamSer(PIN_KAMSER_RX, PIN_KAMSER_TX, false);  // Initialize serial


void setup () {
  Serial.begin(57600);
  Serial.print("Initializing...");
  
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, 0);
  
  // setup kamstrup serial
  pinMode(PIN_KAMSER_RX,INPUT);
  pinMode(PIN_KAMSER_TX,OUTPUT);
  Serial.println("done.");
}

bool parity_check(unsigned input) {
    bool inputparity = input & 128;
    int x = input & 127;
 
    int parity = 0;
    while(x != 0) {
        parity ^= x;
        x >>= 1;
    }

    if ( parity & 0x1 != inputparity )
      return(1);
    else
      return(0);
}

void loop () {
    byte sendmsg1[] = { 175,163,177 };            //   /#1 with even parity
    
    byte r  = 0;
    byte to = 0;
    byte i;
    char message[255];
    int parityerrors;
    
    digitalWrite(PIN_LED, 1);
    
    kamSer.begin(300);
    for (int x = 0; x < 3; x++) {
      kamSer.write(sendmsg1[x]);
    }
    
    kamSer.flush();
    kamSer.begin(1200);

    to = 0;
    r = 0;
    i = 0;
    parityerrors = 0;
    char *tmpstr;
    float m_energy, m_volume, m_tempin, m_tempout, m_tempdiff, m_power;
    long m_hours, m_flow;
    
    while(r != 0x0A)
    {
      if (kamSer.available())
      {
        // receive byte
        r = kamSer.read();
        if (parity_check(r))
        {
           parityerrors += 1;
        }
        r = r & 127; // Mask MSB to remove parity
        
        message[i++] = char(r);
      }
      else
      {
        to++;
        delay(25);
      }
    
      if (i>=79)
      {
        if ( parityerrors == 0 )
        {
          Serial.print("OK: " );
          message[i] = 0;
          
          tmpstr = strtok(message, " ");
          if (tmpstr)
           m_energy = atol(tmpstr)/1000.0;
          else
           m_energy = 0;

          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_volume = atol(tmpstr)/100.0;
          else
           m_volume = 0;

          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_hours = atol(tmpstr);
          else
           m_hours = 0;
  
          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_tempin = atol(tmpstr)/100.0;
          else
           m_tempin = 0;

          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_tempout = atol(tmpstr)/100.0;
          else
           m_tempout = 0;

          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_tempdiff = atol(tmpstr)/100.0;
          else
           m_tempdiff = 0;

          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_power = atol(tmpstr)/10.0;
          else
           m_power = 0;

          tmpstr = strtok(NULL, " ");
          if (tmpstr)
           m_flow = atol(tmpstr);
          else
           m_flow = 0;

          Serial.print(m_energy,3);
          Serial.print(" ");
          Serial.print(m_volume);
          Serial.print(" ");
          Serial.print(m_hours);
          Serial.print(" ");
          Serial.print(m_tempin);
          Serial.print(" ");
          Serial.print(m_tempout);
          Serial.print(" ");
          Serial.print(m_tempdiff);
          Serial.print(" ");
          Serial.print(m_power,1);
          Serial.print(" ");
          Serial.print(m_flow);
          Serial.println("");
        }
        else
        {
          Serial.print("ERR(PARITY): " );
          message[i] = 0;
          Serial.println(message);
        }
        break;
      } 
      if (to>100)
      {
        message[i] = 0;
        Serial.print("ERR(TIMEOUT):" );
        Serial.println(message);
        break;
      }
    }
    digitalWrite(PIN_LED, 0);

    delay(58000);
}
flyvert
Inlägg: 97
Blev medlem: 26 oktober 2015, 21:00:53

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av flyvert »

Istället för att ta den färdiga layouten som kräver etsning eller gravyr(?) gjorde jag en anpassad layout på ett testkort.
Plats finns för en liten skruv om man vill sätta fast en magnet el dyl. Jag slant förstås när jag skulle öka från 2 till 3 mm borr... :? Pelarborr står högre på önskelistan kan jag säga...
Testkort.JPG
Anpassad kretskortlayout.jpg
Komponentplacering.JPG
Färdigt resultat.JPG
Screenshot.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av Lennart Aspenryd »

Riktigt snyggt! Det är nästan så att man önskar att man hade fjärrvärme.
Vi bor ju i lägenhet!
Men detta med magnet på skruv är riktigt användbart!
matsekberg
Inlägg: 2
Blev medlem: 30 december 2015, 14:48:04

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av matsekberg »

flyvert skrev:Istället för att ta den färdiga layouten som kräver etsning eller gravyr(?) gjorde jag en anpassad layout på ett testkort.
Plats finns för en liten skruv om man vill sätta fast en magnet el dyl. Jag slant förstås när jag skulle öka från 2 till 3 mm borr... :? Pelarborr står högre på önskelistan kan jag säga...
Testkort.JPG
Anpassad kretskortlayout.jpg
Komponentplacering.JPG
Färdigt resultat.JPG
Screenshot.png
Fråga: Lyser IR-dioden normalt och släcks vid sändning, eller blinkar den bara vid sändning?
TTL-seriellt data brukar vara normalt HÖG och gå LÅG vid sändning, dvs lyser LED vid LÅG utgång från SoftwareSerial?
matsekberg
Inlägg: 2
Blev medlem: 30 december 2015, 14:48:04

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av matsekberg »

Kan tipsa om denna modul, använder den med framgång.
Får dock lossa katoden på IR-dioden så att den kan jordas från Arduinon, använde A0 i kontakten till det.

http://www.ebay.co.uk/itm/Reflective-Sw ... SwSHZWel2E
flyvert
Inlägg: 97
Blev medlem: 26 oktober 2015, 21:00:53

Re: Läsa av fjärrvärmemätare (Kamstrup MultiCal 401)

Inlägg av flyvert »

matsekberg skrev:Fråga: Lyser IR-dioden normalt och släcks vid sändning, eller blinkar den bara vid sändning?
TTL-seriellt data brukar vara normalt HÖG och gå LÅG vid sändning, dvs lyser LED vid LÅG utgång från SoftwareSerial?
Sorry, hade inte koll på att du svarat på tråden.

För att vara ärlig vet jag inte!

Men realistiskt sett, eftersom Kamstrup 401 kan (där så krävs) förses med ett internt batteri som normalt räcker i många år (10?) kan nog inte dom spendera det på att låta TX-dioden lysa hela tiden.
Skriv svar