Hallo,
Ich habe an einem Multiplexer verschiedene Sensoren angeschlossen. Diese sollen ausgelesen werden und an einen CAN-Bus weitergeleitet werden. Nebenbei sollen die Werte am PC einsehbar sein (Monitor). Bei einem Beschleunigungssensor soll zudem ein Min und Max ausgegeben werden.
Das Auslesen klappt auch ganz gut. Binde ich nun eine Berechnungsfunktion für das Min und Max ein, so verändert sich die Ausgabe nach einer Zeit zu undefinierten Zeichen
Während am Anfang der Code noch korrekt ausgegeben wird
21:55:52.409 -> Temperature in Celsius: 30.69
21:55:52.409 -> Humidity in %: 33.56
21:55:52.409 -> Pressure in hPa: 996.54
21:55:52.409 -> Altitude in Meters: 137.98
21:55:52.409 ->
21:55:52.443 -> SHT35_Front
21:55:52.443 -> Temperature in Celsius: 25.49
21:55:52.443 -> Humidity in %: 45.90
21:55:52.443 ->
21:55:52.443 -> SHT35_Side
21:55:52.443 -> Temperature in Celsius: 24.90
21:55:52.476 -> Humidity in %: 44.61
21:55:52.476 ->
21:55:52.476 -> SHT35_Door
21:55:52.476 -> Temperature in Celsius: 26.44
21:55:52.476 -> Humidity in %: 38.89
21:55:52.476 ->
21:55:52.476 -> Acceleration X: 0.00, Y: 45.36, Z: -37.34 m/s^2
21:55:52.476 -> Rotation X: 0.03, Y: 8.99, Z: 23.43 rad/s
21:55:52.476 -> Temperature: 37.28 degC
21:55:52.476 ->
21:55:52.476 -> Max X:0.00 Min X:0.00 Max x:0.03 Min x:0.00
21:55:52.813 -> BME680
21:55:52.813 -> Temperature in Celsius: 30.43
21:55:52.813 -> Humidity in %: 39.09
21:55:52.813 -> Pressure in hPa: 996.53
21:55:52.813 -> Altitude in Meters: 138.06
treten nach ein paar Minuten Ausgaben wie folgt auf
21:56:41.117 -> ⸮=3q5B⸮⸮⸮>⸮⸮⸮>⸮⸮⸮>\⸮>
21:56:41.117 -> ⸮<⸮⸮⸮>I2?S0⸮⸮I2?S0⸮⸮l?⸮⸮⸮>⸮⸮⸮A⸮⸮⸮>⸮⸮⸮⸮⸮@⸮!B⸮~A⸮⸮⸮⸮3q5B⸮⸮⸮A2⸮!BLl5>2Ap⸮
21:56:41.117 -> ⸮⸮⸮3q5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<⸮⸮<⸮⸮<5<⸮<0.47⸮⸮>⸮⸮⸮>⸮⸮⸮>\⸮>
21:56:41.117 -> ⸮<⸮⸮⸮>I2?S0⸮⸮I2?S0⸮⸮l?⸮⸮⸮>⸮⸮⸮A⸮⸮⸮>⸮⸮⸮⸮⸮@⸮!B⸮~A⸮⸮⸮⸮3q5B⸮⸮⸮A2⸮!BLl5>2Sv⸮
21:56:41.174 -> ⸮Ɣ3q5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<⸮⸮<⸮⸮<5<⸮<-120.13⸮⸮>\⸮>
21:56:41.174 -> ⸮<⸮⸮⸮>I2?S0⸮⸮I2?S0⸮⸮l?⸮⸮⸮>⸮⸮⸮A⸮⸮⸮>⸮⸮⸮⸮⸮@⸮!B⸮~A⸮⸮⸮⸮3q5B⸮⸮⸮A2⸮!BLl5>2e|⸮
21:56:41.174 -> ⸮̔3q5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<⸮⸮<⸮⸮<5<⸮<45.36⸮<⸮⸮⸮>I2?S0⸮⸮I2?S0⸮⸮l?⸮⸮⸮>⸮⸮⸮A⸮⸮⸮>⸮⸮⸮⸮⸮@⸮!B⸮~A⸮⸮⸮⸮3q5B⸮⸮⸮A2⸮!BLl5>2t⸮⸮
21:56:41.174 -> ⸮є3q5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<5<⸮<⸮⸮<⸮⸮<5<⸮<0.03<⸮<5<⸮<⸮⸮<⸮⸮<
21:56:41.174 -> ⸮>⸮⸮⸮¯⸮⸮>I2?
Konkret ist die Funktion des Beschleunigungssensors MPU6050
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
Serial.print("Rotation X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC");
Serial.println("");
Und die Berechnungsfunktion, bei deren Einbinden das Problem auftritt
acc_x_counter++; if (acc_x_counter>10){acc_x_counter=0;} ACC_x[acc_x_counter]=a.acceleration.x;
acc_y_counter++; if (acc_y_counter>10){acc_y_counter=0;} ACC_y[acc_y_counter]=a.acceleration.y;
acc_z_counter++; if (acc_z_counter>10){acc_z_counter=0;} ACC_z[acc_z_counter]=a.acceleration.z;
g_gyro_x_counter++; if (g_gyro_x_counter>10){g_gyro_x_counter=0;} GYRO_x[g_gyro_x_counter]=g.gyro.x;
g_gyro_y_counter++; if (g_gyro_y_counter>10){g_gyro_y_counter=0;} GYRO_y[g_gyro_y_counter]=g.gyro.x;
g_gyro_z_counter++; if (g_gyro_z_counter>10){g_gyro_z_counter=0;} GYRO_z[g_gyro_z_counter]=g.gyro.x;
Serial.print("Max X:") ; Serial.print(Max(ACC_x));
Serial.print(" Min X:") ;Serial.print(Min(ACC_x));
Serial.print(" Max x:") ;Serial.print(Max(GYRO_x));
Serial.print(" Min x:") ;Serial.print(MinGYRO_x));
Serial.println(" ");
float Max(float array[10]){
float max=array[0];
for (int i=1; i<10; i++){
if(array[i]>max)
max=array[i];
}
return max;
}
float Min(float array[10]){
float min=array[0];
for (int i=1; i<10; i++){
if(array[i]<min)
min=array[i];
}
return min;
}
Hierbei wird konkret jeweils ein Array (ACC_x, ... GYRO_x,...) aus 10 Zellen beschrieben,die Arrayzellen werden sukzessiv geschrieben, ist der Zähler (counter) bei der letzten Zelle, fängt er an der ersten Position wieder an, so dass das ganze eine FIFO-Speicherung ergibt