NEWS
Welchen Luftgütesensor
-
Nee so einfach ist das nicht. Der ganze Code muss dafür angepasst werden, da wo die Aufrufe sind
Gesendet von meinem SM-G925F mit Tapatalk
-
'BmeBoschwrapper' does not name a type ```` `
Das kenne ich nicht. Wo steht bei Dir BmeBoschwrapper ? Im Sketch? Dann ist das ein anderes Sketch. Und wenn dort die Bosch-Lib schon eingebunden ist, dann sieht das gut aus. müssen nur noch die Parameter passen.
-
aber das ist die einzige Stelle.
- ich will ja Learnen beim Doing.
Gruß
Rainer
-
Zu den Parametern:
Bei mir im Sketch steht:
/*********** BME280 setup *********** */ /* excerpt from Bosch datasheet chapter 3.5.1 Weather monitoring Table 7: Settings and performance for weather monitoring Suggested settings for weather monitoring Sensor mode forced mode, 1 sample / minute Oversampling settings pressure *1, temperature *1, humidity *1 IIR filter settings filter off Performance for suggested settings Current consumption 0.16 μA RMS Noise 3.3 Pa / 30 cm, 0.07 %RH Data output rate 1/60 Hz * ** End excerpt from Bosch datasheet chapter 3.5.1 Weather monitoring **/ byte chipID = 0; // for BME280 Cip IF chipID = BME280.readChipId(); #ifdef FSDEBUG DBG_OUTPUT_PORT.print (F("BME280 Chip Id (0x): ")); DBG_OUTPUT_PORT.println (chipID, HEX); #endif // FSDEBUG // need to read the NVM compensation parameters BME280.readCompensationParams(); // Need to turn on 1x oversampling, default is os_skipped, which means it doesn't measure anything BME280.writeOversamplingPressure(os1x); // 1x over sampling (ie, just one sample) BME280.writeOversamplingTemperature(os1x); // 1x over sampling (ie, just one sample) BME280.writeOversamplingHumidity(os1x); // 1x over sampling (ie, just one sample) measuringTime = (int) (0.5 + (1.25 + (2.3 * 1) + (2.3 * 1 + 0.575) + (2.3 * 1 + 0.575))); // measuringTime is unsigned long /* in forced mode with oversampling=1 in all 3 values the max measuring time should be < 22.8ms in forced mode with all oversamplings to x16 (max value) the measring time should be <112,8 for other oversampling settings refer Bosch datasheet chapter 9.1 Measurement time measuringTime = 1.25+(2.3*temp_os) + (2.3*humid_os + 0.575) + (2.3*press_os + 0.575) */ // init a forced sample. After taking the measurement the chip goes back to sleep BME280.writeMode(smForced);
Das mag bei Dir etwas anders heißen, wenn Du den BoschWrapper verwendest.
-
Danke klassisch,
dann bin ich tatsächlich leider raus
das ist (noch) zu hoch für mich.
Danke nochmals
Rainer
-
aber das ist die einzige Stelle.
- ich will ja Learnen beim Doing. `
Wahrscheinlich ist Dein Sketch für diese Lib ausgelegt und an dieser Stelle wird diese Lib instanziert.
Du hast jetzt 2 Möglichkeiten: Die Lib (mit dem Boschwrapper) mit Stupf und Stiel aus Deinem Sketch reissen und durch die andere (die auch ich verwende) ersetzen oder sie drinlassen und die Stellen aufsuchen, wo die Parameter eingestellt werden.
Drinlassen könnte einfacher sein. Und wenn da wirklich die Original-Bosch-Lib drinsteckt, dann solte das auch möglich sein. Parameter stehen ja oben.
- ich will ja Learnen beim Doing. `
-
Könnte sein, daß wir der Sache näher kommen.
Verwendest Du diese Lib von Jan Wasserbauer:
https://github.com/vodnik12/JWA_BME280/ … /README.md
?
-
Na, mach mir nur Mut.
Wahrscheinlich ist Dein Sketch `
Der Sketch ist von Maik, und für mich ist das der erste Sketch überhaupt den ich mir mal ansehehttp://forum.iobroker.net/viewtopic.php … 100#p78500
und die Stellen aufsuchen, wo die Parameter eingestellt werden. `
Yeah :shock:Mache ich jetzt - erst mal im Notepad++
Vielleicht wird ja doch noch mal was aus mir
Gruß
Rainer
-
Verwendest Du diese Lib von Jan Wasserbauer:
https://github.com/vodnik12/JWA_BME280/ … /README.md
? `
Ja!
Gruß
Rainer
-
Dann schauen wir mal in seinem git, ob wir die Stelle sehen, wo die Parameter gesetzt werden. Er hat ja auch vom Temperaturunterschied gesprochen aber nicht in welche Richtung….
-
Steht bei Dir
Bme280BoschWrapper bme280(true);
? Wenn ich das richtig verstanden habe, dann würde er im forced mode starten. Aber die anderen Parameter habe ich noch nicht gefunden. Und ich habe den Genauigkeitsgrad noch nicht gesehen. Der macht aber wahrscheinlich keine 3 bis 4 K aus. Bosch hat die Kompensationrechnung aus dem Sensor rausverlagert in den host-Rechner. Das macht es so kompliziert. Und weil Bosch gerne optimiert (manchmal bis zum Geiz) gibt es 3 Genauigkeitsklassen, wenn ich mich recht erinner. Je nach vorhandener Rechenleistung kann man eine passende Kompensationsrechnung verwenden. Für die WeMos habe ich immer die genaueste Rechnung verwendet. Die Dinger sind schnell genug. Aber wie gesagt, das sollte keine 3 bis 4 K ausmachen, denke ich.
Die von mir referenzierte Lib ermöglicht diese Wahl. Ein klassischer Arduino könnte aber bei der genaueren Rechnung ins Schwitzen kommen.
-
Steht bei Dir `
Ja!// BME280 initialisieren Bme280BoschWrapper bme280(true); unsigned long syncTime;
und da hatte ich gedacht es reicht den Namen auszutauschen gegen den der neuen Bibliothek.
habe gerade versucht das in github zu verstehen und dabei gemerkt, dass mein Vorhaben eine Schnapsidee war
Gruß
Rainer
-
Nochwas: In welchen Zeitabständen rufst Du
bme280.measure()
auf?
-
Wenn ich Maik richtig verstanden habe hat er das in der http://forum.iobroker.net/viewtopic.php?f=34&t=3954&start=100#p78500 von etwa 6 sec auf 60sec angehoben.
Gruß
Rainer
-
6 Sekunden wäre zu häufig, 60 Sekunden ist o. k.
Gesendet von meinem ZTE A2016 mit Tapatalk
-
Das mit den 60Sekunden hatte nur leider keine Auswirkung weil der BME280 so oft misst wie in den Settings eingestellt ist. Mit der library konnte man den BME280 aber überhaupt nicht so konfigurieren.
Ich implementiere eben die MOD-1022 library und poste das sofort. dann kannst du das testen
-
Super, vielen Dank!
Settings habe ich oben gepostet. Falls Du noch was brauchst, einfach melden, dann schaue ich gschwind bei mir nach.
-
So hier mal die geänderte Version. Wieder oben die Variablen für IP-Adresse usw. anpassen.
! ```
`//#include <bme280boschwrapper.h>
#include <ethernet.h>
#include <stdlib.h>
#include <avr pgmspace.h="">
#include <pubsubclient.h>
#include "Wire.h"
! #include <bme280_mod-1022.h>
! // Modultexte für MQTT Adapter
char modul_name[] = "Raumsensor_Wohnzimmer";
char humidity_str[] = "/Wohnzimmer/Luftfeuchtigkeit";
char temperature_str[] = "/Wohnzimmer/Raumtemperatur";
char pressure_str[] = "/Wohnzimmer/Luftdruck";
char co2_str[] = "/Wohnzimmer/CO2";
char status_str[] = "/Wohnzimmer/iAQ_Status";
char resistance_str[] = "/Wohnzimmer/iAQ_Widerstand";
char tvoc_str[] = "/Wohnzimmer/TVOC";
! //Setup Ethernet Library
byte mac[] = { 0xAB, 0xAD, 0xBE, 0xEF, 0xEF, 0xDE }; //MAC Adresse des Ethernet Moduls
IPAddress arduino_ip(192, 168, 178, 102); //IP des Teensy
IPAddress server_ip(192, 168, 178, 100); //MQTT Broker (= Raspberry Pi)
EthernetClient client;
! // BME280 initialisieren
//Bme280BoschWrapper bme280(true);
unsigned long syncTime;
! //IAQ Core C Setup
#define iaqaddress 0x5A
! uint16_t predict;
uint8_t statu;
int32_t resistance;
uint16_t tvoc;
! // ===========================================================
// Callback Funktion von MQTT. Die Funktion wird aufgerufen
// wenn ein Wert empfangen wurde.
// ===========================================================
void callback(char* topic, byte* payload, unsigned int length)
{
//char message_buff[100];
! //Serial.print("Nachricht erhalten mit Topic: ");
//Serial.println(topic);
! //// Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
//unsigned int i = 0;
//for (i = 0; i<length; 8/16/1883/i++)/{/message_buff[i]="payload[i];" }/;/serial.print("nachricht:/");/serial.println(message_buff);/mqtt/client/zur/kommunikation/mit/dem/server/server_ip/-/variable/des/types/byte/serveradresse/ist/der/standard/tcp/port/callback/function/wird/aufgerufen/wen/nachrichten/eintreffen/angabe/ethernet/clients/pubsubclient/mqttclient(server_ip,/1883,/callback,/client);/messdaten/vom/iaq/core/lesen/void/readallbytes()/wire.requestfrom(iaqaddress,/9);/predict="(Wire.read()" <</|/wire.read());/statu="Wire.read();" resistance="(Wire.read()" &/0x00)/(wire.read()/16)/tvoc="(Wire.read()" status/ermitteln/checkstatus()/if/(statu="=" 0x10)/serial.println("aufwärmphase...");/else/serial.println("bereit");/0x01)/serial.println("belegt");/0x80)/serial.println("fehler");/serial.println("kein/empfangen,/modul/prüfen");/setup()/ethernet.begin(mac,/arduino_ip);/delay(1000);/shield/zeit/geben/zum/initialisieren/serial.begin(115200);/wire.begin();/while/(!bme280.begini2c(0x76))/serial.println("sensor/nicht/gefunden.");/synctime="millis();" loop()/aufbau/verbindung/mqtt-broker/falls/diese/offen/ist./(!mqttclient.connected())/mqttclient.connect(modul_name);/abonieren/von/angegebenen/topic/mqttclient.subscribe("/wohnzimmer/settings/#");/schleife/für/(mqttclient.loop())/serial.println("verbunden");/need/to/read/the/nvm/compensation/parameters/bme280.readcompensationparams();/example/for/"indoor/navigation"/we'll/switch/into/normal/mode/regular/automatic/samples/bme280.writestandbytime(tsb_0p5ms);/tsb="0.5ms" bme280.writefiltercoefficient(fc_16);/iir/filter/coefficient/bme280.writeoversamplingpressure(os16x);/pressure/x16/bme280.writeoversamplingtemperature(os2x);/temperature/x2/bme280.writeoversamplinghumidity(os1x);/humidity/x1/bme280.writemode(smnormal);/(bme280.ismeasuring())/out/data/must/do/this/before/calling/getxxxxx/routines/bme280.readmeasurements();/char/tempbuffer[10];/dtostrf(bme280.gettemperaturemostaccurate(),/2,/tempbuffer);/mqttclient.publish(temperature_str,/delay(500);/dtostrf(bme280.gethumiditymostaccurate(),/3,/mqttclient.publish(humidity_str,/dtostrf(bme280.getpressuremostaccurate(),/4,/mqttclient.publish(pressure_str,/*unsigned/long/currentmillis="millis();" ((unsigned/long)(currentmillis/synctime)="">= 60000) //Alle 15sec ausf�hren
{
// Bosch BME280 Messwerte sendenif (bme280.measure()) { char tempBuffer[10];
! dtostrf((bme280.getTemperature() / 100.0), 2, 2, tempBuffer);
mqttClient.publish(temperature_str, tempBuffer);
! delay(1000);
! dtostrf((bme280.getHumidity() / 1024.0), 3, 2, tempBuffer);
mqttClient.publish(humidity_str, tempBuffer);
! delay(1000);
! dtostrf((bme280.getPressureDouble() / 100.0), 4, 2, tempBuffer);
mqttClient.publish(pressure_str, tempBuffer);
! delay(1000);
}
else
{
Serial.println("Messung mit BME280 fehlgeschlagen.");
}
! syncTime = currentMillis;
}*/
! delay(1000);
! readAllBytes();
checkStatus();
//char tempBuffer[10];
! //CO2 Wert
snprintf(tempBuffer, sizeof(tempBuffer), "%u", (predict));
mqttClient.publish(co2_str, tempBuffer);
! //Status
snprintf(tempBuffer, sizeof(tempBuffer), "%u", (statu));
mqttClient.publish(status_str, tempBuffer);
! //Widerstandswert
snprintf(tempBuffer, sizeof(tempBuffer), "%lu", (resistance));
mqttClient.publish(resistance_str, tempBuffer);
! //TVOC Wert
snprintf(tempBuffer, sizeof(tempBuffer), "%u", (tvoc));
mqttClient.publish(tvoc_str, tempBuffer);
! delay(5000);
}</length;></bme280_mod-1022.h></pubsubclient.h></avr></stdlib.h></ethernet.h></bme280boschwrapper.h>`
! Gruß Maik[/i][/i][/i] -
Vielen Dank!
erste schnelle RM:
BME280.writeMode(normal);
ist das böse Teil-
BME280.writeMode(smForced); ````ist brav. example for indoor navigation liest den Drucksensor sehr genau aus und macht den Sensor warm. Ich arbeite mit
// Need to turn on 1x oversampling, default is os_skipped, which means it doesn't measure anything
BME280.writeOversamplingPressure(os1x); // 1x over sampling (ie, just one sample)
BME280.writeOversamplingTemperature(os1x); // 1x over sampling (ie, just one sample)
BME280.writeOversamplingHumidity(os1x); // 1x over sampling (ie, just one sample)
measuringTime = (int) (0.5 + (1.25 + (2.3 * 1) + (2.3 * 1 + 0.575) + (2.3 * 1 + 0.575))); // measuringTime is unsigned long
/* in forced mode with oversampling=1 in all 3 values the max measuring time should be < 22.8ms
in forced mode with all oversamplings to x16 (max value) the measring time should be <112,8
for other oversampling settings refer Bosch datasheet chapter 9.1 Measurement time
measuringTime = 1.25+(2.3temp_os) + (2.3humid_os + 0.575) + (2.3*press_os + 0.575) */// init a forced sample. After taking the measurement the chip goes back to sleep
BME280.writeMode(smForced);
delay(measuringTime + 25); // wait until measurement is done. With oversampling=1 in all 3 values the max measuring time should be < 22.8ms
// for other oversampling settings refer Bosch datasheet chapter 9.1 Measurement time
BME280.readMeasurements();
if (BME280.isMeasuring()) { // this should not happen becaus wait time is long enough
BME280ReadError = 1; -
okay ich hatte jetzt einfach die settings für Innenraum Messung empfohlen von Bosch
Wie hast du dann die settings für oversampling usw. ?