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.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. sendSML(((unsigned long)(kWh+0.5)*10000)); // +0.5 für korrektes Auf- und Abrunden, cast rundet immer ab, *10.000 für kWh->mWh
  58. // Buffer löschen
  59. for (j = 0; j < i+2; j++)
  60. BUFFER[j] = 0;
  61. }
  62. void sendSML(unsigned long mWh) {
  63. // Hier wird ein Teil einer SML Nachricht verschickt
  64. // Konkret handelt es sich um die Sequence mit dem OBIS Kenncode 1.8.0*255 (=Gesamtverbrauch)
  65. Serial.write(0x77); /* 'M' ASCII = 77 - SML_Message.messageBody.SML_GetList_Reponse.valList.valListEntry (Sequence) */
  66. Serial.write(0x07); /* 07 - objName (TL[1] + octet-string[6] */
  67. Serial.write(0x01); /* 01 - objName Teil A */
  68. Serial.write(0x00); /* 00 - objName Teil B */
  69. Serial.write(0x01); /* 01 - objName Teil C */
  70. Serial.write(0x08); /* 08 - objName Teil D */
  71. Serial.write(0x00); /* 00 - objName Teil E */
  72. Serial.write(0xFF); /* FF - objName Teil F */
  73. Serial.write(0x01); /* 01 - Status (optional: 01 bedeutet "nicht versorgt") */
  74. Serial.write(0x01); /* 01 - valTime (optional: 01 bedeutet "nicht versorgt") */
  75. Serial.write(0x01); /* 01 - unit (optional: 01 bedeutet "nicht versorgt") */
  76. Serial.write(0x01); /* 01 - scaler (optional: 01 bedeutet "nicht versorgt") */
  77. Serial.write(0x59); /* 01 - value (TL[1] + Integer[8]) */
  78. Serial.write(0x00); /* value[0] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */
  79. Serial.write(0x00); /* value[1] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */
  80. Serial.write(0x00); /* value[2] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */
  81. Serial.write(0x00); /* value[3] -- wir bekommen nur 4 Byte, daher die ersten 4 nullen */
  82. // Letzten 4 Bytes: mWh (unsigned long) konvertieren in 4 Bytes
  83. unsigned long temp;
  84. temp = (mWh & 0xFF000000) >> 24;
  85. Serial.write(temp); /* value[4] */
  86. temp = (mWh & 0x00FF0000) >> 16;
  87. Serial.write(temp); /* value[5] */
  88. temp = (mWh & 0x0000FF00) >> 8;
  89. Serial.write(temp); /* value[6] */
  90. temp = (mWh & 0x000000FF);
  91. Serial.write(temp); /* value[7] */
  92. Serial.println();
  93. Serial.println("¡Bei Bedarf nächsten ganzzahligen Wert eingeben [kWh]!");
  94. }