Gelöst: Unsinnige Werte beim Abfragen des BMP280-Sensors


#1

Angeregt durch den Webserver Vorschlag im sensebox-Buch habe ich damit etwas experimentiert. Alle Werte von Temperatur, Feuchte und Helligkeit werden richtig ausgelesen, nur der Druck ist unsinnig (82147.43 ). Der Sensor ist in Ordnung, das habe ich mit dem “mitgelieferten” Programm für die openSenseMap getestet, nur wird er dort anders abgefragt.
Hier ein Ausschnitt aus meinem Programm:

int cyclecount;
bool debug;
float T;
float H;
long P;
float UV;
float Lux;
const long interval = 60000;
long time_start = 0;
long time_actual = 0;

WiFiServer server(80);

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

Bee b = new Bee();*

HDC1080 hdc;

BMP280 bmp_sensor;

TSL45315 tsl;

VEML6070 viml;

Die Abfrage sieht wie folgt aus:

T = hdc.getTemperature();
** H = hdc.getHumidity();**
** P = bmp_sensor.getPressure();**
** delay(200);**
** Lux = tsl.getIlluminance();**
** UV = veml.getUvIntensity();**

Wo liegt der Fehler?


#2

Da das aus deinem Codeabschnitt nicht ersichtlich ist, gibst du dem Sensor denn auch ein bmp_sensor.begin() ?


#3

@altprog kannst du deinen vollständigen Code oder die XML Datei der Blöcke einmal hochladen?


#4

Hallo zusammen,

ich versuche mal meinen Quelltest hochzuladen.
Hochladen klappt nicht also versuche ich es altmodisch mit copy und paste.
In der Originallösung des Webservers aus dem senseBox-Buch ist der Datentyp des Drucks long während in der Doku zu senseBoxMCU.h der Datentyp float steht.
Dank übrigens für die Bereitschaft den Quelltest einzusehen.:grinning:
Hier nun der ganze Quelltest:

/* IoT Wettersttion mit wechselnder Anzeige

  • Temperatur und Feuchte
  • Luftdruck und Helligkeit
  • V. 0.2 vom 27.9.2019

*/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include “SenseBoxMCU.h”

int cyclecount;
bool debug;
float T;
float H;
float P;
double UV;
long Lux;
const long interval = 60000;
long time_start = 0;
long time_actual = 0;

WiFiServer server(80);

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

Bee* b = new Bee();

HDC1080 hdc;

BMP280 bmp_sensor;

TSL45315 tsl;

VEML6070 veml;

void anzeige() {
++cyclecount;
switch (cyclecount) {
case 0:
//temperatur anzeigen und feuchte
display.setCursor(0,0);
display.setTextSize(2);
display.setTextColor(WHITE,BLACK);
display.println(((“Temp:”)+String(T))); //Ausgabe auf dem Display
display.println(((“Feuch:”)+String(H))); // "
display.display();
delay(4000);
display.clearDisplay();

break;

case 1:
//Helligkeit und Luftdruck anzeigen
display.setCursor(0,0);
display.setTextSize(2);
display.setTextColor(WHITE,BLACK);
display.println((("Lux:")+String(Lux,0))); //Ausgabe auf dem Display
display.println((("Druck:")+String(P,0)));    //  "
display.display();
delay(4000);
display.clearDisplay();
break;

}
if (cyclecount>=2) {
cyclecount=(0-1); //auf den nächstkleineren wie 0 setzen damit am der Wert wieder 0 ist
}
}

// OpenSenseMap osem(“5cc5a9a4facf70001a929e8f”,b);

void setup() {
Serial.begin(9600);
delay(1000);
hdc.begin();
bmp_sensor.begin();
tsl.begin();
veml.begin();
delay(500);
debug=true;

senseBoxIO.powerI2C(false);delay(1000);
senseBoxIO.powerI2C(true);delay(1000);
senseBoxIO.powerXB2(false);delay(1000);
senseBoxIO.powerUART(false);delay(1000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.display();
delay(100);
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(2);
display.setTextColor(WHITE,BLACK);
display.println(“IoT-Wetter”);
display.display();

b->connectToWifi(“xyz”,“geheim”);
delay(1000);
server.begin();
delay(500);

}

void loop() {
T = hdc.getTemperature();
H = hdc.getHumidity();
P = bmp_sensor.getPressure();
delay(200);
Lux = tsl.getIlluminance();
//Lux=Lux/100;
//Lux=int(Lux);
UV = veml.getUvIntensity();
if (debug) {
Serial.print(“Druck”);Serial.println(§,0);
Serial.print(“Helligkeit”);Serial.println(Lux,0);

}
time_start = millis();
/*if (time_start > time_actual + interval) {
time_actual = millis();
osem.uploadMeasurement(T,“5cc5a9a4facf70001a929e94”);
osem.uploadMeasurement(H,“5cc5a9a4facf70001a929e93”);
osem.uploadMeasurement(P,“5cc5a9a4facf70001a929e92”);
osem.uploadMeasurement(Lux,“5cc5a9a4facf70001a929e91”);
osem.uploadMeasurement(UV,“5cc5a9a4facf70001a929e90”);
}
*/

WiFiClient client = server.available();
anzeige();
if (client && client.available()) {
String request_string = listenClient(client);
Request request;
if (parseRequestSafe(request_string, request)) {
if (request.method == “GET” && request.uri == “/index.html”) {
client.println(buildSuccessfulResponse(request, buildHTML("", buildTag(“table”,
buildTag(“tr”,
buildTag(“tr”,
buildTag(“td”,
buildTag(“b”,
“Sensor”)) +buildTag(“td”,
buildTag(“b”,
“Messwert”)))) +buildTag(“tr”,
buildTag(“td”,
“Lichtsensor”) +buildTag(“td”,
String(tsl.getIlluminance()))) +buildTag(“tr”,
buildTag(“td”,
“Temperatursensor”) +buildTag(“td”,
String(hdc.getTemperature()))) +buildTag(“tr”,
buildTag(“td”,
“Feuchte”) +buildTag(“td”,
String(hdc.getHumidity()))) +buildTag(“tr”,
buildTag(“td”,
“Luftdruck”) +buildTag(“td”,
String(bmp_sensor.getPressure())))))));
} else {
client.println(buildNotFoundResponse(request));

}
}
delay(1);
client.stop();
delay(1);

}

}


#5

am besten wäre es, wenn du den Code über ``` am Anfang und Ende als Code deklarierst. So ist er nicht wirklich lesbar.

Und kannst du zusätzlich die XML Datei zur Verfügung stellen? Damit kann ich das gleiche Projekt dann in Blockly öffnen.


#6

Hallo,

die Urversion habe ich mit Blockly entwickelt, Nur dieses Forums-Software weigert sich den kopierten XML-Text hochzuladen. Die Erweiterungen habe ich dann mit der Arduino IDE hinzugefügt, also Druck.

 vorformatierten Text mit 4 Leerzeichen einrücken

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include “SenseBoxMCU.h”

WiFiServer server(80);

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

Bee* b = new Bee();

HDC1080 hdc;

TSL45315 tsl;

void setup() {
senseBoxIO.powerI2C(true);
delay(2000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.display();
delay(100);
display.clearDisplay();
b->connectToWifi(“xyz”,“geheim”);
delay(1000);
server.begin();
hdc.begin();
tsl.begin();
}

void loop() {
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.setTextColor(WHITE,BLACK);
display.println((String(“Temperatur”) + String(hdc.getTemperature()) + String(“Feuchte”) + String(hdc.getHumidity())));
display.display();
WiFiClient client = server.available();
if (client && client.available()) {
String request_string = listenClient(client);
Request request;
if (parseRequestSafe(request_string, request)) {
if (request.method == “GET” && request.uri == “/index.html”) {
client.println(buildSuccessfulResponse(request, buildHTML("", buildTag(“table”,
buildTag(“tr”,
buildTag(“td”,
buildTag(“b”,
“Sensoren”)) +buildTag(“td”,
buildTag(“b”,
“Messwert”))) +buildTag(“tr”,
buildTag(“tr”,
buildTag(“td”,
“Lichtsensor”) +buildTag(“td”,
String(tsl.getIlluminance())))) +buildTag(“tr”,
buildTag(“tr”,
buildTag(“td”,
“Temperatursensor”) +buildTag(“td”,
String(hdc.getTemperature()))))))));
} else {
client.println(buildNotFoundResponse(request));
}
}
delay(1);
client.stop();
delay(1);
}

}


#7

Ich glaube ich habe noch einen Weg gefunden, als PDF. geht aber auch nicht.
Versuch mit copy und paste.

Illuminance xyz geheim 80 WHITE,BLACK 1 0 0 Temperatur Temperature Feuchte Humidity AND EQ GET EQ /index.html table tr td b Sensoren td b Messwert tr tr td Lichtsensor td Illuminance tr tr td Temperatursensor td Temperature

#8

Noch ein Versuch:


#9

Hi @mario, Hi @PaulReichmuth

Ich probiere es mit den 3 Gravis dank einem Tipp aus dem Forum (Dank an Gerald).

/* IoT Wettersttion mit wechselnder Anzeige
 *  Temperatur und Feuchte
 *  Luftdruck und Helligkeit
 *  V. 0.2 vom 27.9.2019
 *  
 */

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "SenseBoxMCU.h"


int cyclecount;
bool debug;
float T;
float H;
float P;
double UV;
long Lux;
const long interval = 60000;
long time_start = 0;
long time_actual = 0;

WiFiServer server(80);

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

Bee* b = new Bee();

HDC1080 hdc;

BMP280 bmp_sensor;

TSL45315 tsl;

VEML6070 veml;

void anzeige() {
  ++cyclecount;
  switch (cyclecount) {
    case 0:
    //temperatur anzeigen und feuchte
    display.setCursor(0,0);
    display.setTextSize(2);
    display.setTextColor(WHITE,BLACK);
    display.println((("Temp:")+String(T))); //Ausgabe auf dem Display
    display.println((("Feuch:")+String(H)));    //  "
    display.display();
    delay(4000);
    display.clearDisplay();
   
    break;

    case 1:
    //Helligkeit und Luftdruck anzeigen
    display.setCursor(0,0);
    display.setTextSize(2);
    display.setTextColor(WHITE,BLACK);
    display.println((("Lux:")+String(Lux,0))); //Ausgabe auf dem Display
    display.println((("Druck:")+String(P,0)));    //  "
    display.display();
    delay(4000);
    display.clearDisplay();
    break;
  } 
  if (cyclecount>=2)  {
    cyclecount=(0-1); //auf den nächstkleineren wie 0 setzen damit am der Wert wieder 0 ist
  }
}


// OpenSenseMap osem("5cc5a9a4facf70001a929e8f",b);


void setup() {
  Serial.begin(9600);
  delay(1000);
  hdc.begin();
  bmp_sensor.begin();
  tsl.begin();
  veml.begin();
  delay(500);
  debug=true;
  
  senseBoxIO.powerI2C(false);delay(1000);
  senseBoxIO.powerI2C(true);delay(1000);
  senseBoxIO.powerXB2(false);delay(1000);
  senseBoxIO.powerUART(false);delay(1000);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
  display.display();
  delay(100);
  display.clearDisplay();
    display.setCursor(0,0);
    display.setTextSize(2);
    display.setTextColor(WHITE,BLACK);
    display.println("IoT-Wetter");
  display.display();
  
  b->connectToWifi("xyz","geheim");
  delay(1000);
  server.begin();
  delay(500);

  

}

void loop() {
  T = hdc.getTemperature();
  H = hdc.getHumidity();
  P = bmp_sensor.getPressure();
  delay(200);
  Lux = tsl.getIlluminance();
  //Lux=Lux/100;
  //Lux=int(Lux);
  UV = veml.getUvIntensity();
  if (debug) {
    Serial.print("Druck");Serial.println((P),0);
    Serial.print("Helligkeit");Serial.println(Lux,0);
    
  }
  time_start = millis();
  /*if (time_start > time_actual + interval) {
    time_actual = millis();
       osem.uploadMeasurement(T,"5cc5a9a4facf70001a929e94");
       osem.uploadMeasurement(H,"5cc5a9a4facf70001a929e93");
       osem.uploadMeasurement(P,"5cc5a9a4facf70001a929e92");
       osem.uploadMeasurement(Lux,"5cc5a9a4facf70001a929e91");
       osem.uploadMeasurement(UV,"5cc5a9a4facf70001a929e90");
  }
*/

WiFiClient client = server.available();
anzeige();
  if (client && client.available()) {
    String request_string = listenClient(client);
    Request request;
    if (parseRequestSafe(request_string, request)) {
    if (request.method == "GET" && request.uri == "/index.html") {
      client.println(buildSuccessfulResponse(request, buildHTML("", buildTag("table",
      buildTag("tr",
       buildTag("tr",
       buildTag("td",
       buildTag("b",
       "Sensor")) +buildTag("td",
       buildTag("b",
       "Messwert")))) +buildTag("tr",
       buildTag("td",
       "Lichtsensor") +buildTag("td",
       String(tsl.getIlluminance()))) +buildTag("tr",
       buildTag("td",
       "Temperatursensor") +buildTag("td",
       String(hdc.getTemperature()))) +buildTag("tr",
       buildTag("td",
       "Feuchte") +buildTag("td",
       String(hdc.getHumidity()))) +buildTag("tr",
       buildTag("td",
       "Luftdruck") +buildTag("td",
       String(bmp_sensor.getPressure())))))));
    } else {
      client.println(buildNotFoundResponse(request));
       
    }
    }
    delay(1);
    client.stop();
    delay(1);
  }

}

#10

Ich habe das Problem gefunden. Der BMP280 scheint es nicht zu vertragen, dass er zuerst initialisiert wird und anschließend die I2C Ports ausgeschaltet und wieder angeschaltet werden.

Wenn du folgenden Block code:

senseBoxIO.powerI2C(false);delay(1000);
senseBoxIO.powerI2C(true);delay(1000);
senseBoxIO.powerXB2(false);delay(1000);
senseBoxIO.powerUART(false);delay(1000);

an den Anfang vom Setup ziehst sollte es funktionieren :slight_smile:


#11

Hi Mario,

toll, darauf wäre ich nie gekommen. Ich probiere es gleich mal aus.

Gruß

Rolf
:kissing_heart: