Arduino-Pulszählung und -speicherung

Ich verwende Jeenodes von Jeelabs, um Daten wie Temperatur, Licht, Feuchtigkeit und Bewegung zu erfassen. Jetzt versuche ich, den Gas- und Wasserverbrauch mit Reedschaltern zu erfassen (die Zähler erzeugen x Anzahl von Impulsen pro kWh. Wie schlägst du vor, dies zu erreichen?

Die wichtigsten Fragen sind:

Wie soll ich die Pulszahl lokal speichern? (EEPROM? Ich kann nicht einfach jedes Mal übertragen, wenn ein Impuls auftritt, da einige Pakete verloren gehen könnten – es könnte zu Netzwerkausfällen usw. kommen.) Wie oft sollte ich Daten übertragen? Wie soll ich die Pulszahl zentral speichern? (nur die kumulierte Zahl? die ich dann mit dem Wert zu einem bestimmten Zeitpunkt vergleichen muss, um den Verbrauch zwischen 2 Daten/Zeiten zu ermitteln?)

Wenn Sie mit jedem Impuls auf das Eeprom schreiben, haben Sie bald ein totes Eeprom. Bewahren Sie es im RAM auf.
Wenn ich nur im flüchtigen Speicher speichere, wie gehe ich mit Resets um?
Wenn Sie regelmäßig senden, müssen Sie sich nur um die Zeit zwischen den Übertragungen kümmern. Und warum Resets? Wenn Sie es richtig entwerfen, haben Sie keine Resets.
Wenn ich sicher wäre, dass 100 % der Übertragungen empfangen und verarbeitet würden, wäre ich damit zufrieden, aber ich weiß, dass aufgrund vieler Variablen einige Übertragungen verloren gehen, ich brauche etwas mehr. Ein Reset könnte so einfach sein, wie ich die Batterien austausche.
Sie implementieren also keine Backup-Systeme? Oder überlappende Batteriesysteme? (Fügen Sie neue Batterien ein, bevor Sie alte Batterien entfernen). Wie wäre es mit etwas batteriegepuffertem RAM – vielleicht einem DS1306 RTC-Chip mit wiederaufladbarem Akku? Das hat ungefähr 96 Bytes RAM, das batteriegepuffert ist, und die Batterie hält monatelang ohne externe Stromversorgung.
Fügen Sie eine Taste hinzu, die Sie drücken können, um den aktuellen Zähler sofort im EEPROM zu speichern, und Sie können diese Taste immer drücken, bevor Sie die Batterien austauschen (dabei verlieren Sie sowieso einige Impulse). Für den normalen Betrieb können Sie das EEPROM regelmäßig automatisch aktualisieren. Der Zeitraum sollte davon abhängen, wie viele Schreibzyklen Ihr EEPROM verarbeiten kann und wie lange Sie planen, dieses Stück Hardware zu betreiben. Sie können auch eine Flash-Karte (z. B. SD-Karte) verwenden, die nach einiger Zeit ersetzt werden kann. Außerdem müssen Sie viel mehr Blöcke verbrennen, bevor die gesamte Karte unbrauchbar wird.

Antworten (2)

Eine zu 99 % praktikable Lösung liegt wahrscheinlich irgendwo zwischen den absoluten Werten. Zum Beispiel:

Sie könnten eine aufsteigende Zahl übertragen. Der Empfänger kann einige Übertragungen verpassen, solange er eine spätere erhält. Wenn es eine spätere Übertragung erhält, die von (nahezu) null neu startet, kann es davon ausgehen, dass der Sender aus- und wieder eingeschaltet wurde, und kann die historisch empfangene Zählung zu der neuen hinzufügen. Sie können die Zeitdauer jeder Lücke messen und die Anzahl der fehlenden Zählungen während des Stromausfalls entweder basierend auf der Rate vor dem Verlust oder aus einem vergangenen Zeitraum schätzen, der plausibel ähnlich sein könnte (d. h. dieselbe Zeit am selben Tag in den vorangegangenen Wochen). , oder von ein paar Wochen vor einem Jahr usw.). Dies kann sogar noch besser funktionieren, wenn Sie die Korrektur im Nachhinein vornehmen, um den Verbrauch über längere Zeiträume auszugleichen (dh Ausfall von einigen Stunden, Festlegen der Gesamtsumme für den Tag, um ähnliche Tage abzugleichen, anstatt die Stunde, um ähnliche Stunden abzugleichen).

Sie könnten den Zählwert regelmäßig im EEPROM speichern, wenn Sie dies bei schönen runden Zahlen tun, könnten Sie dies mit relativ wenigen Bits tun, da Sie nur die signifikanten benötigen würden. Beim Aus- und Wiedereinschalten können Sie die Zählung bei der letzten gespeicherten Zahl neu starten. Der Empfänger würde sehen, dass die Zählung bei einer etwas niedrigeren Zahl als zuvor fortgesetzt wird, und könnte die Differenz wieder zu den empfangenen Zahlen hinzufügen.

Da die meisten Stromausfälle kurz sind (abgesehen von einigen jüngsten Ausnahmen), könnten Sie eine Batteriesicherung verwenden.

Wenn die Messgeräte über ein Display verfügen, könnten Sie einen ganz anderen Ansatz wählen und eine Kamera auf sie richten und die Bilder mit optischer Zeichenerkennung verwenden.

Kein System ist perfekt – im Extremfall kann eine intelligente manuelle Korrektur erforderlich sein.

Danke - schöne ausführliche Antwort. Ich darf nicht in das EEPROM schreiben, da das Zurücksetzen von 0 tatsächlich einen ziemlich netten Indikator dafür liefert, dass es einen Ausfall gegeben hat und möglicherweise eine gewisse Nutzung verpasst wurde. Das Sender-/Impulszählgerät wird mit Batterien betrieben, so dass es im Falle eines Stromausfalls sicher ist, aber nicht sicher, wenn die Batterien leer sind (es SOLLTE mich benachrichtigen, wenn die Batterien schwach sind). Ich muss jetzt den effektivsten Mechanismus zum Speichern der Zeit- / Pulsdaten für die grafische Darstellung / Analyse in Angriff nehmen.
Achten Sie darauf, dass Ihre Spannungsüberwachungsschaltung (Teiler?) Die Stromaufnahme nicht erhöht (nicht wirklich signifikant, wenn der Prozessor immer läuft, aber im Vergleich zu Mikroverstärkern im Schlafmodus enorm wichtig).

Wasserverbrauch in kWh???

Die Häufigkeit der Übermittlung Ihrer Daten richtet sich nach der Pulsfrequenz und der Aktualität Ihrer Informationen. Es macht nicht viel Sinn, jede Stunde ein Update zu senden, wenn Sie im Durchschnitt nur 1 Impuls pro Stunde erhalten. In diesem Fall reicht einmal täglich oder so. Sie könnten jedes Mal senden, wenn Sie beispielsweise 10 Impulse gezählt haben, aber dann senden Sie nichts, wenn Sie eine Woche weg sind, und der Empfänger möchte möglicherweise häufigere Updates. Eine bessere Alternative ist daher das Versenden in festen Zeitintervallen, also täglich um 12 Uhr und um Mitternacht.

Für die Zuverlässigkeit der Datenübertragung haben Sie mehrere Möglichkeiten. Die RFM12B- Funkmodule sind Transceiver, sodass Sie den Empfänger eine Bestätigung senden lassen können. Nicht gerade kompliziert, aber es geht noch einfacher, mit Einwegkommunikation. Das Wort ist Redundanz. Viel davon. Das ist oft ein Schimpfwort, aber hier ist unser Datenvolumen so gering, dass etwas Redundanz nicht schaden kann; es würde sich wohl kaum lohnen den sender einzuschalten um zwei bytes zu senden, oder?

Jetzt ist es keine gute Idee, 5 Kopien derselben Daten in derselben Übertragung zu senden. Die Redundanz nützt nichts, wenn die komplette Übertragung gestaut wird. Folgendes tun Sie: Die N-te Übertragung sendet Folgendes:

• der Zählerwert N (1 Byte genügt) • die N-4-ten Daten
• die N-3-ten Daten
• die N-2-ten Daten
• die N-1-ten Daten
• die neuen Daten
• Hamming-ECC

Ich würde kumulative Daten senden, zum Beispiel 16-Bit-Zahlen. Wenn Sie einen Puls pro 0,1 m haben 3 Wasser läuft nach ein paar Jahren über, aber der Empfänger sollte damit kein Problem haben.

Dadurch erhalten Sie eine Nutzlast von nur wenigen Dutzend Bytes, stellen jedoch sicher, dass alle Daten empfangen werden, selbst wenn 4 aufeinanderfolgende Übertragungen verloren gehen. Wenn Sie dadurch besser schlafen, können Sie dies bei Bedarf immer noch mit einer Bestätigung und einer erneuten Übertragung kombinieren.

Der Mikrocontroller hat fast nichts zu tun: Halten Sie einen Timer, um die Zeit bis zur nächsten Übertragung zu halten, und zählen Sie eingehende Impulse. Sie können es mit einem billigen 32,768-kHz-Quarz betreiben. Selbst ohne Verwendung der Energiesparmodi verbraucht ein MSP430F1101A nur ein paar vernachlässigbare µA; Ihr Netzteil verbraucht ein Vielfaches davon. Schalten Sie den Sender nur zweimal täglich ein, um Ihre Daten zu senden.

Ihr Mikrocontroller muss monatelang ununterbrochen laufen, und dann müssen Sie mit Stromausfällen rechnen. Wo ich lebe, sind sie selten; Die letzte stammt von 3 Jahren und dauerte 15 Minuten, aber mir wurde gesagt, dass sie in ländlichen Gebieten in den USA häufiger vorkommen, wo es viele Freileitungen gibt. Wie auch immer, Sie möchten eine Batteriesicherung, um den Controller während eines Stromausfalls am Laufen zu halten. Eine CR2032 Zelle und ein MSP430 reicht für die Ewigkeit. ODER den Ausgang der Batterie mit der Netzstromversorgung (3,3 V) mit ein paar Dioden. Verschieben Sie Übertragungen im Akkubetrieb.

Es ist nicht erforderlich, die Zähler im EEPROM zu speichern, sondern nur im RAM.