Probleme mit dem Auslesen BME280

  • Nö. Da muss ich passen.


    Knisterbein: Mit der Arduino Umgebung hast Du recht. Hilft hier aber auch nicht weiter, weil es ja um Micropython geht.


    Ich habe selber schon ein paar BME280 verbaut. Mir ist allerdings noch kein Breakout untergekommen, bei dem man (bei Verwendung einer passenden Bibliothek) noch explizit die Feuchtigkeitsmessung aktivieren muss.


    Das dürfte eigentlich auch bei Micropython der Fall sein.

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • Hallo Peter


    ich habe leider keinen BME280 und mit der Arduino Umgebung bin ich wenig geübt, da ich immer mit dem Atmel Studio arbeite.
    Mein Hinweis stammt daher, dass ich mich mit der Implementierung des BME680 auf einem ATmega2560 beschäftigte. Daher ging ich von der Annahme aus, dass auch der BME280 die einzelnen Sensorwerte ein/ausschalten lässt.

    Soviel ich weiss ist die Arduino-Umgebung nicht in der Lage, ein Debugging oder eine Simulation durch zu führen, aber vielleicht weiss KaiR hierzu mehr. Meine Fehlersuche mit dem BME680 erfolgte auf der Registerebene, teilweise mit einem I2C Tracer.


    sorry

    Pius

  • Danke für den Hinweis.

    Ich habe leider noch nicht die nötigen Kenntnisse einen Aktivierungsbefehl für die Feuchtigkeitsmessung an den BME zu programmieren,

    bzw. den Inhalt der Parameter auszulesen.

    Ein Hinweis hierzu würde mir helfen.


    Gruss

    Peter

  • Hallo Rene,

    da ich keine Feuchtigkeitswerte bekomme habe ich wohl einen BMP 280 erwischt.

    Obwohl ja beides auf dem Teil deklariert ist.

    Habe schon einen neuen BME 280 bestellt.

    Dauert nur etwas.

    Gruss Peter

  • Hallo René,

    danke für den Tipp.

    Nach Lektion 11 gibt das BME Werte ab und es wird auch angezeigt.

    Leider fehlt mir die Luftfeuchtigkeit (0%).

    Der Sensor ist ja laut Deklaration mit Luftfeuchte.

    Hast Du vielleicht noch einen Tipp?

    In der bme280 Gerätedatei steht ja als Calibrierungsadresse: 0xE1

    und als Calibrierungswortlänge 7.

    Ich habe bei meinen Adressversuchen einmal als Id-Adresse E1 angegeben.

    Kann ich den Sensor für die Luftfeuchte neu calibrieren?

    Gruss Peter

  • Hallo Hobbying,


    es könnte auch sein, dass dein BME unschuldig ist. Es hat leider auch bei den Heltec - Boards Änderungen gegeben. Neuere Boards benötigen eine etwas andere Ansteuerung. Gehe einmal zur Lektion 11 und lade die dortigen Beispielprogramme herunter. Diese sollten mit beiden Board - Revisions funktionieren.


    Gruss

    René

  • Hallo,

    bekomme immer die Meldung:


    Couldn't read BME280 chip ID after 5 attempts.


    Habe schon die 0x58 versucht.

    die Anzeigenangaben des Versenders waren BME280 jetzt steht allerdings auf der Mitteilung für

    versendete Artikel BMP.

    Im Netz sind ja so keine orginale Bosch-Sensoren zu erkennen.

    Bei mir steht beides drauf (siehe Foto).

    Die ID auszulesen geht auch nicht, obwohl das print (men[0]) in der bme280-i2c steht.

    nur die Meldung erscheint.

  • Hallo René - das gleiche hat mich auch gewundert, aber ich habs einfach mal in Zeile 97 ( wie von dir geschrieben ) eingefügt. Ich dachte, mir schon, dass du eigentlich innerhalb der Schleife meinst, aber ich wollte einfach mal sehen was passiert und wer dann von dem Ergebnis so überrascht. Normal wollte ich in einem zweiten Schritt, die Zeile noch verschieben. Da ich zur Zeit doch recht viel Arbeit hab, mach ich das immer so zwischendurch oder spät in der Nacht.

    Danke dir und Kai für eure Hilfe. Falls ich noch was finde, halte ich euch auf dem Laufenden.

    So und jetzt läufts auf einmal auch ohne die Zeile - was soll man da noch sagen. Einen kleinen Verdacht habe ich noch - könnte es sein, dass Thonny die Dateien evtl. hin und wieder gar nicht überschreibt. Denn das wäre noch das einzige, was ich jetzt in der Zwischenzeit gemacht habe: Ich habe die bmeI2c.py vom Chip gelöscht. Ich hab mich aber auch im Vorfeld immer noch vergewissert, dass die Änderungen auch auf dem Chip sind. Seltsamer Effekt. Und das mit dem print-Befehl war schon wirklich ein grober Fehler, der mir da in der Eile passiert ist. Hab das jetzt erst gesehen.


    Gruß Tom

  • Wie auch immer, so wird nix angezeigt, weil der Printbefehl vor dem Befehl zum Einlesen der ID in „mem“ ausgeführt wird. Das passiert erst eine Zeile später.

    Wenn die Schleife nicht min. noch einmal durchläuft, bekommst Du nichts angezeigt, weil die For-Schleife durch den „return“ Befehl verlassen wird.

    Wenn das Programm jetzt aber wie von Geisterhand funktioniert, dann muss die ID 0x60 sein.


    Gruß Kai

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • René, ich werd verrückt. Jetzt hab ich nichts anderes gemacht, als deine Zeile eingefügt und plötzlich werden auf dem Display die Werte ausgegeben.

    Ich werde jetzt nochmal versuchen die Zeile zu löschen. Eigenartig ist dabei, dass ich keine Printausgabe der ID bekomme. ^^

    Das einzige was ich noch gemacht habe, dass ich das Modul auch nochmal vom Chip gelöscht habe.

    Aber normalerweise prüfe ich sowieso immer dreimal, ob ich nicht aus Versehen eine ältere Variante verwende.

    pasted-from-clipboard.png

    Hier läuft das Programm gerade - müsste ich nicht zumindest eine Ausgabe der ID kriegen ?


    Vielen Dank nochmal - ich werde noch weiter untersuchen woran das liegen könnte.

    Gruß Tom

  • Hallo Tom,


    momentan fehlt mir eine Idee, woran das liegen könnte.

    Soweit ich weiss, wird mit der ID nichts gemacht. Es wird nur getestet, ob sie korrekt ist.


    Kannst du mal überprüfen, ob überhaupt eine ID gelesen werden kann?

    Dazu kannst du nach Zeile 97 in bme280_i2c ein print(mem[0]) einfügen.


    Der Wert sollte 0x60 (oder dezimal 96) sein.


    Gruss

    René

  • Ja, das habe ich auch schon getan, denn das war auch so ein Gedanke. Es kommt zwar dann keine Fehlermeldung mehr, aber das Programm macht soweit auch nichts. Ich denke dass die ID für den weiteren Verlauf nötig ist. Da muss ich mich heute nochmal in das Modul etwas einarbeiten . Danke !

  • Laut dem Code ist es die gleiche Adresse.


    So wie es aussieht, tritt der Fehler bei Micropython ja schon im Konstruktor der BME280_I2C Klasse beim Einlesen der Chip-ID auf. Also noch bevor überhaupt die set_measurement_settings() Methode aufgerufen werden kann.


    Es wäre halt ein naheliegender Fehler gewesen, dass evtl. die Adresse nicht stimmt und das Programm deshalb schon im Konstruktor eine Ausnahme schmeißt. So einfach scheint es aber leider nicht zu sein ;). Zumindest soweit ich das erkennen kann.


    Das legt den Schluss nahe, dass entweder etwas mit der Verkabelung nicht stimmt oder die Chip-ID vom Sensor nicht zu dem passt, was in der Klasse programmiert ist.


    Allerdings stecke ich nicht so weit in der Materie drin, um sagen zu können ob es unterschiedliche CHIP_IDs für den BME280 gibt.


    Was würde denn passieren, wenn man den Check mal ignoriert und im Konstruktor der BME280_I2C Klasse den Aufruf self.read_chip_id() probeweise mal auskommentiert?



    Gruß Kai

    Das Reh springt hoch. Das Reh springt weit. Warum auch nicht? Es hat ja Zeit. 8o

  • Hallo Kai,


    zunächst mal Danke für deine Antwort. Ich sende dir hier mal den Sketch, den ich auf dem Arduino verwendet habe.

    /*

    BME280 I2C Test.ino


    This code shows how to record data from the BME280 environmental sensor

    using I2C interface. This file is an example file, part of the Arduino

    BME280 library.


    GNU General Public License


    Written: Dec 30 2015.

    Last Updated: Oct 07 2017.


    Connecting the BME280 Sensor:

    Sensor -> Board

    -----------------------------

    Vin (Voltage In) -> 3.3V

    Gnd (Ground) -> Gnd

    SDA (Serial Data) -> A4 on Uno/Pro-Mini, 20 on Mega2560/Due, 2 Leonardo/Pro-Micro

    SCK (Serial Clock) -> A5 on Uno/Pro-Mini, 21 on Mega2560/Due, 3 Leonardo/Pro-Micro


    */


    #include <BME280I2C.h>

    #include <Wire.h>


    #define SERIAL_BAUD 115200


    BME280I2C bme; // Default : forced mode, standby time = 1000 ms

    // Oversampling = pressure ×1, temperature ×1, humidity ×1, filter off,


    //////////////////////////////////////////////////////////////////

    void setup()

    {

    Serial.begin(SERIAL_BAUD);


    while(!Serial) {} // Wait


    Wire.begin();


    while(!bme.begin())

    {

    Serial.println("Could not find BME280 sensor!");

    delay(1000);

    }


    // bme.chipID(); // Deprecated. See chipModel().

    switch(bme.chipModel())

    {

    case BME280::ChipModel_BME280:

    Serial.println("Found BME280 sensor! Success.");

    break;

    case BME280::ChipModel_BMP280:

    Serial.println("Found BMP280 sensor! No Humidity available.");

    break;

    default:

    Serial.println("Found UNKNOWN sensor! Error!");

    }

    }


    //////////////////////////////////////////////////////////////////

    void loop()

    {

    printBME280Data(&Serial);

    delay(500);

    }


    //////////////////////////////////////////////////////////////////

    void printBME280Data

    (

    Stream* client

    )

    {

    float temp(NAN), hum(NAN), pres(NAN);


    BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);

    BME280::PresUnit presUnit(BME280::PresUnit_hPa);


    bme.read(pres, temp, hum, tempUnit, presUnit);


    client->print("Temp: ");

    client->print(temp);

    client->print("°"+ String(tempUnit == BME280::TempUnit_Celsius ? 'C' :'F'));

    client->print("\t\tHumidity: ");

    client->print(hum);

    client->print("% RH");

    client->print("\t\tPressure: ");

    client->print(pres);

    client->println(" Pa");


    delay(1000);

    }



    Hier noch der Teil aus der Libary bzw. Headerdatei:

    struct Settings : public BME280::Settings

    {

    Settings(

    OSR _tosr = OSR_X1,

    OSR _hosr = OSR_X1,

    OSR _posr = OSR_X1,

    Mode _mode = Mode_Forced,

    StandbyTime _st = StandbyTime_1000ms,

    Filter _filter = Filter_Off,

    SpiEnable _se = SpiEnable_False,

    uint8_t _addr = 0x76

    ) : BME280::Settings(_tosr, _hosr, _posr, _mode, _st, _filter, _se),

    bme280Addr(_addr) {}


    uint8_t bme280Addr;

    };


    Sollte normalerweise die selbe Adressierung sein.


    Gruß Tom