IAQ und BME280

Hallo,

ich bin absoluter Newbie und versuche mich nun einmal mit Senoren.

Ich habe ein ESP8266-E12 in Verwendung und möchte einen VOC Sensor IAQ-CORE und einen Temperatursensor BME 280 auslesen.

Das funktioniert schon mal im große und ganzen. Allerdings dürfte die I2C Kommuniktion noch nicht so optimal laufen. Wenn ich den IAQ alleine auslese, kommen die Werte relativ sauber (einige male "sensor is busy").
Ist der BME280 auch noch dabei, dann ist die "Fehlerqoute" höher.

Wie sauber sollen die Werte tatsächlich sein - muss man mit Fehlübertragungen leben? Oder müssen die Werte sauber ausgelesen werden können?

Natürlich ist mein Code vermutlich verbesserungswürdig, aber ich bitte um Eure Erfahrungswerte bzgl. mehrerer SEnsoren auf dem I2C.

Danke für euer Feedback!!

Dann zeig doch einfach mal deinen Sketch.
Den in Code-Tags posten.
Dazu die Schaltfläche </> oben links im Editorfenster verwenden.

Hast du am I2C-Bus Pullup-Widerstände ?

wie lange sind die Kabel zwischen Board und Sensoren?
Schematisches Schaltbild mit Längenangaben wären gut.
Dann kannst auch gleich die Pullups einzeichnen.
Foto von Handzeichnung auf kariertem Papier reicht, geht nur darum dass wir sehen was wie wo angeschlossen sein soll.

die sensoren sind direkt auf einem bread board - also minimale kabellänge.

mit pull up widerständen hab ich noch nicht probiert... muss ich gleich mal testen. wie hoch sollten diese sein?

herzlichen dank für euer feedback !!!

hier noch der code:

#include <Arduino.h>
#include <Wire.h>
#include <ESP8266WebServer.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "iAQCoreI2C.h"

#define SEALEVELPRESSURE_HPA (1013.25)

iAQCoreI2C iaq;
uint16_t airQuality;
uint16_t airTvoc;

ESP8266WebServer server(80);  
const char* ssid = "TBS-WLAN2";  // Enter SSID here
const char* password = "F15CCF20F5";  //Enter Password here

Adafruit_BME280 bme;
float temperature, humidity, pressure, altitude;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  Wire.begin(D2, D1);
  Wire.setClock(100000L);
  Wire.setClockStretchLimit(1000);
    
  bme.begin(0x76); 

  if (!iaq.begin())
  {
    Serial.println("begin() failed. check the connection to your iAQ-Core.");
    while (1);
  }
  
  // WEB Server
  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started"); 
}

void loop() {
  server.handleClient();
}
void handle_OnConnect() {
  delay(500);
  airQuality = (iaq.getCO2());
  airTvoc = (iaq.getTVOC());
  delay(500);
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  pressure = bme.readPressure() / 100.0F;
  altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);

  server.send(200, "text/html", SendHTML(airTvoc,airQuality,temperature,humidity,pressure));

  //read the sensor to determine if it holds a valid value. 
  //hasValue MUST be called to update sensor values. 
  Serial.print("sensor has valid value: "); Serial.print(iaq.hasValue() ? "true" : "false");

  if (iaq.isRunin())
    Serial.print("sensor is runin state");

  else if (iaq.isBusy())
    Serial.print("sensor is busy");

  else if (iaq.isValid())
  {
    Serial.print("   CO2 equivalent: "); 
    Serial.print(airQuality); 
    Serial.print("ppm");
    
    Serial.print("   TVOC equivalent: "); 
    Serial.print(airTvoc); 
    Serial.print("ppb");
    
    Serial.print("   Sensor Resistance: "); 
    Serial.print(iaq.getResistance()); 
    Serial.println("Ohm");
  }

  else if (iaq.isError())
    Serial.println("sensor is in error state");
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

//...String SendHTML(float temperature,float humidity,float pressure,float altitude,float airQuality,float airTvoc,float iAQstatus){
//...String SendHTML(float temperature,float humidity,float pressure,float altitude){
String SendHTML(unsigned short airTvoc,unsigned short airQuality, float temperature, float humidity, float pressure){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>Vision Smart Luftgütesensor Büro</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="<script>\n";
  ptr +="setInterval(loadDoc,1000);\n";
  ptr +="function loadDoc() {\n";
  ptr +="var xhttp = new XMLHttpRequest();\n";
  ptr +="xhttp.onreadystatechange = function() {\n";
  ptr +="if (this.readyState == 4 && this.status == 200) {\n";
  ptr +="document.body.innerHTML =this.responseText}\n";
  ptr +="};\n";
  ptr +="xhttp.open(\"GET\", \"/\", true);\n";
  ptr +="xhttp.send();\n";
  ptr +="}\n";
  ptr +="</script>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>Luftgütesensor Büro</h1>\n";
  ptr +="<p>Temperatur: ";
  ptr +=temperature;
  ptr +=" &deg;C</p>";
  ptr +="<p>Luftfeuchte: ";
  ptr +=humidity;
  ptr +=" %</p>";
  ptr +="<p>Luftdruck: ";
  ptr +=pressure;
  ptr +=" hPa</p>";
//...ptr +="<p>Altitude: ";
//...  ptr +=altitude;
//...  ptr +="m</p>";
  ptr +="<p>Luftgüte: ";
  ptr +=airTvoc;
  ptr +=" ppb</p>";
  ptr +="<p>CO2: ";
  ptr +=airQuality;
  ptr +=" ppm</p>";
//...  ptr +="<p>Status Luftgütemesser: ";
//...  ptr +=iAQstatus;
//...  ptr +=" </p>";
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

wird nicht das Problem sein, aber delays in einem webserver wären für mich ein nogo.
Warum hast du diese gesetzt?

edit:
Machs asyncron.
Lies im Loop periodisch deine Sensoren aus (alle x Sekunden), nicht blockierenden nach Muster Blink Without Delay.
Also nicht mittels onConnect aufrufen sondern einfach laufend machen. Hat auch den Vorteil, dass du auch ohne aktiver Client-Verbindung suchen kannst, worans im I2C hapert.

... war nur ein test eines newbies um möglicherweise das auslesen der sensoren zu verzögern ...

Bei kurzen Leitungen ist das meist unkritisch. Wenn du welche einbaust, vorher prüfen, ob die auf dem Sensor evtl. schon vorhanden sind.
Wenn nicht, nimm 4k7, das passt.

Was sagt denn der serielle Monitor ?
Werden da die Sensordaten richtig angezeigt ?

hab nun zwei 4K7 gegen +3,3V gesetzt.

beim seriellen motitor sind viele werte ok, und dann kommen zwischendurch immer wieder fehler

sensor has valid value: true CO2 equivalent: 1055ppm TVOC equivalent: 292ppb Sensor Resistance: 187500Ohm
sensor has valid value: true CO2 equivalent: 1057ppm TVOC equivalent: 293ppb Sensor Resistance: 187500Ohm
sensor has valid value: true CO2 equivalent: 1057ppm TVOC equivalent: 293ppb Sensor Resistance: 187685Ohm
sensor has valid value: true CO2 equivalent: 1055ppm TVOC equivalent: 292ppb Sensor Resistance: 188243Ohm
sensor has valid value: true CO2 equivalent: 1049ppm TVOC equivalent: 290ppb Sensor Resistance: 188990Ohm
sensor has valid value: true CO2 equivalent: 1040ppm TVOC equivalent: 288ppb Sensor Resistance: 190304Ohm
sensor has valid value: true CO2 equivalent: 1026ppm TVOC equivalent: 284ppb Sensor Resistance: 191819Ohm
sensor has valid value: true CO2 equivalent: 1009ppm TVOC equivalent: 279ppb Sensor Resistance: 194117Ohm
sensor has valid value: true CO2 equivalent: 984ppm TVOC equivalent: 272ppb Sensor Resistance: 198214Ohm
sensor has valid value: true CO2 equivalent: 941ppm TVOC equivalent: 261ppb Sensor Resistance: 204238Ohm
sensor has valid value: true CO2 equivalent: 881ppm TVOC equivalent: 244ppb Sensor Resistance: 212817Ohm
sensor has valid value: true CO2 equivalent: 800ppm TVOC equivalent: 222ppb Sensor Resistance: 224086Ohm
sensor has valid value: true CO2 equivalent: 705ppm TVOC equivalent: 196ppb Sensor Resistance: 224086Ohm
sensor has valid value: true CO2 equivalent: 705ppm TVOC equivalent: 196ppb Sensor Resistance: 238029Ohm
sensor has valid value: true CO2 equivalent: 599ppm TVOC equivalent: 166ppb Sensor Resistance: 248604Ohm
sensor has valid value: true CO2 equivalent: 527ppm TVOC equivalent: 147ppb Sensor Resistance: 257327Ohm
sensor has valid value: true CO2 equivalent: 471ppm TVOC equivalent: 131ppb Sensor Resistance: 269283Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 280750Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 284405Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 293822Ohm
sensor has valid value: falsesensor has valid value: true CO2 equivalent: 33023ppm TVOC equivalent: 65535ppb Sensor Resistance: 305675Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 312189Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 316755Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 322500Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 326532Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 325793Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 324690Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 324690Ohm
sensor has valid value: falsesensor has valid value: true CO2 equivalent: 33023ppm TVOC equivalent: 65535ppb Sensor Resistance: 314636Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 310802Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 304326Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 298357Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 298357Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 296402Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 299013Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 305000Ohm
sensor has valid value: falsesensor has valid value: true CO2 equivalent: 33023ppm TVOC equivalent: 65535ppb Sensor Resistance: 307031Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 300660Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 293501Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 287500Ohm
sensor has valid value: falsesensor has valid value: true CO2 equivalent: 33023ppm TVOC equivalent: 65535ppb Sensor Resistance: 285947Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 288124Ohm
sensor has valid value: falsesensor has valid value: true CO2 equivalent: 33023ppm TVOC equivalent: 65535ppb Sensor Resistance: 294464Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 300660Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 306013Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 311148Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 313935Ohm
sensor has valid value: true CO2 equivalent: 450ppm TVOC equivalent: 125ppb Sensor Resistance: 314285Ohm

NACHTRAG:
Auch beim Beispielcode "IAQ-Core" kommen beim seriellen Moitor zeitweise Fehler

stecke ich den BM280 ab, läuft der monitor sauber.

zu früh gefreut - doch nicht!

Datenblatt studieren obs irgendwelche Einschränkungen bezüglich minimum Intervall.
Auch wenns nur Symptombehandlung ist, wennst die Ausleselogik machst wie in #4 vorgeschlagen, fällt es nicht so sehr auf.