Daten Logger - ohne PC/ohne extra Hardware

Hallo,

ich möchte Sensordaten mitloggen, ca. 10 Werte pro Messung, jeder Wert hat ein byte, 24 Stunden, Messungen im Abstand von 5min also mindestens 288 Werte pro Tag - ich könnte die Daten täglich auslesen und überschreiben, dazu möchte ich sie seriell über den PC auslesen, und später in eine Exeltabelle übernehmen.

Wie mache ich das am besten? - Daten in den Eeprom schreiben? - Wie lege ich das am besten im Programm an? - Mit einzelnen Variablen-wie kann ich das machen ohne 288 Variablen einzeln zu deklarieren (in Basic hab ich da früher einfach "Sensorwert x" gemacht und x hochgezählt geht das in Arduino auch?) - Oder besser ein Array (kenn ich mich nicht mit aus)?

Vielen Dank

Wär vielleicht das hier was für Dich...?

Ja den hab ich auch schon gesehen aber ich denke der interne Eeprom reicht mir aus, ich weiß nur nicht wie ich die ganzen Variablen deklarieren soll und wie ich am geschicktesten vorgehe. Ich könnte einfach immer einen Datensatz aus 10 Variablen abspeichern aber vielleicht gibts da ja was eleganteres? Den Eeprom bekomme ich wahrscheinlich mit der Eeprom Lib. beschrieben und ausgelesen, soweit bin ich bisher.

Du packst die Werte ins EEPROM, dort sind sie vor Stromausfall sicher. Hast dort Platz für 512 Bytes. Du könntest als erstes Byte einen Zähler anlegen, damit Du weißt, welche Position als nächstes beschrieben werden soll - praktisch nach Stromausfall. Nach dem Auslesen den Zähler einfach auf Null stellen, dann überschreibst Du automatisch. Die Library dazu ist eingebaut: http://arduino.cc/en/Reference/EEPROM (einziges Problem meiner Idee: da der Zähler nur 1 Byte groß ist bist Du auf 256 Werte beschränkt und kannst das EEPROM nicht voll ausnutzen)

Hallo Wenn Du 2 Byte für den Zähler nimmst kannst Du den ganzen Speicher ausnutzen. Du kannst das EEprom auch "inizialisieren" indem Du es nachdem Du die Meßwerte heruntergeladen hast mit einem Wert vollschreibst (0 oder 255) und dann weißt Du was leer ist und was schon verwendet.

Der ATmega328 hat 1024 Byte EEprom die du benutzen kannst und mit der Bibliothek EEPROM ansprechen kannst.

Grüße Uwe

Das ist eine gansz schlechte Idee, weil man dann den Wert 0 bzw. 255 nicht mehr speichern kann.

Hallo Martin Gerken Ich würde nicht so absolut die Idee verteufeln. Es hängt davon ab ob man wirklich den vollen Werteraum braucht oder anstatt mit 256 Werten mit 255 Werten auskommt. Das muß kimmi wissen und entscheiden. Viele Grüße Uwe

Hallo kimmi,

was Du vorhast, hab ich für meinen Temperaturlogger bereits gebaut.

Ich habe mich damals für einen zusätzlich EEPROM-Chip entschieden. Das einzubauen war einfach und erspart irgendwelche Sparsamkeiten beim Daten speichern. Aber das musst Du wissen.

Zum Thema Daten zwischen PC und Arduino austauschen habe ich hier schon mal was geschrieben:

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1276463588/4#4

Ich habe mir eine Oberfläch in Visual C# programmiert. Das geht ziemlich gut.

Ein Problem auf das ich gestoßen bin ist, dass sämtliche libraries für den Arduino, die die Uhrzeit berechnen sehr unpräzise sind (mehrere Minuten pro Tag). Deshalb habe ich mich zusätzlich für einen DS1307 entschieden. Das ist ein IC, der eine Uhrzeit zurückliefert. Dafür gibt es ebenfalls eine library.

Vielleicht konnte ich Dir ein paar Tipps geben.

hallo domspitze Hattest Du keine Probleme mit der Zeit die das EEprom braucht um die Daten zu speichern? Grüße Uwe

Hallo Uwe,

ich versteh Dein Frage nicht so ganz.

Hattest Du keine Probleme mit der Zeit die das EEprom braucht um die Daten zu speichern?

Ich hab das hier benutzt. http://www.arduino.cc/playground/Code/I2CEEPROM Zwischen den Schreib- und Lesevorgängen müssen 5ms liegen.

Oder habe ich hier eine Feinheit in der Fragestellung übersehen??? Falls ja, sorry!

@kimmi: sobald Du das hinbekommen hast könntest Du danach (auf keine Fall vorher) auf die Idee kommen mal nachzuschauen wie schnell sich die Werte innerhalb 5 Minuten ändern. Ich würde vermuten, daß die Differenzen eher klein sind. Da würde es sich anbieten alle 12 Werte einen "Frame" zu speichern und die jeweils nächsten 11 Werte nur die Differenzen. Das sollte sich sehr gut komprimieren lassen.

Weiterhin hat das Teil ja wohl die ganze Zeit Strom --> warum die Daten nicht einfach im RAM halten? Davon ist noch dazu auch noch mehr da als EEProm.

Udo

Hallo Domspitze. Ich verfolge einen Tread im italienischen Teil des Forums. Der hat Probleme mit 100 Hz Analogdaten zu messen und abzuspeichern. Darum meine Frage. Grüße Uwe

Hallo, danke für die Beiträge, ich werde wohl eine Weile brauchen um das zu verarbeiten, ich bin da wie gesagt nicht so fit.

Ich habe auch schon daran gedacht die Daten einfach im Flsh zu behalten aber das Risiko das mir zwischendurch der Strom doch ausfällt war mir zu hoch aber 1024 byte sind echt wenig... vielleicht muss ich doch einen zusätzlichen Eeprom dranbauen, @ domspitze da wären weitere Infos zu dem Temperaturlogger gerne willkommen!

@Udo Klein: Das mit dem RAM brächte immerhin schon 1KB mehr. Aber das ist auch nicht viel. Ein zweites Problem ist, dass sobald der Arduino Duemilanove (nur darüber kann ich reden) über USB angeschlossen wird,um die Daten an den PC zu schicken, er einen Reset auslöst. Egal, ob er noch eine externe Stromversorgung zusätzlich hat oder nicht. Das würde alle Daten im RAM löschen. Persönliche Erfahrung. Den Reset lösst natürlich der USB-Port aus. Wahrscheinlich weil kurzfristig der Saft weg geht. USB-Power scheint hier über Externe zu gehen - das ist aber alles Vermutung von mir.

@kimmi: Was würde Dir helfen? Das Sketch schicken macht wenig Sinn, da das schlecht dokumentiert und mittlerweile echt lang ist. Also besser konkrete Fragen stellen.

Wenn ich mal ganz vorsichtig dazwischen funken darf...

Warum nicht gleich ein statisches Ram mit externem Adresszähler und Batterierpufferung verwenden ? Schnell, langlebig beliebig oft beschreibbar. Und heutzutage für diese Speichermengen (32 - 512 MB) geradezu günstig.

@domspitze: den Reset könnte man auch unterdrücken. So schwer ist das nicht. Zur Not muß man die entsprechende Leiterbahn durchtrennen.

http://www.arduino.cc/playground/Main/DisablingAutoResetOnSerialConnection

Oder gleich einen Clone nehmen bei dem Reset abgeklemmt werden kann http://www.seeedstudio.com/blog/seeeduino-and-its-pals/

oder einer der keinen FTDI Chip mit auf dem Board hat und damit auch zunächst einmal keinen Autoreset.

Was das "Risiko" eines Stromausfalls angeht

1) Du kannst mit einem Gold Cap Elko puffern. 2) Wenn die Daten wirklich wichtig sind, dann nimmt man keine Selbstbaulösung. Selbst einen billigen Logger wie z.B. den hier http://www.amazon.de/TFA-30-3015-Profi-Thermo-Hygrometer-mit-Datenlogger-Funktion/dp/B000M11WBI/ref=sr_1_6?ie=UTF8&s=garden&qid=1277840991&sr=8-6 kann man mit einer Selbstbaulösung nur schwer schlagen. Schon gar nicht für den Preis.

Udo

Hallo Realizer Gegenfrage: gibt es statisches Ram mit I2C Schnittstelle? Grüße Uwe

Huch, sorry Ich ging nicht von I2C aus... hatte wohl zu hastig gelesen.

Ich vergaß zu erwähnen, dass ich Arduino Pro-Mini 328er low-power verwende und sie während des loggen nicht an einen PC angeschlossen werden, wenn sie allerdings eine Reset bekommen sobald ich sie an die USB Schnittstelle hänge, gibts ja nichts mehr zum auslesen, ich dachte allerdings, dass der Reset nur ausgelöst wird, wenn ich sie mit Arduino umprogrammiere nicht schon beim bloßen einstecken??

Kann ich nicht einfach auf Knopfdruck die Daten seriell rausschicken und über Processing oder so am PC abspeichern?

Ich hab auch leider immer noch nicht verstanden, wie ich bei jedem neuen Messdruchgang neue Variablen erzeugen kann ohne sie alle vorher definiert zu haben, kann ich da einfach einen Zähler hintendranhängen so "Wert x"? Geht das so?

  • Sorry hab seit dem C64 nicht mehr viel programmiert -

Hallo Realizer Es muß nicht i2c sein aber ein RAM mit paraleller Schnittstelle und x Adressleitungen ist mit dem Arduino einfach schwierig anzubinden. Grüße Uwe