123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /*
- * Stand: 25.08.2021
- * Author: Julian Rico
- *
- * Teststand für Stromzähler-Empfänger.
- *
- * Diese Software bietet ein Interface, um den Empfänger zu testen.
- * Der Benutzer kann Zahlen eingeben, welche als Zählstand interpretiert werden.
- * Der Zählstand wird dann in Form eines SML Pakets verschickt.
- */
-
- /* Defines */
- #define BAUDRATE 9600
- #define BUFFERSIZE 100
-
- /* Globale Variablen */
- int BUFFER[BUFFERSIZE]; // Buffer für Einlesen serieller Daten
- float kWh; // Speichervariable für berechneten Input
- int i, j; // Laufvariablen
-
- /* Funktionsprototypen */
- void readInput();
- void sendSML(unsigned long mWh);
-
- /* Setup: einmalig */
- void setup() {
-
- // Debug LED
- pinMode(LED_BUILTIN, OUTPUT);
- digitalWrite(LED_BUILTIN, LOW);
-
- // Serial Setup
- Serial.begin(BAUDRATE);
- Serial.println("¡Bitte geben Sie einen ganzzahligen Wert ein [kWh]!");
- Serial.flush();
- }
-
- /* Hauptprogramm */
- void loop() {
-
- // Warten auf Eingabe von Bediener
- if (Serial.available() > 0)
- {
- digitalWrite(LED_BUILTIN, HIGH);
- readInput();
- }
- delay(50);
- }
-
- void readInput() {
- // Einlesen
- i = 0;
- do {
- if (i<BUFFERSIZE) {
- BUFFER[i] = Serial.read();
- i++;
- }
- } while (Serial.available());
- i--; // Letzter Eintrag in Buffer ist LF
-
- // Input umrechnen
- kWh = 0;
- for (j = i; j > 0; j--) {
- kWh = kWh + (BUFFER[j-1]-48) * pow(10, (i-j));
- }
-
- // SML senden
- // +0.5 für korrektes Auf- und Abrunden, cast rundet immer ab,
- // *10.000 für kWh->mWh
- sendSML(((unsigned long)(kWh+0.5)*10000));
-
- // Buffer löschen
- for (j = 0; j < i+2; j++)
- BUFFER[j] = 0;
- }
-
- void sendSML(unsigned long mWh) {
- // Hier wird ein Teil einer SML Nachricht verschickt
- // Konkret handelt es sich um die Sequence mit dem OBIS Kenncode
- // 1.8.0*255 (=Gesamtverbrauch)
- Serial.write(0x77); /* 'M' ASCII = 77 - SML_Message.messageBody.
- SML_GetList_Reponse.valList.valListEntry (Sequence) */
- Serial.write(0x07); /* 07 - objName (TL[1] + octet-string[6] */
- Serial.write(0x01); /* 01 - objName Teil A */
- Serial.write(0x00); /* 00 - objName Teil B */
- Serial.write(0x01); /* 01 - objName Teil C */
- Serial.write(0x08); /* 08 - objName Teil D */
- Serial.write(0x00); /* 00 - objName Teil E */
- Serial.write(0xFF); /* FF - objName Teil F */
- Serial.write(0x01); /* 01 - Status (optional: 01 bedeutet "nicht versorgt") */
- Serial.write(0x01); /* 01 - valTime (optional: 01 bedeutet "nicht versorgt") */
- Serial.write(0x01); /* 01 - unit (optional: 01 bedeutet "nicht versorgt") */
- Serial.write(0x01); /* 01 - scaler (optional: 01 bedeutet "nicht versorgt") */
- Serial.write(0x59); /* 01 - value (TL[1] + Integer[8]) */
- Serial.write(0x00); /* value[0] -- wir bekommen nur 4 Byte,
- daher die ersten 4 nullen */
- Serial.write(0x00); /* value[1] -- wir bekommen nur 4 Byte,
- daher die ersten 4 nullen */
- Serial.write(0x00); /* value[2] -- wir bekommen nur 4 Byte,
- daher die ersten 4 nullen */
- Serial.write(0x00); /* value[3] -- wir bekommen nur 4 Byte,
- daher die ersten 4 nullen */
-
- // Letzten 4 Bytes: mWh (unsigned long) konvertieren in 4 Bytes
- unsigned long temp;
- temp = (mWh & 0xFF000000) >> 24;
- Serial.write(temp); /* value[4] */
- temp = (mWh & 0x00FF0000) >> 16;
- Serial.write(temp); /* value[5] */
- temp = (mWh & 0x0000FF00) >> 8;
- Serial.write(temp); /* value[6] */
- temp = (mWh & 0x000000FF);
- Serial.write(temp); /* value[7] */
-
- Serial.println();
- Serial.println("¡Bei Bedarf nächsten ganzzahligen Wert eingeben [kWh]!");
- }
|