High-lvl DAQ / Datenlogger

Liebe Arduino Community,

ich bräuchte euren Rat bei folgendem Projekt:

Die Idee:
Es sollen mehrere Abstandssensoren (z.B. 20 Stück des HRS04) sowie ein Temperatursensor an ein Arduino Mega angeschlossen werden und bei einer Messfrequenz von 500 Hz die Daten (über einen Zeitraum von 30min.) an meinen Computer übertragen. Neben der Temperatur und dem Abstand soll darüber hinaus jeder Datensatz mit einem Zeitstempel gekennzeichnet werden.

Die aktuelle Situation:
Momentan habe ich nur einen Abstandssensor angeschlossen. Als Schnittstelle benutze ich den USB Anschluss. Trotz einer Baudrate von 250.000 reicht diese nicht zum übertragen der Datenmengen aus (und liefert zu große Fehler).
Momentan empfange ich maximal 288 Datensätze pro Sekunde.

Lösungsansätze:
Angesichts der großen Datenmengen und des relativ langen Zeitraums dürfte eine Speicherung im EEPROM nicht infrage kommen. Mit Datenloggern habe ich bislang keinerlei Erfahrungen gesammelt.

Habt Ihr irgendwelche Vorschläge oder seht ihr Verbesserungspotentiale?

Vielen Dank

Julio

PS: Ich habe zwar schon einige kleinere Spielereien umgesetzt, würde mich aber dennoch als Anfänger bezeichnen…

TestHRS04_03___Temperatursensor.ino (988 Bytes)

Ein schnelleres Übertragungsmedium benutzen, z.B. Ethernet wäre ein Lösungsansatz.
Od der Arduino aber die 20 Sensoren 500 Mal in der Sekunde abfragen kann, würde ich bezweifeln. Da scheinen schon die Sensoren das limitierende Teil zu zein.
Das scheint Deine eigentliche Problemstelle zu sein.

Gruß Tommy

Was ist ein HRS04 ? Meinst du HC-SR04 ?

bei einer Messfrequenz von 500 Hz

Wie willst du 20 davon in der Zeit erfassen, und welche Temperatur misst du so schnell?

Was willst du mit dem Datenmüll?

@michael_x: Ich meinte natürlich auch den HC-SR04. Der vermeintliche Datenmüll ist für mich recht wichtig. Eine durch Schall in Schwingung versetzte Platte verändert seinen Abstand zum Sensor. Diese Abstandsänderungen möchte ich gerne herausfinden. Da die Schallgeschwindigkeit des Ultraschallsensors abhängig von der Dichte der ihn umgebenen Luft ist, möchte ich in regelmäßigen Abständen die Temperatur messen. Bei der Temperatur dürfte natürlich eine Messung pro Minute ausreichen.

@Tommy56: Ich glaube ehrlich gesagt nicht, dass die Grenze des Ultraschallsensors schon erreicht ist. Ich werde es aber demnächst durch den Anschluss eines zweiten Sensors kontrollieren.

Da die Schallgeschwindigkeit des Ultraschallsensors abhängig von der Dichte der ihn umgebenen Luft ist

Ziemlich genau soll es also auch noch sein ;)

Tommy56: Da scheinen schon die Sensoren das limitierende Teil zu sein. Das scheint Deine eigentliche Problemstelle zu sein.

Das fürchte ich auch.

Um Schwingungsdaten zu bearbeiten, wurden Fourier-Analysen erfunden.

michael_x: Ziemlich genau soll es also auch noch sein ;)

Ohne Herausforderungen wäre es ja auch langweilig =)

Kurzer Zwischenstand: Ich habe einen weiteren Sensor angeschlossen. Bei gleicher Baudrate werden nur halb so viele Datensätze übertragen (ca. 130/Sekunde). Von daher scheint es momentan wirklich noch an der Signalübertragung zu liegen.

Oder 2 Sensoren brauchen schon zu lange.

Übertrage doch mal in beiden Fällen Sätze gleicher Länge (den 2. Wert mit einem Dummy belegen) und das mit 1 und mit 2 Sensoren. Wenn es dann auch langsamer wird, sind es die Sensoren.

Gruß Tommy

Wenn man möglichst schnell Daten über USB zum Computer bringen will, sind die Arduinos mit separaten USB-Seriell Chip nicht wirklich gut geeignet.

Da werden die Daten erst mal in den Ausgangsbuffer des Serial-Objekts abgelegt, dann über UART zum USB-Chip gesendet, der muss sie empfangen und sammelt sie in einem Buffer. Erst wenn der Buffer voll ist oder eine Weile nichts mehr von Controller kommt, gehen sie über USB weiter.

Wenn das nicht ausreicht, wäre sowas z.B. eine Alternative https://www.pjrc.com/teensy/td_serial.html

Bei Serial.begin(250000) kann man max. ca. 25 Zeichen je Millisekunde übertragen, also eine Zeile mit ca. 50 Zeichen bei 500 Hz. Das kannst du ja mal testen. random() und print() mit einer 5stelligen long Zahl sollten da wohl auch noch mithalten können :wink:

const byte ROWSIZE= 5; // TEST: sollte bis max. 9 .. 10 gerade noch gehen
void setup() { Serial.begin(250000); }
void loop()  {
 static unsigned long lastmillis;
 if (millis() - lastmillis > 1) {
  lastmillis +=2; // 500 Hz = alle zwei Millisekunden  
  for (byte i = 0; i < ROWSIZE; i++)
    Serial.print(random(10000,20000)); // erzeugt eine Zahl mit 5 Ziffern, jede fünfte ist eine 1
  Serial.println();
 }
 if(millis() - lastmillis > 2) {
   Serial.println("overflow");
   lastmillis = millis();
 }
}

Sicher gibt es eine Grenze bei der Übertragungsgeschwindigket, und binär könntest du sie noch verdoppeln.
Ich wette aber, mit deiner Anzahl und Art von Sensoren liegst du in deutlich langsameren Größenordnungen. Mal abgesehen davon, dass sich US Sensoren gegenseitig stören (Echo)

Moin Arduino Community,

vielen Dank für Eure Hinweise und Tipps. Das Projekt ist vorübergehend auf Eis gelegt. Das gewünschte Ergebnis ließ sich mit dem HCS04-Sensor leider nicht erzielen. Dabei war nicht der Arduino UNO, sondern der Sensor das begrenzende Bauteil. Ihr hattet also recht mit Eurer Vermutung. Der Sensor hat mich aber doch recht positiv überrascht. Ich konnte die Messfrequenz auf 500 Hz erhöhen, bei einer Baudrate von 250.000. Mit meinem Versuchsaufbau konnte ich Schwingungen und daraus folgende Abstandsänderungen zwischen 100 - 180 Hz wahrnehmen. Bei höheren Frequenzen waren die Auslenkungen meiner Schwingungsmembran nicht mehr ausreichend.

Viele Grüße

Julio