BMP280 Fehlerwerte

Hallo Leute :slight_smile:

ich bin gerade dabei mit einem Freund einen Arduino zu programmieren, welcher an einer Wasserrakete befestigt sein soll um die Höhe zu berechnen. Dafür habe ich einen Arduino Nano mit eingebautem ESP8266, ein einfache 4x7seg Display sowie den erwähnten BMP280 Sensor.

Nun zu meinem Problem:
Wenn ich den BMP280 Sensor (~100Hz) nach seinem Wert frage und diesen mit der .readAltitude() mit dem Wert vom Anschalten des Arduinos vergleiche kommen immer wieder Werte raus welche einfach nicht in die anderen Werte passen und sogar um ein paar hundet Meter verschoben sein können ... hier ein Beispiel:

 (einige Nullen)
0
0
0
0
341
341
341
188
188
188
0
0
325
325
325
0
0
0
0
(weitere Nullen)

Jetzt fragen wir uns natürlich wie es zu diesen Fehlerwerten kommen kann, da diese unsere Messungen natürlich erheblich stören. Wir haben auch schon probiert eine Fehlerkorrektur ein zu bauen aber dann gehen uns halt etliche Messergebnisse verloren.

Sonst möchte ich noch hinzufügen dass der ESP8266 einfach ein 'leeres' WLAN aufmacht damit wir mit Hilfe eines Handys die Rakete lokalisieren können. Ich kann euch den Code gerne zu schicken, ich denke jedoch nicht das ihr den sonderlich leicht versteht und dieser auch (denke ich) nichts zur Lösung beiträgt...

Ich hoffe ihr könnt uns weiterhelfen!

MfG Eric :slight_smile:

EricHier:
Ich hoffe ihr könnt uns weiterhelfen!

Gerne, aber da ich nicht weiß, was für ein Sensor das genannte Ding ist, könnte ich nur im Nebel stochern. Ein Link zu einem Datenblatt o.ä. wäre gut.

Gruß

Gregor

Aber natürlich:
Modul von Banggood.com
BMP280

Na dann hoffe ich mal, dass ihr den Code versteht.
Hier zu fragen und anzunehmen, wir verstehen den Code nicht, finde ich einen Witz.

Aber egal....was bedeuten die (~100Hz) hinter der Sensorbezeichnung ?

Wie habt ihr den Sensor angeschlossen ?

Das mit dem Code habe ich geschrieben da er zu dem Zeitpunkt noch nicht ordentlich formatiert war...
Jetzt ist er (denke ich) soweit ordentlich Formatiert und auch Beschrieben, deswegen jetzt der Code: (habe schon gedacht das ihr den haben wollt ^^)

#include <Wire.h> 
#include <SPI.h>
#include <EEPROM.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <ASCIIDic.h>
#include <NX7Seg.h>
#include <SoftwareSerial.h>

#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11 
#define BMP_CS 10

Adafruit_BMP280 bmp; 
nx7seg my4x7seg = nx7seg(LATCH_DIO,CLK_DIO,DATA_DIO, true);
// Verbindung zum ESP8266 via diesen PINS
SoftwareSerial SerialESP(11, 12);

// Druck beim einschalten des Arduinos aka Startstation
long startvalue;
// Maximal zurück gelegte Höhe
int maxheight = 0;  
// die letzten 5 Werte zum Vergleichen/Fehler finden
int wert[] = {0,0,0,0,0};
  
void setup() {

  Serial.begin(9600);

  // Pins des 7seg Bildschirm als Ausgang festlegen
  pinMode(LATCH_DIO,OUTPUT);
  pinMode(CLK_DIO,OUTPUT);
  pinMode(DATA_DIO,OUTPUT);

  // Verbindung mit ESP Aufbauen und auf AP setzen
  SerialESP.begin(9600); 
  SerialESP.println("AT+CWMODE=2");

  // Warten bis Antwort sicher angekommen ist
  delay(100); 

  // Antwort ausgeben
  while (SerialESP.available()) {
      Serial.write(SerialESP.read());
  }

  // Hotspot Infos angeben
  SerialESP.println("AT+CWSAP=\"Rocket\", \"\",5,0");

  // wieder das selbe
  delay(500); 

  // wieder das selbe
  while (SerialESP.available()) {
      Serial.write(SerialESP.read());
  }

  // BMP starten
  if (!bmp.begin()) {  
    Serial.println("BMP Err");
    while (1);
  }

  delay(500);

  // Anfangswert auslesen
  startvalue = bmp.readPressure() * 100; 
 
}
  
void loop() {

  // Aktuelle Höhe berechnen  
  int height = (int)bmp.readAltitude(startvalue / 10000.0);  

  // Werte eins weiter schieben ...
  for (int w = 3; w >= 0; w--) {
    wert[w + 1] = wert[w];
  }
  // ... und den ersten mit dem aktuellen ersetzen
  wert[0] = height;

  // Es wird geguckt ob ALLE (die letzten 5 Werte) größer als unser aktuell größert Wert sind
  bool z = true; 
  for (int j = 0; j < 5; j++) {
    z = z && (wert[j] > maxheight); 
  }

  // Wenn ja, ersetzen wir den größten Wert durch den Durchschnitt der 5 Were
  if (z) {
    int g = 0; 
    for (int k = 0; k < 5; k++) {
      g += wert[k];
    }
    g /= 5; 
    maxheight = g;
  }

  // Höhe ausgeben (daher sehe ich die Fehler-Werte)
  Serial.println(height);

  // Ausgabe auf 7seg Bildschirm
  my4x7seg.clear(); 
  my4x7seg.writeInt(maxheight); 
  my4x7seg.refresh(10);
  
}

Zu den ~100Hz: Wir fragen den Sensor ungefähr 100 mal in der Sekunde an, was laut dem Datenblatt auch locker möglich sein sollte. Die 10ms delay entstehen durch die 7segDisplay welches den Text in den 10ms anzeigt... (wird durch die refresh Funktion gemacht).

Anschlussdiagramm:
VCC → 3.3V
GND → GND
SCL → A5
SDA → A4

Das verstehe ich nicht.
Lt. deiner Beschreibung betreibst du den Sensor mit I2C, im Sketch aber mit SPI.

Sorry, das SPI war noch von einem Projekt vorher, ich habe Die definitions einfach gelöscht, da diese nicht von nutzen waren... (ja, das hört sich dumm an, das brauchte ich aber weil ich zuerst aus versehen die BME lib heruntergeladen habe)

Neuer Code:

#include <Wire.h> 
#include <SPI.h>
#include <EEPROM.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <ASCIIDic.h>
#include <NX7Seg.h>
#include <SoftwareSerial.h>

#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8

Adafruit_BMP280 bmp; 
nx7seg my4x7seg = nx7seg(LATCH_DIO,CLK_DIO,DATA_DIO, true);
// Verbindung zum ESP8266 via diesen PINS
SoftwareSerial SerialESP(11, 12);

// Druck beim einschalten des Arduinos aka Startstation
long startvalue;
// Maximal zurück gelegte Höhe
int maxheight = 0;  
// die letzten 5 Werte zum Vergleichen/Fehler finden
int wert[5];
  
void setup() {

  for(int i = 0; i < sizeof(wert); i++)
    wert[i] = 0;

  Serial.begin(9600);

  // Pins des 7seg Bildschirm als Ausgang festlegen
  pinMode(LATCH_DIO,OUTPUT);
  pinMode(CLK_DIO,OUTPUT);
  pinMode(DATA_DIO,OUTPUT);

  // Verbindung mit ESP Aufbauen und auf AP setzen
  SerialESP.begin(9600); 
  SerialESP.println("AT+CWMODE=2");

  // Warten bis Antwort sicher angekommen ist
  delay(100); 

  // Antwort ausgeben
  while (SerialESP.available()) {
      Serial.write(SerialESP.read());
  }

  // Hotspot Infos angeben
  SerialESP.println("AT+CWSAP=\"Rocket\", \"\",5,0");

  // wieder das selbe
  delay(500); 

  // wieder das selbe
  while (SerialESP.available()) {
      Serial.write(SerialESP.read());
  }

  // BMP starten
  if (!bmp.begin()) {  
    Serial.println("BMP Err");
    while (1);
  }

  delay(500);

  // Anfangswert auslesen
  startvalue = bmp.readPressure() * 100; 
 
}
  
void loop() {

  // Aktuelle Höhe berechnen  
  int height = (int)bmp.readAltitude(startvalue / 10000.0);  

  // Werte eins weiter schieben ...
  for (int w = 3; w >= 0; w--) {
    wert[w + 1] = wert[w];
  }
  // ... und den ersten mit dem aktuellen ersetzen
  wert[0] = height;

  // Es wird geguckt ob ALLE (die letzten 5 Werte) größer als unser aktuell größert Wert sind
  bool z = true; 
  for (int j = 0; j < 5; j++) {
    z = z && (wert[j] > maxheight); 
  }

  // Wenn ja, ersetzen wir den größten Wert durch den Durchschnitt der 5 Were
  if (z) {
    int g = 0; 
    for (int k = 0; k < 5; k++) {
      g += wert[k];
    }
    g /= 5; 
    maxheight = g;
  }

  // Höhe ausgeben (daher sehe ich die Fehler-Werte)
  Serial.println(height);

  // Ausgabe auf 7seg Bildschirm
  my4x7seg.clear(); 
  my4x7seg.writeInt(maxheight); 
  my4x7seg.refresh(10);
  
}

Du betreibst den Sensor mit 3,3 Volt.
Mit welcher Spannung den Nano ?

Auch mit 3,3 Volt oder mit 5 Volt ?
Wenn 5 Volt hast du einen Levelshifter dazwischen ?

Ich versorge den Nano mit einer 9V Batterie.
Wenn ich den Uno am PC anschließe sind die Werte jedoch auch gleichermaßen vorhanden.

EricHier:
Ich versorge den Nano mit einer 9V Batterie.
Wenn ich den Uno am PC anschließe sind die Werte jedoch auch gleichermaßen vorhanden.

Also mit 5 Volt, das wird erst mal ein Problem sein.
Der Sensor hat am I2C 3,3 Volt der Nano liefert 5 Volt, das geht so nicht.
Du brauchst einen Levelshifter. So oder ähnlich.

Mein Nano hat aber für das eingebaute ESP Modul (denke ich) eine 3.3V Spannungsversorgung... (habe mal mit dem Multimeter nach gemessen: Sind 3.3V)

EricHier:
Mein Nano hat aber für das eingebaute ESP Modul (denke ich) eine 3.3V Spannungsversorgung...

Was...Wie...Wo ?

Wir reden doch vom Sensor, nicht vom ESP. Und für den ESP reicht der Strom da wirklich aus?
Und poste mal einen Link deines Nano !
Wieso eingebaut ?

Sorry grad gesehen.

Wenn die Spannung da ist, hat das nichts mit I2C zu tun. I2C arbeitet weiterhin mit 5 Volt.

Schau dir mal die Datenblätter an.

Das ist eine Grundlage die du einfach ignorierst.

Und wie sieht es mit den PullUp-Widerständen am I2C-Bus aus ?
Hast du da welche ?
Gehen die an 5 Volt oder an 3,3 Volt ?

Auf dem Sensor-Board sind definitv Wiedestände, ich weiß aber nicht ob die für den I2C Bus gehören...

EricHier:
Auf dem Sensor-Board sind definitv Wiedestände, ich weiß aber nicht ob die für den I2C Bus gehören...

Und da möchtest du, dass ich dir das Schaltbild vorlese ?
Warum siehst du nicht im Datenblatt/Schaltbild nach ?

Und ich wiederhole mich nochmal:
Wenn du den Sensor mit 3,3 Volt betreibst, und den Nano mit 5 Volt, dann gibt es im I2C-Bus Probleme, die den Bus nicht funktionieren lassen.

Ist das jetzt deutlich oder brauchst du noch mehr Infos ?

Du solltest einen Levelshifter einbauen, damit alles den richtigen Daten entspricht.