Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt!

I detta forum hör diskussioner gällande teknik i största allmänhet och hemautomation i synnerhet hemma.
Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt!

Inlägg av flyvert »

Hej.

Det var ett tag sedan jag postade här på detta eminenta forum, men jag vill gärna dela med mig av de senaste dagarnas framgångar!

Ni som sökt på forum.m.nu har sett att jag försökt läsa av min fjärrvärmeväxlare utan större framgång (testade lite med optisk tolkning av vad som visas i fönstret men tappade lusten då det var knepigt och jag fann på ett optiskt seriekommunikationsinterface på burken...)

Eftersom jag inte fått svar på tidigare frågor här (har faktiskt inte kollat på senare tid) postade jag lite på http://elektronikforumet.com/forum under samma alias som här.

http://elektronikforumet.com/forum/view ... =2&t=79853

Det ena ledde till det andra och nu har jag "fått kontakt" med energimätaren med hjälp av en Arduino och ett hemmafixat optiskt läshuvud för EN61107 standarden som Kamstrup har i sina burkar (även elmätare, flödesmätare, etc.). En dansk Wiki (http://wiki.hal9k.dk/projects/kamstrup) hjälpte till med det elektriska, men serieprotokollet var jag tvungen att mixtra lite med.

Kostnad: en Arduino, ett minimalt testkretskort (7x8 "banor"), 2 IR dioder, 5 motstånd, 3 transistorer och en magnet för att fästa läshuvudet på energimätaren. Rätt införskaffat blir det ju billigare än en öl på krogen... Samt några nätters klurande förstås... men WTF detta är ju såå mycket mer givande än att hålla på o lägga ut bilder på sin mat eller husdjur... :mrgreen:
Prototyp A1
Prototyp A1
Jag är ännu inte klar - men om någon vill haka på så kanske vi kan hjälpa varandra att knäcka hur man frågar efter enskilda register i energimätaren.

Executing setup...done.
Sending msg1: [175,63,33,141,10,]
Sending msg2: [6,48,48,48,141,10,]
0.0(00000xxxxxx)6.8(0147.151*MWh)6.26(02762.65*m3)6.31(0093468*h)!

Sending msg1: [175,63,33,141,10,]
Sending msg2: [6,48,48,48,141,10,]
0.0(00000xxxxxx)6.8(0147.151*MWh)6.26(02762.65*m3)6.31(0093468*h)!

Sending msg1: [175,63,33,141,10,]
Sending msg2: [6,48,48,48,141,10,]
0.0(00000xxxxxx)6.8(0147.152*MWh)6.26(02762.66*m3)6.31(0093468*h)!


/f
Om traktorn stjälper; håll i ratten, hoppa ej!
Isaksson
Tar hemautomation på allvar
Inlägg: 57
Blev medlem: 18 jun 2011, 07:56
Ort: Västervik

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av Isaksson »

Mycket intressant, har själv en 402:a som jag ska hitta på något liknande. Har inte börjat att kika på hur men detta ser högst intressant ut. Bra jobbat.
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Att läsa enstaka register var ju enklare än jag trodde... bara att skicka "/#1" (med 7N1 i 300 baud) så kommer registren tillbaka i 1200 baud i form av tio stycken 7 ställiga tal (utan decimalkomma eller mätstorhet, men det är ju lätt att identifera - på fronten på mätaren går ju dessa värden att stega sig igenom med hjälp av knappen på framsidan).

Executing setup...done.
Sending /#1 [175,163,177,]
0147280 0276525 0093492 0007258 0002768 0004490 0000038 0000073 0000160 0000000

Sending /#1 [175,163,177,]
0147280 0276525 0093492 0007257 0002766 0004491 0000037 0000072 0000160 000000

Sending /#1 [175,163,177,]
0147280 0276525 0093492 0007360 0002216 0005144 0000083 0000069 0000160 0000000

147.28 MWh ackumulerad effekt
276.525 m3 genomlupen mängd
93492 timmar driftstid
73.6 grader framledningstemp
22.16 grader returtemp
51.44 grader temperaturdifferens (fram-retur)
8.3 kW momentant effektuttag
69 liter/timman
160 liter/timman (uppmätt maxvärde)
Om traktorn stjälper; håll i ratten, hoppa ej!
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Nu tar jag en bärs på det här! :mrgreen:
Om traktorn stjälper; håll i ratten, hoppa ej!
larky
Moderator
Inlägg: 1166
Blev medlem: 01 feb 2008, 12:21
Ort: Skellefteå
Kontakt:

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av larky »

Kul med lite framgång!
Isaksson
Tar hemautomation på allvar
Inlägg: 57
Blev medlem: 18 jun 2011, 07:56
Ort: Västervik

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av Isaksson »

Jag skulle tycka det vore intressant att se koden till arduino, om du inte har något emot att posta den?
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Isaksson skrev:Jag skulle tycka det vore intressant att se koden till arduino, om du inte har något emot att posta den?
Fixar det I morgon kväll!
Om traktorn stjälper; håll i ratten, hoppa ej!
Isaksson
Tar hemautomation på allvar
Inlägg: 57
Blev medlem: 18 jun 2011, 07:56
Ort: Västervik

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av Isaksson »

Perfekt. Jag byggde mig en IR givare. Men svårt att veta om den fungerar eller inte :) ska bli intressant att testa din kod, sen får vi se om det fungerar rakt av mot en 402 eller om jag måste göra om något.
Isaksson
Tar hemautomation på allvar
Inlägg: 57
Blev medlem: 18 jun 2011, 07:56
Ort: Västervik

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av Isaksson »

Förresten, när du körde din sensor med koden från elmätaren, fick du då "Timed out listening fir data" eller fick du något annat svar tillbaka?
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Isaksson skrev:Förresten, när du körde din sensor med koden från elmätaren, fick du då "Timed out listening fir data" eller fick du något annat svar tillbaka?
Exakt det fick jag!

Efter lyckade basala send/receive-test enligt den danska Wikin försökte jag sen filma med digitalkameran i "gluggen" men såg inte tillstymmelsen till svarsblink från Kamstrupen och började misstänka att elmätarkoden inte fungerar på en fjärrvärmemätare.

Sen slogs jag ett tag med exemplet från manualen (två paket ut, två paket in) för att få summastatus inkl decimalpunkter & mätstorheter. Det var under det arbetet som jag kom på att jag skickar tecken i 8N1 format men att interfacet i Kamstrup förväntar sig 7E2. Som någon på elektronikforumet upplyste mig; det är lätt att göra om 8N1 till 7N1 (om man håller sig till ASCII, dvs 7 bitar) - bara att OR:a in 128 när paritetsbiten skall sättas. Att jag inte skickar två stoppbitar är inte så kritiskt, släckt diod är ju "0" och den normala pausen mellan tecknen kan "emulera" den andra stoppbiten. Med den förändringen kom så genombrottet!

På samma sätt så kan du avkoda pariteten i datat du får FRÅN Kamstrup och bryr du dig inte så är det bara att maska bort 128 innan du tolkar tecknet.


Steg 2; att hämta register är ju faktiskt mycket enklare; endast ett paket behöver skickas, ingen ACK (men svaret kommer i 1200 baud).

Du får min kod ikväll, men pseudomässigt liknar den:

Kod: Markera allt

LOOP FOREVER
   SetBaud(300)
   Send("\#1")

   Flush()
   SetBaud(1200)
 
   noofparityerrors=0

   LOOP FOREVER
     Receive(char)
     IF parityerror(char)
      noofparityerrors++
     message = message + (char & 127)
     IF length(message) >= 79
       break
     IF timeout
       break
  END LOOP

  IF noofparityerrors > 0
    print("Parity error: " + message)
  ELSE
    IF length(message) < 79
      print("Too short: " + message)
    ELSE
      print(message)
END LOOP
Sen har jag lagt till kod i Arduinon att översätta heltalssifferställen till flyttal, tex temperaturerna som skickas typ "0007534" skrivs ut 75.34 genom att dividera med 100, etc.

Kod: Markera allt

ptr = strtok(message, ' ')
if (ptr) print(atol(ptr) / 100.0)

ptr = strtok(message, NULL)
if (ptr) print(atol(ptr) / 1000.0)

osv.
Om traktorn stjälper; håll i ratten, hoppa ej!
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Har uppdaterat den andra tråden på elektronikforumet med kod & bilder: http://elektronikforumet.com/forum/view ... =2&t=79853

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);
}
Om traktorn stjälper; håll i ratten, hoppa ej!
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Mysko... Arduino-koden får som sagt ibland timeout på läsningar, och när jag i Python-skriptet lägger till klockstämpel blir man ju än mer konfunderad...

pi@rpi1 /tmp $ cat power_logger.log
Python version: 2.7.3 (default, Mar 18 2014, 05:13:23)
[GCC 4.6.3]
Log is: True
Trace is: False
2015-11-08 20:09:09.734749 Opening /dev/ttyUSB0
2015-11-08 21:00:13.957530 ERR(TIMEOUT):
2015-11-08 23:00:14.243832 ERR(TIMEOUT):
2015-11-09 05:00:13.585172 ERR(TIMEOUT):
2015-11-09 06:00:13.977502 ERR(TIMEOUT):
2015-11-09 07:00:14.362934 ERR(TIMEOUT):
2015-11-09 11:00:14.418931 ERR(TIMEOUT):
2015-11-09 15:00:13.968323 ERR(TIMEOUT):
2015-11-09 17:00:14.239994 ERR(TIMEOUT):
2015-11-09 18:00:14.652029 ERR(TIMEOUT):

ERR(TIMEOUT) skrivs av Arduinon som inte är klocksynkroniserad.

Det måste vara Kamstrupen som är upptagen hel timme (men oftare på udda timme än hel).
Har inte sett någon klocka i den, men enligt manualen har den intern klocka för nåt med tariffer.
Men vem sätter klockan i den? Den kan ju inte gå sådär bra fem år efter monteringen, eller?
Eller så får den tid från den andra dosan med antenn på (säkerligen en GPRS-länk) - men varför skall den göra mer varje timme???

Den som löser detta blir bjuden på en öl! :lol:
Om traktorn stjälper; håll i ratten, hoppa ej!
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

WTF; förekommer nästa fråga genom att skicka in python-skriptet som läser av Arduinon som sitter i en USB-port på en av mina Raspberrys.
logenabled ger lite information när det går fel (=den nivå jag oftast låter program gå på). traceenabled ger en massa information på stdout.

Koden levererar 4 signaler till MySQL och den momentana effekten till en rad på en 1-wire LCD display.

Kod: Markera allt

#!/usr/bin/python
# -*- coding: latin-1 -*-

import sys
import serial
import signal
import time
import datetime
import MySQLdb
import os.path

traceenabled = False
logenabled   = True

def TracePrint(text):
  global traceenabled
  if traceenabled == True:
    print(str(datetime.datetime.now()) + " " + text)
    sys.stdout.flush()

def LogPrint(text):
  global logenabled
  global logenabled
  if logenabled == True or traceenabled == True:
    print(str(datetime.datetime.now()) + " " + text)
    sys.stdout.flush()

def ConnectDB():
  global db
  db = None
  TracePrint("ConnectDB(): Attempting to connect to MySQL")
  try:
    db = MySQLdb.connect("", "pi", "", "onewire")
    TracePrint("ConnectDB(): Succeeded to connect!")
  except MySQLdb.Error as e:
    LogPrint("ConnectDB(): ERROR: " + str(e))

def InsertValuesToDB( line ):
  global db

  sqlstmt1 = "INSERT INTO data VALUES ( NOW(), 3, 1, " + line.split(" ")[4] + ", 1, 1 )"
  sqlstmt2 = "INSERT INTO data VALUES ( NOW(), 3, 2, " + line.split(" ")[5] + ", 1, 1 )"
  sqlstmt3 = "INSERT INTO data VALUES ( NOW(), 3, 3, " + line.split(" ")[7] + ", 1, 1 )"
  sqlstmt4 = "INSERT INTO data VALUES ( NOW(), 3, 4, " + line.split(" ")[8] + ", 1, 1 )"

  if ( db is None ):
    TracePrint("InsertValuesToDB(): We're not connected to database, lets reconnect")
    ConnectDB()

  if ( db is None ):
    LogPrint("InsertValuesToDB(): ERROR: No DB connection to execute SQL statement")
  else:
    try:
      TracePrint("InsertValuesToDB(): About to execute:")
      TracePrint("   " + sqlstmt1 )
      TracePrint("   " + sqlstmt2 )
      TracePrint("   " + sqlstmt3 )
      TracePrint("   " + sqlstmt4 )
      cursor=db.cursor()
      cursor.execute(sqlstmt1)
      cursor.execute(sqlstmt2)
      cursor.execute(sqlstmt3)
      cursor.execute(sqlstmt4)
      TracePrint("InsertValuesToDB(): Committing" )
      db.commit()
      cursor.close()
      TracePrint("InsertValuesToDB(): Done" )
    except MySQLdb.Error as e:
      LogPrint("InsertValuesToDB(): ERROR: " + str(e))
      db.close()
      db = None

def signal_handler(signal, frame):
   LogPrint("Program terminated by SIGTERM signal.")
   cleanupandexit();

def cleanupandexit():
   if db != None:
     db.close()
   sys.exit(0)

print("Python version: " + str(sys.version) )
print("Log is:         " + str(logenabled) )
print("Trace is:       " + str(traceenabled) )
sys.stdout.flush()

signal.signal(signal.SIGTERM, signal_handler)
ConnectDB()

LogPrint("Opening /dev/ttyUSB0")
ser = serial.Serial('/dev/ttyUSB0',57600)
line = ser.readline()

while 1 :
  try:
    line = ser.readline().rstrip()
    TracePrint("Got line from arduino: " + line );
    if line.count(' ') == 8 and line.split(" ")[0] == "OK:":
      if os.path.isfile('/mnt/1wire/bus.1/FF.CA0800000100/line20.1'):
        TracePrint("Updating LCD")
        f1=open('/mnt/1wire/bus.1/FF.CA0800000100/line20.1', 'w')
        f1.write("Fv:%5skW" % (line.split(" ")[7]))
        f1.close()
      else:
        TracePrint("LCD 1-wire file not found.")
      InsertValuesToDB(line)
    else:
      LogPrint(line)
  
  except KeyboardInterrupt:
    LogPrint("Program terminated by keyboard interrupt.")
    cleanupandexit()
Om traktorn stjälper; håll i ratten, hoppa ej!
Isaksson
Tar hemautomation på allvar
Inlägg: 57
Blev medlem: 18 jun 2011, 07:56
Ort: Västervik

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av Isaksson »

Tack för koden, testade att skjuta den rätt in på min arduino och mot min 402:a får tyvärr bara "ERR(TIMEOUT):" så då kvarstår frågan om jag måste justera koden eller om mitt bygge av mottagare/sändare har gått snett.

Jag tittade också på den danska sidan men tyvärr fanns det lite olika versioner på hur man ska bygga den om man tittar på den sidan eller om man tittar på KiCad filerna som han har lagt upp.
Tex motståndet som sitter precis under stiftlisten är 1M om man tittar på wikin men 15K om man tar hem filerna för KiCad.
På wikin så sitter LED:arna åt samma håll men på KiCad filerna så är designen att de är vända mot varandra.

Så frågan är vilken guide byggde du efter?

jag har ju testat sändardelen med en kamera och ser hur dioden blinkar och har också testat att sätta fingret för mottagaren och sett hur LED13 tänder så det känns ju som den är hyfsat med i matchen iallafall.
flyvert
Hemautomation - det är mer än en hobby
Inlägg: 393
Blev medlem: 22 aug 2013, 00:48
Ort: Västerås

Re: Fjärrvärmemätare Kamstrup Multical 401 - gåtan är knäckt

Inlägg av flyvert »

Hej.

Byggde efter elkretschemat om jag minns rätt; där sitter ett 1M motstånd som pulldown för mottagardioden. 15k ger ju kraftigare pulldown, men om IR-mottagardioden orkar lyfta signalen tillräckligt för att transistorn skall börja arbeta kan jag inte svara på, 15k är rätt mycket det oxo så förmodligen fungerar det bra även med det värdet.
Komponentplacering.JPG
I övrigt ser det ju rätt ut (LED slocknar när man belyser mottagaren)
Vilken våglängd valde du? 940 nm?

Gjorde en slagning på teknisk dokumentation för Multical 402 och den verkar ha ett annat serieprotokoll än dess föregångare 401:
http://products.kamstrup.com/ajax/downl ... &display=1

Sidan 83, längst ned:

The protocol is based on half duplex serial synchroneous
communication with setup: 8 data bits, no parity and 2
stop bits. The data bit rate is 1200 or 2400 baud
. CRC16 is used in both request and response



Det optiska läshuvudet är nog korrekt, men 402 kör 8N2 (åtta bitar utan paritet men med en CRC16 summa sist i paketet).
402 kommunikation, inte samma som 401
402 kommunikation, inte samma som 401
Du måste nog försöka få tag på det där exempelprogrammet man nämner på sidan 84. Det borde inte vara några problem att porta det till Arduino-kod, bara du vet vad som den förväntar sig och vad du får tillbaka.

12.1.2
Data protocol
Utilities and other relevant companies who want to deve
lop their own communication driver for the KMP protocol
can order a demonstration program in C# (.net based) as
well as a detailed protocol description (in English language).


Se även denna punkt - vad den nu innebär (activated by keystroke or communication - skulle man inte spara ström?)

12.2.1
Current saving at the optical eye
In order to limit the current consumption of the circuit around the IR diode,
the circuit is not permanently switched on. It is activated by either keystroke
or communication via the optical eye. The circuit remains switched on for 30 min.
after end of communication or after latest keystroke.
Om traktorn stjälper; håll i ratten, hoppa ej!
Skriv svar