Arduino – P1 poort telegrammen uitlezen
Met wat knippen & plakken uit het script van “Zonnig Breda” en wat eigen inbreng, heb ik dit voorbeeldscript gebouwd om zo eenvoudig de waarden uit de telegrammen te halen! (bijvoorbeeld te verzenden met een Netarduino)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
#include <AltSoftSerial.h> // AltSoftSerial always uses these pins: // // Board Transmit Receive PWM Unusable // ----- -------- ------- ------------ // Teensy 2.0 9 10 (none) // Teensy++ 2.0 25 4 26, 27 // Arduino Uno 9 8 10 // Arduino Mega 46 48 44, 45 // Wiring-S 5 6 4 // Sanguino 13 14 12 AltSoftSerial altSerial; char input; // inkomende seriele data (byte) bool readnextLine = false; #define BUFSIZE 75 char buffer[BUFSIZE]; //Buffer voor seriele data om \n te vinden. int bufpos = 0; long mEVLT = 0; //Meterstand Elektra - verbruik laag tarief long mEVHT = 0; //Meterstand Elektra - verbruik hoog tarief long mETLT = 0; //Meterstand Elektra - teruglevering laag tarief long mETHT = 0; //Meterstand Elektra - teruglevering hoog tarief long mEAV = 0; //Meterstand Elektra - actueel verbruik long mEAT = 0; //Meterstand Elektra - actueel teruglevering float mG = 0; //Meterstand Gas void setup() { Serial.begin(9600); altSerial.begin(9600); } void loop() { long tl = 0; long tld =0; if (altSerial.available()) { input = altSerial.read(); // --- 7 bits instelling --- input &= ~(1 << 7); char inChar = (char)input; // --- 7 bits instelling --- //Serial.print(input); //Debug // Vul buffer tot en met een nieuwe lijn (\n) buffer[bufpos] = input&127; bufpos++; if (input == '\n') { // we hebben een lijn binnen (gegevens tot \n) // 1-0:1.8.1 = Elektra verbruik laag tarief (DSMR v4.0) if (sscanf(buffer,"1-0:1.8.1(%ld%.%ld%*s" , &tl, &tld) >0 ) { mEVLT = tl * 1000 + tld; if (mEVLT > 0) { Serial.print("Elektra - meterstand verbruik LAAG tarief (Wh): "); Serial.println(mEVLT); mEVLT = 0; } } // 1-0:1.8.2 = Elektra verbruik hoog tarief (DSMR v4.0) if (sscanf(buffer,"1-0:1.8.2(%ld%.%ld%*s" , &tl, &tld) >0 ) { mEVHT = tl * 1000 + tld; if (mEVHT > 0) { Serial.print("Elektra - meterstand verbruik HOOG tarief (Wh): "); Serial.println(mEVHT); mEVHT = 0; } } // 1-0:1.7.0 = Elektra actueel verbruik (DSMR v4.0) if (sscanf(buffer,"1-0:1.7.0(%ld.%ld%*s" , &tl , &tld) >0 ) { mEAV = tl * 1000 + tld * 10; if (mEAV > 0) { Serial.print("Elektra - actueel verbruik (W): "); Serial.println(mEAV); mEAV = 0; } } // 1-0:2.8.1 = Elektra teruglevering hoog tarief (DSMR v4.0) if (sscanf(buffer,"1-0:2.8.1(%ld%.%ld%*s" , &tl, &tld) >0 ) { mETLT = tl * 1000 + tld; if (mETLT > 0) { Serial.print("Elektra - meterstand teruglevering LAAG tarief (Wh): "); Serial.println(mETLT); mETLT = 0; } } // 1-0:2.8.2 = Elektra teruglevering hoog tarief (DSMR v4.0) if (sscanf(buffer,"1-0:2.8.2(%ld%.%ld%*s" , &tl, &tld) >0 ) { mETHT = tl * 1000 + tld; if (mETHT > 0) { Serial.print("Elektra - meterstand teruglevering HOOG tarief (Wh): "); Serial.println(mETHT); mETHT = 0; } } // 1-0:2.7.0 = Elektra actueel teruglevering (DSMR v4.0) if (sscanf(buffer,"1-0:2.7.0(%ld.%ld%*s" , &tl , &tld) >0 ) { mEAT = tl * 1000 + tld * 10; if (mEAT > 0) { Serial.print("Elektra - actueel teruglevering (W): "); Serial.println(mEAT); mEAT = 0; } } // 0-1:24.3.0 = Gas (DSMR v4.0) if (sscanf(buffer,"0-1:24.3.0(%6ld%4ld%*s" , &tl, &tld) > 0 ) { readnextLine = true; // we moeten de volgende lijn hebben } if (readnextLine){ if (sscanf(buffer,"(%ld.%ld%*s" , &tl, &tld) >0 ) { mG = float ( tl * 1000 + tld ) / 1000; Serial.print("Gas - meterstand (m3): "); Serial.println(mG); Serial.println(""); readnextLine = false; } } // Maak de buffer weer leeg (hele array) for (int i=0; i<75; i++) { buffer[i] = 0;} bufpos = 0; } } } |
Het resultaat: (in …