Array

Hallo,
ich messe mit folgendem Programmcode Beschleunigungswerte und lass diese auf einem seriellen Monitor anzeigen.

int Z= A2;
float sensorwert;
float beschleunigung;
int t= 2;

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

void loop() 
{
sensorwert=analogRead(Z); //Auslesen des Sensorwertes. 
  
beschleunigung=((sensorwert / 1024) * 5 - 1.582) / 0.0065;

delay(t); // Nach jeder Messung ist je eine kleine Pause mit der Dauer „t“ in Millisekunden.
Serial.print(beschleunigung); //Nun wird der Wert „beschleunigung“ über die serielle Kommunikation an den PC gesendet. 
Serial.println(" G"); // Im seriellen Monitor wird hinter der Beschleunigung die Einheit G eingeblendet.
}

Zu meinem Problem:
Ich messe die Werte mit einem delay von 2 Millisekunden. Ich erhalt jedoch nicht alle 2ms einen neuen Wert, sondern oftmals 6mal den gleichen Wert mit gleichem Zeitstempel. Kann es sein, dass die Übertragung auf den seriellen Monitor zu lange dauert?
Wenn ja, wie kann ich die Werte beispielsweise in ein array zwischenspeichern und später wieder auslesen?

Werte auf dem seriellen Monitor

12:13:56.985 -> 0.76 G
12:13:56.985 -> 6.77 G
12:13:56.985 -> 0.76 G
12:13:56.985 -> 1.51 G
12:13:56.985 -> 1.51 G
12:13:56.985 -> 1.51 G
12:13:57.032 -> 5.26 G
12:13:57.032 -> 1.51 G
12:13:57.032 -> 1.51 G
12:13:57.032 -> 1.51 G
12:13:57.032 -> 1.51 G
12:13:57.032 -> 1.51 G
12:13:57.086 -> 1.51 G
12:13:57.086 -> 1.51 G
12:13:57.086 -> 1.51 G
12:13:57.086 -> 1.51 G
12:13:57.086 -> 1.51 G
12:13:57.086 -> 0.76 G
12:13:57.133 -> 0.00 G
12:13:57.133 -> 0.76 G
12:13:57.133 -> 0.76 G
12:13:57.133 -> 0.76 G
12:13:57.133 -> 9.77 G
12:13:57.133 -> 0.76 G
12:13:57.186 -> 1.51 G
12:13:57.186 -> 1.51 G
12:13:57.186 -> 1.51 G
12:13:57.186 -> 3.76 G
12:13:57.186 -> 2.26 G
12:13:57.186 -> 1.51 G
12:13:57.233 -> 1.51 G
12:13:57.233 -> 2.26 G
12:13:57.233 -> 1.51 G
12:13:57.233 -> 1.51 G
12:13:57.233 -> 1.51 G
12:13:57.233 -> 1.51 G
12:13:57.286 -> 0.76 G
12:13:57.286 -> 0.76 G
12:13:57.286 -> 0.00 G
12:13:57.286 -> 0.00 G
12:13:57.286 -> 0.00 G
12:13:57.286 -> 0.00 G
12:13:57.333 -> 1.51 G
12:13:57.333 -> 1.51 G
12:13:57.333 -> -0.75 G
12:13:57.333 -> 1.51 G
12:13:57.333 -> 1.51 G
12:13:57.333 -> 2.26 G
12:13:57.386 -> 5.26 G
12:13:57.386 -> 1.51 G
12:13:57.386 -> 2.26 G
12:13:57.386 -> 1.51 G
12:13:57.386 -> 1.51 G
12:13:57.386 -> 1.51 G
12:13:57.433 -> 1.51 G
12:13:57.433 -> 0.76 G
12:13:57.433 -> 0.76 G
12:13:57.433 -> 0.76 G
12:13:57.433 -> 0.00 G

Ein Zeichen braucht 1 / Baudrate * 10 Sekunden. Bei nur 9600 Baud ist das etwas 1ms

Stelle die Übertragung mal schneller ein (vom Maximum beginnen, bei schlechter Übertragung abwärts).

Gruß Tommy

Arduin_uno:
Wenn ja, wie kann ich die Werte beispielsweise in ein array zwischenspeichern und später wieder auslesen?

Ja, dazu eine ungetestete Anregung:

const byte Z= A2;
const uint16_t ANZAHLWERTE = 100;
uint16_t sensorwerte[ANZAHLWERTE];
uint16_t element;
float beschleunigung;
const byte t= 2;

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

void loop()
{
	if(element < ANZAHLWERTE) {
		sensorwerte[element] = analogRead(Z); //Auslesen des Sensorwertes.
		element++;
		delay(t); // Nach jeder Messung ist je eine kleine Pause mit der Dauer „t" in Millisekunden.
	} else {
		for(element = 0; element < ANZAHLWERTE; element++) {
			beschleunigung=((sensorwerte[element] / 204.8) - 1.582) / 0.0065;
			Serial.print(beschleunigung); //Nun wird der Wert „beschleunigung" über die serielle Kommunikation an den PC gesendet.
			Serial.println(" G"); // Im seriellen Monitor wird hinter der Beschleunigung die Einheit G eingeblendet.
		}
		element = 0;
	}
}

Hallo,

ich sehe das eigendlich anders herum. Wenn Du mehrfach die gleichen Werte sendest dann geht das senden schneller als das messen. Du gibt den selben Messwert mehrfach auf die Schnittstelle.

Was hat denn der Sensor für eine Messrate angegeben. sicher nicht 500 Messungen je sekunde

Mach das delay doch mal grösser. fang mal mit 10ms an

Heinz

Tipp:
USB sendet die Daten nicht einzeln Byteweise zum PC, sondern in Paketen.
So wie hier, durchaus mehrere Sensorwerte in einem Block.

Es ist also der falsche Weg, den Zeitstempel vom PC generieren zu lassen.

beschleunigung=((sensorwert / 1024) * 5 - 1.582) / 0.0065;

Warum nicht
beschleunigung=((sensorwert * 5) / 1024 - 1.582) / 0.0065;Evtl. genauer

ElEspanol:
Evtl. genauer

Wegen

float sensorwert;

möglicherweise auch nicht. Aber die Idee ist natürlich gut, weshalb ich in #3 auch uint16_t verwendet habe.

Man sollte halt seine Wertebereiche kennen. Aber wenn das max. zu erwartende Ergebnis aller Multiplikationen in ein uint32 passt, ist es immer ratsam zuerst diese Zu machen und danach Divisionen.