Forum: Mikrocontroller und Digitale Elektronik Energiesparende Lösung zur Langzeitmessung und Speicherung eines Pinzustandes gesucht.


von Michael B. (micha_b)


Lesenswert?

Hallo,

ich möchte über einen langen Zeitraum (mindestens 1 Jahr) im Minutentakt 
den Status eines Pins auslesen und nicht flüchtig speichern. Der Status 
ändert sich über z.B. das Schließen eines Reed Relais.

Das Ganze soll ein mobiles kleines Kästchen werden, in der Größe eines 
Feuerzeugs o.ä. .
Die Messwerte würde ich dann gerne per USB auslesen und wieder löschen 
können.

Da die Anzahl der Statusänderungen gering sein wird (ca. 10x / Tag) kann 
man natürlich über entsprechende speichersparende Lösungen nachdenken.
Also z.B. 234 Minuten LOW / 16 Minuten high ergäbe nur zwei Byte.

Jede Minute einzeln zu speichern macht bei 525.600 Minuten / Jahr keinen 
Sinn. 3650 Statuswechsel / Jahr sind da eher realistisch.

- Wie geht man so etwas prinzipiell an?
- Mit welcher stromsparenden Hardware kann man das umsetzen?
- Spannungsversorgung über CR2032 oder gibt's Alternativen?


Ich habe bisher nur mit ATMEGAs gearbeitet, und da auch schon 
umfangreiche Projekte umgesetzt, die waren aber alle nicht 
stromsensibel.

Ich wäre euch sehr dankbar, wenn ihr mir zu meinem Projektchen eine 
Hardwareempfehlung geben könntet, und vielleicht ein Ansatz wie man das 
maximale aus der Ladung der geplanten CR2032 Spannungsversorgung heraus 
bekommt.

Vielen Dank vorab,

Micha

von S. Landolt (Gast)


Lesenswert?

Lässt sich ein zeitlicher Maximalabstand der Zustandswechsel angeben?

von lks (Gast)


Lesenswert?

> Mit welcher stromsparenden Hardware kann man das umsetzen?

Hier würde ich mir ggf. mal die msp430 mit fram anschauen (bis 128kb), 
vielleicht ist da was dabei.

von Baldrian (Gast)


Lesenswert?

USB plus 3650 Statuswechsel/Jahr plus CR2032 würde ich einen STM32F103 
nehmen oder einen entsprechenden Controller aus der AVR-Serie.

von Michael B. (micha_b)


Lesenswert?

S. Landolt schrieb:
> Lässt sich ein zeitlicher Maximalabstand der Zustandswechsel angeben?

Leider nein, jeder Zustand kann auch ein paar Wochen dauern.
Ach ja, die zeitliche Genauigkeit der Messung ist zweitrangig, d.h. 
Toleranz bis +/- 1% ist i.O.

von jz (Gast)


Lesenswert?

Du solltest auch über Fehlerkorrektur nachdenken, wäre ja wirklich 
ärgerlich wenn nach einem Jahr messen Bitfehler vorliegen.

von Peter D. (peda)


Lesenswert?

Michael B. schrieb:
> Jede Minute einzeln zu speichern macht bei 525.600 Minuten / Jahr keinen
> Sinn. 3650 Statuswechsel / Jahr sind da eher realistisch.

Wenn Du die Minuten als 31Bit zählst (+ 1Bit für Pinzustand), sind das 
nichtmal 16kB, da lohnt noch keine Komprimierung.
Du kannst nen ATmega328 nehmen, der mit Uhrenquarz schläft (<1µA) und 
mit Pin-Change-Interrupt aufwacht. Die Daten schreibst Du in die oberen 
16kB Flash oder in einen externen EEPROM (AT24C512).

von c. m. (Gast)


Lesenswert?

Peter D. schrieb:
> Du kannst nen ATmega328 nehmen, der mit Uhrenquarz schläft (<1µA) und
> mit Pin-Change-Interrupt aufwacht. Die Daten schreibst Du in die oberen
> 16kB Flash oder in einen externen EEPROM (AT24C512).

dazu müsste der schlafende atmega aber beim pinwechsel auch wissen wie 
viel zeit vergangen ist. kann der dat?

von Georg (Gast)


Lesenswert?

Michael B. schrieb:
> Jede Minute einzeln zu speichern macht bei 525.600 Minuten / Jahr keinen
> Sinn

Das sind Sekunden!! Für die 9000 Minuten pro Jahr braucht man als 
serielle Bits etwas mehr als 1 kByte, also nur Pipifax. Aus dem gleichen 
Grund braucht man als Time Stamp nur 15 bit, also für 4000 Wechsel 8 
kByte. immer noch kein Problem. Und für den Energieverbrauch spielt das 
überhaupt keine Rolle, die Speicherung frisst keine Energie, sondern der 
Betrieb des µC, und da reicht es wenn er einmal pro Minute kurz 
aufwacht.

Man kann sich das Leben natürlich auch künstlich schwermachen, etwa 
indem man Timestamps verwendet, die vom Urknall bis zum Ende des 
Universum reichen...

Georg

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

Vernünftig würde mir erscheinen, dass du den Controller beim 
Pegelwechsel am Pin aufweckst(Interrupt) und die Zeit im Flash oder 
EEPROM abspeicherst.Das spart am meisten Strom und Speicher, ausserdem 
entgeht dir kein Pegelwechsel.

Grüsse

von Baldrian (Gast)


Lesenswert?

@ Georg

365 Tage x 24 Stunden/Tag x 60 Minuten/Stunde =  525.600 Minuten

von S. Landolt (Gast)


Lesenswert?

Da gab's doch mal ein Lied:
fivehundredtwentyfivethousandsixhundred minutes
fivehundredtwentyfivethousand moments oh dear
fivehundredtwentyfivethousandsixhundred minutes
how do you measure, measure a year?

von Achim.S (Gast)


Lesenswert?

Bei etwa 10 Wechsel pro Tag wäre ein möglicher Ansatz:
erstes Byte: Pinzustand (0 oder 1), Ggf. folgt noch eine Absolutzeit.

Ab dem zweiten Byte (unter der Voraussetzung, dass der Speicher zu 
Beginn 0xff ist):
  0..240 = 0..240 Sekunden bis zum Levelwechsel
  241: 240 Sekunden + nachfolgendem Byte (bzw. Bytes)

Bis zu 4 Stunden passen also in 1 Byte. Insegsamt brauchst Du dann 1 
Byte pro Flankenwechsel (also 4kB) + ggf. ein paar Mehr, wenn 4h 
überschritten werden. Maximal also 6kB pro Jahr.

Zur Speicherung reicht statisches RAM, solange die Batterie wirklich 
fest verbunden ist und nicht einfach so rausfällt.

von Planlos (Gast)


Lesenswert?

Michael B. schrieb:
> ... Hardwareempfehlung ...

Mit sowas hier anfangen: ebay 171280297414

Da mit hast du eine einigermaßen präzise RTC (± Fake).
Ob die aber am Ende des Jahres die Uhrzeit noch auf 1% genau hat?

Mit drauf ist ein 4kilobyte-EEPROM. Das reicht gemeinerweise nicht für 
3650 Timestamps. Runterlöten und z.B. durch Ebay 310624875928 ersetzen.

Dieses RTC-Platinchen hat einen Steckverbinder. Dazu zwei Gegenstellen 
bauen.

Eine z.B. aus einem Arduino Nano Clone (ebay 172425955537) mit 
PC-Verbindung (USB) zum Uhrzeit stellen und EEPROM auslesen.

Und eine sparsame (hier gehen die Arduino-Clones nicht, zumindest nicht 
unverändert) mit schlafendem AVR (+eigener Knopfzelle), der per 
PIN-Change aufwacht, Zeit aus RTC liest, timestamp mit neuem Status ins 
EEPROM schreibt, weiterschläft.

Wird nicht ganz "Feuerzeug-Format" kriegen, das liegt aber eher an den 
Batterien.

Disclaimer: Ich hab bei den Ebay-Links einfach den Erstbesten im 
Suchergebnis genommen. Gibt sicher billigere/mit weniger 
Versandkosten/Schneller hier weil nicht aus China/usw. Selber suchen.


Falls am Einsatzort WLAN vorhanden ist:
Option2, ESP8266: (Ebay 272359218537) hat genug nichtflüchtigen 
Speicher, aber keine RTC. Müsste also Aufwachen, WLAN verbinden, 
Zeitserver fragen, Event wegspeichern (und/oder in die Cloud packen), 
weiterschlafen.
Braucht wg. Wlan eine dickere Batterie.

von Stefan F. (Gast)


Lesenswert?

Vergiss nicht, dass du dazu wohl auch eine Echtzeituhr benötigst.

von Wolfgang (Gast)


Lesenswert?

c. m. schrieb:
> dazu müsste der schlafende atmega aber beim pinwechsel auch wissen wie
> viel zeit vergangen ist. kann der dat?

RTC heißt das Wunderding, dass man ihm bequemerweise zur Seite stellt, 
damit man die aktuelle Uhrzeit zur Verfügung hat.

von Peter D. (peda)


Lesenswert?

c. m. schrieb:
> dazu müsste der schlafende atmega aber beim pinwechsel auch wissen wie
> viel zeit vergangen ist. kann der dat?

Ja, deshalb der Uhrenqurz an T2.
T2 läuft weiter, auch wenn die CPU schläft. Bei Compare Match gibt es 
einen Interrupt, die CPU wacht auf, zählt die Minuten hoch und geht 
wieder schlafen.

: Bearbeitet durch User
von Gerald M. (gerald_m17)


Lesenswert?

Hardware:
Man nehme einen STM32L0 mit 64k Flash, programmiere ihn umd löte ihn auf 
eine Knopfzelle. Anschließend wird noch der zu messende Pin verbunden.

Software :
Starte die integrierte RTC, speichere Zeit als je ein Byte für 
Minute:Stunde:Tag:Monat,  lege den Controller schlafen und aktiviere 
davor einen wake up interrupt bei pin change.
Bei interrupt, lese RTC, speichere 4 Byte in nächste Position im EEprom. 
Schlafe.
Bei Interrupt, lese RTC, speichere 4 Byte in nächste Position im EEprom 
bis Page Size des Flash Speichers erreicht ist (128 Byte(?)) kopiere 
EEprom ins Flash. Schlafe.
Bei interrupt, lese RTC, speichere 4 Byte in erste Position im EEprom. 
Schlafe....

Nach einem Jahr, lese am PC den Flash aus und speichere.
Werte aus und beachte dass der interne Oszillator nicht kallibriert ist, 
man aber alles sehr einfach kalibrieren kann, da man ja weiß von wann 
bis wann der Controller lief.

von Patrick (Gast)


Lesenswert?

Ich würde, um Speicher zu sparen, nur die Flankenwechsel + Datum/Uhrzeit 
speichern.
Für die "Richtung" des Pegelwechsels reicht ein Bit. Der Zeitstempel mit
Tag, Monat, Jahr, Stunde, Minute braucht (vorausgesetzt, dass immer zur 
vollen Minute gemessen wird):
5 + 4 + 12 + 6 + 6 Bit
also 34 Bit.
Wenn du dich beim Jahr darauf festlegst, dass du hinterher einfach noch 
2000 addierst, kommst du mit 8 Bit bis ins Jahr 2255, das sollte meiner 
Meinung nach ausreichen. Es verbleiben also noch 30 Bit, das sind 4 Byte 
mit 2 ungenutzten Bits (mit denen du z.B. durch Nutzung für die 
Jahreszahl bis 3023 kommst).
Programmiertechnisch ist diese Art der Speicherung und die anschließende 
Auswertung zwar schwieriger, jedoch mittes shift-Operationen leicht zu 
bewerkstelligen. In C einfach Variablen vom Typ "unsigned long" 
verwenden.

Wenn du natürlich öfter Pegelwechsel hast, schreibst du dir damit 
schnell den Speicher zu.
Alternativ das Startdatum/Uhrzeit speichern und danach beständig jede 
Minute in einem Bit den Pegel speichern.
Das Startdatum außer acht gelassen, muss also mindestens 32 Minuten 
zwischen den Pegelwechseln liegen, damit die Abspeicherung von 
Flankenwechseln mit Zeitstempel Sinn macht.

von Baldrian (Gast)


Lesenswert?

> Für die "Richtung" des Pegelwechsels reicht ein Bit.
> Der Zeitstempel mit Tag, Monat, Jahr, Stunde, Minute braucht
> (vorausgesetzt, dass immer zur vollen Minute gemessen wird):
> 5 + 4 + 12 + 6 + 6 Bit also 34 Bit.

Stattdessen würde ich 16 Bit Werte speichern: Ein Bit für den 
Pegelwechsel und fünfzehn Bits für die verstrichenen Minuten. An den 
Anfang der Aufzeichnung kommen Uhrzeit & Datum.

von Patrick (Gast)


Lesenswert?

...Oder du speicherst das Startdatum/Uhrzeit und bei jedem 
Flankenwechsel die Richtung und in 23 Bit den "Minutenoffset" dazu. So 
kommst du mit drei Byte hin und hast kommst auch ein paar Jahre weit 
(15, wenn ich mich nicht täusche). Das Startdatum kann dann auch 
"Ausführlicher" sein, das fällt ja bei vielen Messwerten nicht mehr ins 
Gewicht.
Die Auswertung bzgl. Schaltjahren und die Rückkonvertierung musst du 
dann eben am PC machen.

von Patrick (Gast)


Lesenswert?

Baldrian schrieb:
> Stattdessen würde ich 16 Bit Werte speichern

Geht auch, aber dann kommt man nur 22 Tage weit. Danach kann man aber 
auch wiederum einen Zeitstempel speichern.
Die Möglichkeiten sind schier ungbegrenzt :>

von Amateur (Gast)


Lesenswert?

Hier wird mal wieder, mehr oder weniger Erfolgreich, im Nebel 
herumgestochert.

Die, aus meiner unmaßgeblichen Sicht wichtigsten, Informationen fehlen.
Also:
Wie oft ist zu erwarten, dass sich was tut und wie genau soll dies 
protokolliert werden?

Vor allem, da das interne EEPROM meist nicht viel Platz bietet. So kann 
es dann sein, dass noch ein paar Krücken nötig werden. So zum Bleistift: 
Externe EEPROMs, Batteriegepufferte (?!?) RAM-Bausteine oder die bereits 
angesprochenen FRAM. Bei großem Datenvolumen könnte sogar eine SSD-Karte 
sinnvoll werden.

Energietechnisch wird wohl eine Kombination aus einem energiesparenden 
µP und einer externen RTC am sinnvollsten sein.
Viele µP können zwar eine eigene RTC betreiben, aber ich kenne keinen, 
der energiemäßig, an eine externe RTC herankommt. So bleibt nur noch die 
Reaktion auf einen Flankenwechsel des µP übrig.
Nicht vergessen: Jeder µP, der irgendwie Tickt, will programmiert 
werden. Also auch das Stellen der Uhr oder das Rücksetzen, nach dem 
Auslesen der Werte.

von Peter D. (peda)


Lesenswert?

Amateur schrieb:
> Viele µP können zwar eine eigene RTC betreiben, aber ich kenne keinen,
> der energiemäßig, an eine externe RTC herankommt.

Der ATmega328 kommt auf <1µA bei 3V und 25°C, das sollte für viele 
Anwendungen ausreichen.
Siehe Datenblatt:
Figure 33-13. ATmega328: Power-Save Supply Current vs. VCC (Watchdog 
Timer Disabled and 32kHz Crystal Oscillator Running)

von Amateur (Gast)


Lesenswert?

@Peter
Ich weis, das ist auch sehr wenig, aber z.B. bei der PCF8563, wirklich 
eine 08/15 Uhr steht:
"Low backup current; typical 0.25 µA at VDD = 3.0 V and Tamb = 25°C"
würde mich nicht wundern, wenn sich das nicht sogar unterbieten lässt.

von Peter D. (peda)


Lesenswert?

Amateur schrieb:
> "Low backup current; typical 0.25 µA at VDD = 3.0 V and Tamb = 25°C"
> würde mich nicht wundern, wenn sich das nicht sogar unterbieten lässt.

Warum zusätzlichen Aufwand treiben, um besser als ausreichend zu sein?

von Baldrian (Gast)


Lesenswert?

Amateur schrieb:

> Vor allem, da das interne EEPROM meist nicht viel Platz bietet. So kann
> es dann sein, dass noch ein paar Krücken nötig werden. So zum Bleistift:
> Externe EEPROMs, Batteriegepufferte (?!?) RAM-Bausteine oder die bereits
> angesprochenen FRAM. Bei großem Datenvolumen könnte sogar eine SSD-Karte
> sinnvoll werden.

Weder externes EEPROM oder gar eine SD-Card werden benötigt. Die zu 
erwartende Datenmenge ist grob bekannt (siehe oben).

> Energietechnisch wird wohl eine Kombination aus einem energiesparenden
> µP und einer externen RTC am sinnvollsten sein.

Nein, ...

> Viele µP können zwar eine eigene RTC betreiben, aber ich kenne keinen,
> der energiemäßig, an eine externe RTC herankommt.

... da es auf die Gesamtbilanz ankommt.

von dummschwaetzer (Gast)


Lesenswert?

MSP430FR mit RTC

von Stromverdichter (Gast)


Lesenswert?

Wenn es unter 1µA bleiben soll gehts auch mit einem Atmel SAML21. Dazu 
kann man ein paar nette Features nutzen und bleibt weiterhin unter 1µA.

Beim SAML22 gibt sogenannte Damper-Inputs, die hängen am RTC und 
funktionieren wie externe Interrupts. Ausgelöst wird damit ein 
RTC-Interrupt. In der Interrupt-Routine wird dann geprüft, welcher Kanal 
ausgelöst hatte. Das ganze gibts auch mit Entprellung und Zeitstempel 
der Auslösung.
Aktiv ist dabei nur Backup + RTC.
Im RTC gibts dann noch ein paar nette 32bit Register die als 
speichernder RAM während der Schlafzyklen benutzt werden können.
Die Werte könnte man dann z.B. täglich ins Flash schreiben.

Minimalbeschaltung kann der reine Prozessor mit USB-Anschluss sein. Ein 
32kHz Quarz gäbe dir eine recht genaue RTC dazu.
Theoretisch kommt man ohne Quarz auf bis zu 0,14µA, nutzt man jedoch ein 
paar Features sind ca 0,6µA eher realistisch. Mit Quarz sollte man bei 
ca 1µA rauskommen.

Vorteile dieser Lösung wären:
- USB-Interface
- bis zu 265kB Flash nutzbar als Datenspeicher für die Messwerte
- weiter Spannungsbereich: 1,6V - 3,6V
- Mehrere Interrupts im RTC mit Zeitstempel nutzbar(SAML22)
- Externe Interrupts auch mit RTC nutzbar.

Den SAML22 nutze ich zur Zeit mit einem 100 Segment 
Charakter-LCD-Display bei laufender Anzeige zur Durchflussmessung und 
Langzeiterfassung von Leitwert und Durchflussmenge bei unter 10µA. Mit 2 
Mikrozellen läuft das die nächsten 10-20 Jahre. Da kosten halt ein 
Operationsverstärker und das LCD noch ein paar µA.

von c-hater (Gast)


Lesenswert?

Baldrian schrieb:

> Stattdessen würde ich 16 Bit Werte speichern: Ein Bit für den
> Pegelwechsel und fünfzehn Bits für die verstrichenen Minuten. An den
> Anfang der Aufzeichnung kommen Uhrzeit & Datum.

Das ist schon fast optimal. Tatsache ist: du verschwendest mit diesem 
Ansatz vollkommen sinnlos ein Bit pro Sample.

Natürlich würde man zur Anfangszeit auch noch den Anfangszustand in 
einem einzigen Bit speichern, dann dann steckt die Information über den 
Pegel für jedes Sample bereits allein in der Tatsache der Speicherung 
eines Zeitoffsets, denn dieser erfolgt ja lt. Definition nur bei einem 
WECHSEL des Pegels.

Zusätzlich könnte man sicher noch die Speicherung der Zeitoffsets 
optimieren. Da muss man wohl nicht jedesmal 16 Bit für verschwenden. 
Allerdings hängt die optimale Strategie natürlich sehr stark davon ab, 
wie die durchschnittlich 10 Pegelwechsel "im Regelfall" über den Tag 
verteilt sind. Vermutlich würden aber 7Bit + 1Bit "Escape" schon für 
einen sehr hohen Prozentsatz der Tage den Speicherbedarf problemlos 
halbieren. Und für die paar Tage, bei denen das nicht zutrifft, also das 
Escape-Bit plus ein (oder mehr) zusätzliche Bytes für den Zeitoffset 
benötigt werden, wäre er immer noch kleiner als bei stumpfer 
16-Bit-Speicherung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.