Forum: Mikrocontroller und Digitale Elektronik mobile Datenerfassung: wie Daten abliefern?


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo zusammen,

ich habe in kleines mobiles Datenerfassungsgerät gebaut, basierend auf 
einem ATmega328P, ein paar Sensoren (Temperatur, luftfeuchtigkeit, CO2, 
VOC) und einem kleinen Display. Das Teil ist mobil und 
batteriebetrieben, und hat eine serielle Schnittstelle.

Mobil deswegen, weil ich es an verschiedenen Orten ein paar Stunden 
laufen lassen will. Dort steht mir nichts zur Verfügung, was die Daten 
vom UART abgreifen kann. Deswegen hab ich ein 24C65 (I2C EEPROM) 
eingebaut, auf das ich die Daten speichern kann.

Ich frag mich nun wie ich die Prozedur des "Daten abholen" 
implementieren soll. Das Ding hat einen (einen!) Taster am AVR.

Idee: wenn bei gedrücktem Taster eingeschaltet wird, geht das Teil in 
den "Daten senden" Modus, und schickt die gespeicherten Daten per UART.

Nur - was tu ich danach mit den Daten im EEPROM? Überschreiben? löschen?

Falls ich "versehentlich" den Taster beim Einschalten gedrückt halte, 
würden die Daten gesendet, sollen danach aber nicht gelöscht werden. 
Auch wenn die Übertragung klappt, könnte es ja sein dass beim Speichern 
am PC was schiefgeht...

Weiters wäre es schön, wenn mehrere "Pakete" gespeichert werden könnten: 
ich trage das Ding an ort A, schalte ein, zeichne 2 Stunden auf, 
ausschalten, dann an Ort B, einschalten, wieder drei Stunden 
aufzeichnen.

Am Ende komm ich an meinen PC, und will die Daten von Ort A und Ort B 
haben.

Meine Idee: ich speichere eine "Paketnummer" im EEPROM, bei jedem 
Einschalten wird diese erhöht. Die eigentlichen Messdaten im EEPROM 
werden zusammen mit der Paketnummer gespeichert, und beim Abrufen werden 
immer alle Pakete gesendet. Beim Schreiben wird das EEPROM wie ein 
Ringpuffer verwendet, die ältesten Daten (mit der ältesten Paketnummer) 
werden einfach überschrieben.

Verschmerzbarer Nachteil: ich habe u.U. "uralte" Daten im EEPROM, die 
ich immer wieder mit auslese. Da die Daten dann in eine 
tabellenkalkulation gehen, kann ich mir die höchste paketnummer suchen, 
und alle anderen löschen.

Gibts bessere Ideen?


Danke, Michi

von Kart (Gast)


Lesenswert?

Spontan würde ich das Auslesen nicht mit dem Taster starten. Wenn das 
System am Rechner hängt würde ich es nur über den UART steuern.

Eine weitere (einfache) Möglichkeit wäre es eine SD-Karte zu verwenden. 
Tutorials zur Ansteuerung gibt es wie Sand am Meer. Die Daten können 
direkt in (txt-) Dateien geschrieben werden. Der Controller kann dann 
auch bei jedem Neustart eine neue Datei anlegen. Damit könnten die Daten 
auch ohne Controller von der SD-Karte ausgelesen werden...

Man darf jedoch die Datenschreibgeschwindigkeit vergessen. Die ist (nach 
meinen Erfahrungen) nicht vergleichbar mit einem Betrieb der SD-Karte in 
einem PC.

von nicht"Gast" (Gast)


Lesenswert?

Hey,

Warum sendest du nicht einfach dann die Daten, wenn ein bestimmtes 
Zeichen auf dem UART reinkommt. Dann kannst du auch ein Kommando zum 
Löschen der Daten festmachen.


Grüsse

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Danke euch für die Antworten!

Steuerung per UART gefällt mir nicht so gut: Ich möchte sauber trennen 
zwischen "Daten abliefern" und "aufzeichnen". Entweder-oder.

SD-Card hab ich überlegt, aber ich brauch bei weitem nicht die Kapazität 
(das 64kBit-EEPROM ist schon überdimensioniert), und ich mag mir keine 
FAT-Treiber antun. Abgesehen davon basiert die ganze Schaltung auf 5V 
(die Sensoren brauchen das), und die ganze pegelwandlung für SD-Cards 
ist dann etwas problematisch.

von Kart (Gast)


Lesenswert?

Also wenn du das Aufzeichnen und das Abliefern der Daten sauber trennen 
willst, dann würde ich das so machen:

Das Gerät braucht doch bestimmt einen Ein-Schalter. Nimm dafür einen 
Wipp- oder Schiebeschalter mit zwei Stellungen. Die Versorgung zum einen 
das Gerät und zum Anderen entsprechen die zwei Stellungen den zwei Modi.

Das Auslesen und Löschen der Daten würde ich dann vom Rechner über den 
UART steuern. So wie nicht"Gast" geschrieben hat reichen dann dafür 
einfache Kommandos die über den UART zum Controller geschickt werden. 
Nach dem korrekten Empfangen der Daten sendet der Rechner dann das 
Kommando zum Löschen der Daten. Fertig.

von nicht "Gast" (Gast)


Lesenswert?

Hello again,

eine Steuerung per uart ist doch eine schöne Möglichkeit der Trennung.

Irgend wie versteh ich dich nicht. Du scheinst dir etwas absichtlich 
Schwerer zu machen, als es ist.


Grüße,

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

nicht "Gast" schrieb:
> Hello again,
>
> eine Steuerung per uart ist doch eine schöne Möglichkeit der Trennung.
>
> Irgend wie versteh ich dich nicht. Du scheinst dir etwas absichtlich
> Schwerer zu machen, als es ist.

Kann schon sein dass ich ein Brett vor dem Kopf habe. Vielleicht hab ich 
auch nicht verstanden wie die Steuerung per UART funktionieren soll...

Im Datenerfassungs-Modus hab ich keinen UART bzw. niemanden an der 
anderen Seite. Heisst: Einschalten und sofort beginnen zu messen und 
aufzuzeichnen.

Im Daten-Ablieferungsmodus hätte ich zwar den UART, aber der kriegt ja 
u.U. das Kommando erst etwas später nach dem Einschalten. Also würde das 
Ding schon mal in den Erfassungsmodus gehen, müsste aber regelmäßig den 
UART auf "Kommandos" prüfen, dann u.U. mit der Datenübertragung 
beginnen, und die aktuellen Meßdaten verwerfen?

Außerdem möchte ich die Oberfläche am PC "as simple as possible" halten. 
Da ich Linux benutze, könnte sich das auch ein "cat /dev/ttyUSB0 > 
data.csv" beschränken.

von Horst (Gast)


Lesenswert?

Wieso nimmst Du nicht einfach den einen Taster den Du hast zum starten 
und stoppen der Messungen?
Wenn Du die Daten auslesen willst, drückst Du einfach NICHT auf den 
Taster, sondern steckst Dein UART zu USB Wandler an (oder eben RS232) 
und sendest ein Command an den uC. Der empfängt das Command und 
überträgt die Daten in den gewünschten Paketen (z.B. zusätzlich mit 
CRC).
Dann kannst Du Dir sicher sein, dass die Daten valide sind.

Zusätzlich könntest Du Dir auf ein anderes Command ein 
"Inhaltsverzeichnis" plotten lassen. Da werden Dir dann die 
verschiedenen Messungen angezeigt. Dann kannst Du selektiv auswählen was 
übertragen werden soll bzw. was gelöscht werden soll.

Ist doch ganz einfach.
Grüße
Horst

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Michael Reinelt schrieb:
> Idee: wenn bei gedrücktem Taster eingeschaltet wird, geht das Teil in
> den "Daten senden" Modus, und schickt die gespeicherten Daten per UART.

Eigentlich klingt das doch schon ganz gut. Wenn der Taster sonst nicht 
benötigt wird im Erfassungsmodus, spricht nichts dagegen, den Taster 
versenkt anzubringen, damit eine versehentliche Betätigung 
ausgeschlossen ist.

> Meine Idee: ich speichere eine "Paketnummer" im EEPROM, bei jedem
> Einschalten wird diese erhöht.

Das hat nur den Nachteil, das eine bestimmte Zelle im EEPROM immer und 
immer wieder beschrieben wird. Bei den meisten EEPROMs ist die Grenze 
bei ca. 1 Mio. Schreibzyklen, wenn das akzeptabel ist, nimm diese 
Lösung. Eine weitere Möglichkeit wäre, beim Schreiben eines Paketes das 
darauffolgende Paket mit einem Marker zu beschreiben, das dieses das 
nächste Paket zum Schreiben ist. Das hat den Vorteil, das keine 
dedizierte Zelle immer wieder beschrieben wird, sondern der gesamte 
Ringpuffer gleichmässig benutzt wird. Beim Einschalten sucht der Logger 
nach diesem Marker und schreibt ab da weiter.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Matthias Sch. schrieb:
> Michael Reinelt schrieb:
>> Idee: wenn bei gedrücktem Taster eingeschaltet wird, geht das Teil in
>> den "Daten senden" Modus, und schickt die gespeicherten Daten per UART.
>
> Eigentlich klingt das doch schon ganz gut. Wenn der Taster sonst nicht
> benötigt wird im Erfassungsmodus, spricht nichts dagegen, den Taster
> versenkt anzubringen, damit eine versehentliche Betätigung
> ausgeschlossen ist.

Der Taster wird schon verwendet, um Darstellungen am LCD umzuschalten. 
Ich würd das aber erkennen, wenn er während des Einschaltens gedrückt 
ist.


>> Meine Idee: ich speichere eine "Paketnummer" im EEPROM, bei jedem
>> Einschalten wird diese erhöht.
>
> Das hat nur den Nachteil, das eine bestimmte Zelle im EEPROM immer und
> immer wieder beschrieben wird. Bei den meisten EEPROMs ist die Grenze
> bei ca. 1 Mio. Schreibzyklen, wenn das akzeptabel ist, nimm diese
> Lösung. Eine weitere Möglichkeit wäre, beim Schreiben eines Paketes das
> darauffolgende Paket mit einem Marker zu beschreiben, das dieses das
> nächste Paket zum Schreiben ist. Das hat den Vorteil, das keine
> dedizierte Zelle immer wieder beschrieben wird, sondern der gesamte
> Ringpuffer gleichmässig benutzt wird. Beim Einschalten sucht der Logger
> nach diesem Marker und schreibt ab da weiter.

1 million ist mehr als genug. Die "Paketnummer" wird ja nur beim 
Einschalten ermittelt, erhöht und zurückgeschrieben, und ich glaube 
nicht dass ich das teil 1 Million mal einschalte (dann sind mir 
wahrscheinlich die Finger abgefallen :-)

Abgesehen davon bietet das EEPROM einen "high endurance block", da muss 
ich mich aber erst einlesen...

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Michael Reinelt schrieb:
> Der Taster wird schon verwendet, um Darstellungen am LCD umzuschalten.
> Ich würd das aber erkennen, wenn er während des Einschaltens gedrückt
> ist.

Dann verwende das doch.
Wenn der Taster beim Einschalten nicht gedrückt ist, dann startest du 
deine Messung.
Wenn der Taster beim Einschalten aber gedrückt ist, dann startest du 
deinen UART und wartest auf Kommandos. Kann ja ein ganz einfaches 
Protokoll sein, wie R1 -> Lese Datensatz 1; E3 -> Lösche Datensatz 3. 
Nur so als Beispiel.

lg
Christopher

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.