Arduino_Impulszaehler_DE.txt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. Dual Impulse Counter
  2. Grundfunktionen
  3. - 2 konfigurierbare Impulszähler für S0-Impulse
  4. - derzeit unterstützte Impulse pro Einheit: 10, 100, 1000
  5. - Zählung in Ganzzahl-Einheit + Zwischenimpulse
  6. - alle Daten werden regelmäßig auf EEPROM gespeichert (Ringspeicher, konfigurierbare Intervalle)
  7. - Power-Loss-Detection mit Speicherung der aktuellen Zählerstände
  8. - UART-Interface für Daten und Konfiguration
  9. - Ausgabe von Zählerstand und Zeit seit dem letzten Impuls
  10. - vorgesehen für Einsatz zusammen mit einem Raspberry Pi, mit zugehörigem Datenerfassungsprogramm (Python-Script)
  11. - Grund für die Entwicklung war der wenig zuverlässige direkte Einsatz des Raspberry Pi mit Impulszählung über GPIO.
  12. Dabei wurden (mit Python) oft nicht existente Impulse gezählt. Außerdem läuft dieser Zähler dann nur solange der RasPi läuft.
  13. Dieses Projekt wurde entwickelt um in Zukunft nicht mehr ständig die Zählerstände am RasPi mit denen an den echten Zählern abgleichen zu müssen.
  14. Hardware:
  15. - Basis ist ein Arduino Pro Mini Clone (ATMega 328p)
  16. - Stromversorgung über eigenes Steckernetzteil, 12VDC
  17. - Pufferkondensator und Spannungsüberwachung on-board
  18. - 2 S0-Impulseingänge mit Optokopplern, active LOW (kompatibel zu S0 Open Collector Ausgängen)
  19. - direkte Anbindung über UART an die Zentrale (Raspberry Pi, via USB-UART-Adapter, jedoch OHNE Stromversorgung über USB!!!)
  20. - Verbindung der RS232-DTS-Leitung ENTFÄLLT, da diese bei jeder Verbindung einen Reset auslöst.
  21. Um dennoch einen Reset (auch für Firmwareupdate) auslösen zu können ist eine eigene Funktion implementiert.
  22. Hierbei wird jedoch vorher der aktuelle Zählerstand gespeichert.
  23. Software:
  24. - direkte Implementierung der Zähler am ATMega - somit wird der Zählerstand auch aktualisiert, wenn RasPi und/oder Ausleseprogramm nicht läuft.
  25. (das war in der Vergangenheit öfters ein Problem)
  26. - je Eingang ein Zähler mit konfigurierbaren Parametern:
  27. - Impulszähler mit konfigurierbarer Impulsanzahl pro Einheit (z.B. Gaszähler: 100 Imp/1 m³, Stromzähler: 1000 Imp/kWh)
  28. - Einheitenzähler, der bei Überlauf des Impulszählers inkrementiert wird
  29. - regelmäßige Speicherung des tatsächlichen Zählerstands im EEPROM
  30. -> Speicherung Einheitenzähler:
  31. - bei jeder Änderung
  32. -> z.B. Gaszähler, 500 m³/Werte pro Jahr => rechnerische Lebensdauer des EEPROM 200 Jahre,
  33. abgesehen davon, dass der 5 stellige Gaszähler bestimmt nie bis zum Überlauf zählen wird
  34. -> z.B. Stromzähler, 4000 kWh pro Jahr => immer noch 25 Jahre bis zur Erreichung der 100.000 Schreibzyklen des EEPROM
  35. - zur Sicherheit gegen fehlerhaft geschriebene Werte, zB. wegen Stromausfall während des Schreibens:
  36. - Einheitenzähler wird in 3 verschiedene EEPROM-Adressen gespeichert - Einlesen aller 3 Werte beim Start und Plausibilitätsprüfung
  37. - Impulszähler - hier wird zuerst der Wert und dann der write counter (zur Wiederauffindung des letzten Werts nötig) geschrieben.
  38. Schlägt letzteres fehl gilt automatisch der letzte gespeicherte Wert davor.
  39. - Speicherung Impulszähler:
  40. -> höhere Schreiblast als die Einheitenzähler
  41. - Ringspeicher-Methode mir write counter zur Schreiblastverteilung
  42. - Speicherung in:
  43. - konfigurierbaren fixen Intervallen
  44. - nachdem für ein festlegbares timeout kein neuer Impuls eingegangen ist (beim Gaszähler am sinnvollsten)
  45. Befehle:
  46. Konfiguration:
  47. set conf c1 impPerUnit=1000
  48. set conf c1 noImpTout=60
  49. set conf c1 saveInt=15
  50. or as batch:
  51. set conf c1 impperunit=1000;noimptout=60;saveint=15
  52. set conf c2 impperunit=100;noimptout=60;saveint=15
  53. noImpTout => in sekunden
  54. saveInt => in minuten