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