Analogmesswerte speichern und gesammelt an PC

Hallo zusammen,

Ich möchte mit meinem UNO bzw. MEGA über Analog Werte messen. Es sollen drei Messungen pro Sekunde gemacht werden und das über 60 Sekunden lang. Gesamt also 180 Messwerte.
Nach Ablauf der Zeit sollen diese gesammelt an mein PC-Programm übergeben werden.

Ich habe bereits ein wenig nach einem Lösungsansatz gesucht und bin daher auf folgende Möglichkeiten gekommen:
-Speichern auf SD-Karte
-Speichern im EEPROM
-Speichern in Array

Die Methode mit der SD-Karte möchte ich eigentlich umgehen - zusätzlicher Hardware Aufwand etc...
Der EEPROM hat eine begrenzte Anzahl an Lese-Schreibzyklen? Stimmt das?
Mit Arrays hatte ich bisher nichts am Hut.

Welche Möglichkeit würdet ihr mir denn empfehlen?

Edit:

Oder besteht die Möglichkeit die Daten direkt an den SerialPort(USB) Buffer zu senden?
Kann man diesen vorher "leeren"?

Hallo Bobbyno

Ja, diese Möglichkeit besteht.

Du kannst die Messwerte über die serielle Schnittstelle ausgeben und diese mit Hilfe eine Terminalprgrammes aufzeichen.

1 Like

Wenn ich das richtig interpretiere:
Die Daten werden im USB-Buffer "gespeichert" - zumindest temporär.
Wann verfallen die denn bzw. muss ich den Buffer resetten damit ich bei der nächsten Messung (20Min später) nicht die gleichen Werte auslese?

Du läßt die Messung laufen und die Aufzeichung wird über das Terminalprogramm, das die Daten aufzeichnet, gestartet und gestopped.

1 Like

ein UNO hätte genug Speicher für 180 int

1 Like

Das würde sich dann aber bestimmt mit meiner "Echtzeitanzeige" überschneiden.?
Ich habe für die Dauer des Messvorgangs in meinem Programm eine digitale Waage die ich mit den IST-Messwerten des µC füttere.
Dann muss ich wohl doch zuerst auf dem µC "zwischenspeichern" und nach Ablauf der Prüfzeit das Array leeren und den Buffer zu dem Zeitpunkt auslesen?

Dann sollte das eigentlich kein Problem sein:

-µC wartet auf "Startbefehl" | Gleichzeitig wird der IST-Messwert übermittelt.
-Nach Startbefehl werden die Messdaten in ein Array geschrieben | Messwert Übermittlung aktiv
-Nach Stoppbefehl wird die IST-Messwert Übermittlung pausiert und die Daten vom Array werden übergeben an die Schnittstelle.
-Nach Übergabe geht die Messwertübermittlung weiter.

Das Array bzw. die geschriebenen Daten dafür sind nur während der Laufzeit vorhanden?

Da der Speicher wohl ausreicht werde ich hierfür integer verwenden.
Die Werte werden via analogRead ausgelesen und vorher noch mit map() verarbeitet.

Haben Sie im Wokwi nachgeschaut?

1 Like

wie ist denn die weiterverarbeitung in deinem pc programm geplant? besteht die verbindung zu dem pc programm permanent bzw. soll nur gemessen und übertragen werden wenn die verbindung besteht? oder müssen die werte auch "ausfallsicher" gespeichert werden wenn die verbindung mal unterbrochen ist. Dann würde es natürlich aufwändiger/komplizierter werden.
EEPROM bietet sich aus den von dir genannten gründen tatsächlich nicht unbedingt an.

Ein Array ist ja im Prinzip "nur" eine Art Sammlung von Variablen gleichen Typs z.b. int, welches über den Index in [] angesprochen wird.

Du könntest also ein Array mit der Größe 180 anlegen, alle 333ms einen Messwert dort "reinlegen" und dann den Index jeweils erhöhen. Wenn das Array voll ist (der Index also 180 erreicht hat) könntest du es über den Serial-Port an den PC senden.

Beispiel Array anlegen:

const uint8_t ANZ_MESSWERTE = 180;
int messwerte[ANZ_MESSWERTE]; // 180 Messwerte als Array 

Beispiel um auf Array zuzugreifen:

for (uint8_t i = 0; i < ANZ_MESSWERTE; i++) { // i laeuft von 0 bis 180
  Serial.println(messwerte[i]);
}
1 Like

genau. Strom weg => Messwerte weg

1 Like

Vielleicht können Sie dies dem PC überlassen und den ursprünglichen Beispielwert senden

1 Like

Ja habe ich :slight_smile:
Danke.
Vom Prinzip her ist das schon ziemlich das, was ich vorhabe. :ok_hand:

das macht aber das Gerät selbstständig und mobil.

natürlich, das erlaubt Visualisierung am PC in Echtzeit. nach dem Befehl werden Daten in Puffer zwieschen geschpeichert und byte für byte in die Leitung gesendet und der Ende in Eingangspuffer zusammen gestellt, bereit zum auslesen.

1 Like

:wink: .

1 Like

Bei meiner Anwendung wird zu Beginn die Verbindung zum µC hergestellt und kann dann für die gesamte Laufzeit bestehen bleiben. Sobald die Verbindung steht, soll der µC den aktuellen Messwert an die Anwendung übergeben als Klartextanzeige.

Die Daten reichen mir gesichert für die Laufzeit des µC - Also sollte das mit der Array Variante funktionieren. @J-M-L hat das bei seinem Code sehr schön gemacht.

Ich hab das ganze mal kurz versucht mit meinem Programm. Allerdings mag meine PC-Anwendung momentan die Schnittstelle nicht öffnen - deshalb muss ich mich erst darum wieder kümmern :smiley:

const int messPin = A0;
int messung;
int messwerte[180];

void setup() {
  Serial.begin(115200);
}

void loop() {
  //Serial.Read Abfrage mit anschließendem Switch/Case für Verarbeitung von eingehenden Befehlen
  Messung();
  for (int i=0; i<180; i++){
    Serial.println(messwerte[i]);
  }
  //Serial.println("Messung Beendet");
  delay(10000);
}

void Messung(){
  Serial.println("Messung beginnt");
  for(int i=0; i<180; i++){
    messung = analogRead(messPin);
    messwerte[i] = messung;
    delay(333);
  }
}

du versuchst aber nicht mit der arduino IDE den seriellen Monitor zu beobachten und den Port gleichzeitig mit deinem PC Programm zu öffnen oder? :slight_smile:

1 Like

Wenn ich die SD-Variante nehme, muss ich noch mehrere Sachen einbinden :smiley:
Eventuelles Update für spätere Versionen dafür :slight_smile:

Beende der/die/das IDE und starte dann das Terminalprogramm.

1 Like

du versuchst aber nicht mit der arduino IDE den seriellen Monitor zu beobachten und den Port gleichzeitig mit deinem PC Programm zu öffnen oder?

Nein, aber Danke für den Hinweis :smiley:
Den Fehler hatte ich anfangs zu genüge gemacht :wink: