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"?
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?
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?
-µ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?
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]);
}
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.
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
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);
}
}