You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

Teststand.ino 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * Stand: 25.08.2021
  3. * Author: Julian Rico
  4. *
  5. * Teststand für Stromzähler-Empfänger.
  6. *
  7. * Diese Software bietet ein Interface, um den Empfänger zu testen.
  8. * Der Benutzer kann Zahlen eingeben, welche als Zählstand interpretiert werden.
  9. * Der Zählstand wird dann in Form eines SML Pakets verschickt.
  10. */
  11. /* Defines */
  12. #define BAUDRATE 9600
  13. #define BUFFERSIZE 100
  14. /* Globale Variablen */
  15. int BUFFER[BUFFERSIZE]; // Buffer für Einlesen serieller Daten
  16. float kWh; // Speichervariable für berechneten Input
  17. int i, j; // Laufvariablen
  18. /* Funktionsprototypen */
  19. void readInput();
  20. void sendSML(unsigned long mWh);
  21. /* Setup: einmalig */
  22. void setup() {
  23. // Debug LED
  24. pinMode(LED_BUILTIN, OUTPUT);
  25. digitalWrite(LED_BUILTIN, LOW);
  26. // Serial Setup
  27. Serial.begin(BAUDRATE);
  28. Serial.println("¡Bitte geben Sie einen ganzzahligen Wert ein [kWh]!");
  29. Serial.flush();
  30. }
  31. /* Hauptprogramm */
  32. void loop() {
  33. // Warten auf Eingabe von Bediener
  34. if (Serial.available() > 0)
  35. {
  36. digitalWrite(LED_BUILTIN, HIGH);
  37. readInput();
  38. }
  39. delay(50);
  40. }
  41. void readInput() {
  42. // Einlesen
  43. i = 0;
  44. do {
  45. if (i<BUFFERSIZE) {
  46. BUFFER[i] = Serial.read();
  47. i++;
  48. }
  49. } while (Serial.available());
  50. i--; // Letzter Eintrag in Buffer ist LF
  51. // Input umrechnen
  52. kWh = 0;
  53. for (j = i; j > 0; j--) {
  54. kWh = kWh + (BUFFER[j-1]-48) * pow(10, (i-j));
  55. }
  56. // SML senden
  57. // +0.5 für korrektes Auf- und Abrunden, cast rundet immer ab,
  58. // *10.000 für kWh->mWh
  59. sendSML(((unsigned long)(kWh+0.5)*10000));
  60. // Buffer löschen
  61. for (j = 0; j < i+2; j++)
  62. BUFFER[j] = 0;
  63. }
  64. void sendSML(unsigned long mWh) {
  65. // Hier wird ein Teil einer SML Nachricht verschickt
  66. // Konkret handelt es sich um die Sequence mit dem OBIS Kenncode
  67. // 1.8.0*255 (=Gesamtverbrauch)
  68. Serial.write(0x77); /* 'M' ASCII = 77 - SML_Message.messageBody.
  69. SML_GetList_Reponse.valList.valListEntry (Sequence) */
  70. Serial.write(0x07); /* 07 - objName (TL[1] + octet-string[6] */
  71. Serial.write(0x01); /* 01 - objName Teil A */
  72. Serial.write(0x00); /* 00 - objName Teil B */
  73. Serial.write(0x01); /* 01 - objName Teil C */
  74. Serial.write(0x08); /* 08 - objName Teil D */
  75. Serial.write(0x00); /* 00 - objName Teil E */
  76. Serial.write(0xFF); /* FF - objName Teil F */
  77. Serial.write(0x01); /* 01 - Status (optional: 01 bedeutet "nicht versorgt") */
  78. Serial.write(0x01); /* 01 - valTime (optional: 01 bedeutet "nicht versorgt") */
  79. Serial.write(0x01); /* 01 - unit (optional: 01 bedeutet "nicht versorgt") */
  80. Serial.write(0x01); /* 01 - scaler (optional: 01 bedeutet "nicht versorgt") */
  81. Serial.write(0x59); /* 01 - value (TL[1] + Integer[8]) */
  82. Serial.write(0x00); /* value[0] -- wir bekommen nur 4 Byte,
  83. daher die ersten 4 nullen */
  84. Serial.write(0x00); /* value[1] -- wir bekommen nur 4 Byte,
  85. daher die ersten 4 nullen */
  86. Serial.write(0x00); /* value[2] -- wir bekommen nur 4 Byte,
  87. daher die ersten 4 nullen */
  88. Serial.write(0x00); /* value[3] -- wir bekommen nur 4 Byte,
  89. daher die ersten 4 nullen */
  90. // Letzten 4 Bytes: mWh (unsigned long) konvertieren in 4 Bytes
  91. unsigned long temp;
  92. temp = (mWh & 0xFF000000) >> 24;
  93. Serial.write(temp); /* value[4] */
  94. temp = (mWh & 0x00FF0000) >> 16;
  95. Serial.write(temp); /* value[5] */
  96. temp = (mWh & 0x0000FF00) >> 8;
  97. Serial.write(temp); /* value[6] */
  98. temp = (mWh & 0x000000FF);
  99. Serial.write(temp); /* value[7] */
  100. Serial.println();
  101. Serial.println("¡Bei Bedarf nächsten ganzzahligen Wert eingeben [kWh]!");
  102. }