BME 280 hängt sich auf?

Er läuft und läuft- normalerweise.
Manchmal tagelang ohne Mucken.
Manchmal auch nicht. Gestern nachmittag hing er sich-zumindest scheinbar- wieder auf.
Wenige Stunden später-gleich noch mal.

Was passiert?
Er hängt an meinem Mega2560, der grade Wetterstation spielt.
Angeschlossen über I2C- wie sich das gehört.
Ausser ner Ds3231 und einem Nextion hängt nix weiter dran derzeit (kommt erst noch).
Ausgelesen wird der Sensor (Adafruit-Bibliotek) alle Minute- und das funktioniert von Anfang an bestens.

Aber eben: manchmal auch nicht.
Dann erscheinen Werte wie: Temperatur -180°, Luftfeuchte 99.9% und der Luftdruck liegt bei irgendwo um 1250 (oder ähnlich).
Wenn das passiert, bleibt es auch dabei, von selber ändert sich das nicht wieder.

Es kann nicht sein, dass der I2C-Bus abschmiert (oder die Wire-Lib), denn während diesem Zustand wird die Uhrzeit brav weiter ausgegeben- und zwar richtig.
Demnach läuft auch der Mega.
Ein Reset des Mega hilft nicht wirklich- zwar sind nach dem Neustart durchaus andere Werte da, aber stimmen tun die auch nich- ich würds merken, wenn ich hier drin Minusgrade hätte. 8)
Das Einzige, was wirklich hilft ist, mal kurz die Stromversorgung (der Mega hängt am Netzteil) zu kappen.
Danach ist wieder alles hübsch.

Das Ganze passiert -zumindest scheinbar- spontan. Manchmal tagelang überhaupt nicht, aber auch, wie gestern, innerhalb einiger Stunden mehrmals.
Unabhängig davon, was ich irgendwas an dem Teil mache (am Display rumspielen...) oder nicht. Es ist auch eher kein Wackelkontakt- das Ding steht brav aufm Tisch.

Leider kann ich es nicht näher diagnostizieren, denn ich kann unmöglich die Serielle Konsole tagelang laufen lassen (teilweise geht es wirklich mehrere Tage ganz ohne Mucken).

Da das Ding "fast keinen" Strom braucht, hatte ich mir überlegt, den Sensor einfach über nen Digitalpin zu versorgen. Reicht locker -und ich könnte die Ausreisser erkennen, und dann den Sensor mal kurz stromlos machen- ohne manuelles Zutun.

Was haltet ihr davon?
Geht das überhaupt, denn die I2C-Leitungen kann ich so natürlich nicht kappen...

Oder hat jemand eine Erklärung für das Verhalten? Und eine, wie das behebbar ist?
Überhitzung kann ich ausschliessen, das Ding schwebt praktisch frei (nur durch die vier Stifte mit ner Lochraster-Platine verbunden, nix anderes in direkter Nähe).

Könnte Kontaktproblem sein oder das Ding hat einfach ne Macke (also der Sensor).

Pieps mal die Verbindungen durch, und dabei ist Wackeln an den Strippen ausdrücklich erlaubt.

Rabenauge:
.....
Da das Ding "fast keinen" Strom braucht, hatte ich mir überlegt, den Sensor einfach über nen Digitalpin zu versorgen. Reicht locker -und ich könnte die Ausreisser erkennen, und dann den Sensor mal kurz stromlos machen- ohne manuelles Zutun.

Was haltet ihr davon?
Geht das überhaupt, denn die I2C-Leitungen kann ich so natürlich nicht kappen...
.....

Vom Abschalten der Spannung halte ich nichts, dadurch kommt evtl. I2C außer Tritt.
An I2C wird es vermutlich auch nicht liegen, da ja die RTC weiter läuft.

Was für ein Modul (Breakout-Board) hast du ?
Ist es eins, welches auch Spannungsregler und Levelshifter on Board hat ?
Der BME280 ist üblicherweise nur für 3,3 Volt geeignet.
Evtl. ist da das Problem.

Ich hab das Problem mal an einem BME680 gehabt, wenn ich dem Code kein Delay gegeben habe. Da kam nur Müll bei raus.

Mit 100ms delay, oder halt 100ms warten ohne delay() ging es bei mir.

Welchen BME hast du? China oder Watterott?

Ich lese den Sensor nur einmal die Minute aus- reicht ja auch.
Von daher brauch ich kein delay() oder irgendwelche Kunstpausen, in der übrigen Zeit wird der definitiv gar nicht abgefragt.

Woher der mal war, weis sich beim besten Willen nicht- der liegt schon ein Weilchen hier herum. Lila Platinchen, mit Hühnerfutter auf der Rückseite (die zeigt grade zur grossen Platine, da seh ich nix, vorn drauf Beschriftung : GY-B11 E/P 280.

Wackelkontakt- hm, mal nachlöten...aber das wäre denkbar, da das Ding wirklich nur an vier Stiften "frei schwebt". Hab ich bewusst so gemacht, da erfahrungsgemäss Temperatursensoren sonst sehr schnell mal aufgeheizt werden (durch andere Komponenten), und dann ziemlichen Murks ausgeben.

@HotSystems: ich lese den Sensor nur jede Minute mal aus. Wär vom Timing her kein Ding, das so zu programmieren, dass er nur abgeschalten wird, wenn er nicht abgefragt wird.

Und: es geht ja nicht um den Bus- dass der weiter läuft, weiss ich ja.
Die falschen Daten müssen vom Sensor kommen.
Aber die einzige Möglichkeit, die "Störung" wegzubekommen, die ich bisher gefunde hatte war, den Sensor mal kurz komplett stromlos zu machen.
Ein Reset des Dino hilft nicht.

I2C greift nur nach Auffoderung drauf zu ( leseSensorAus() ), also könnte ich, wenn das nicht der Fall ist, doch einfach mal die Versorungsspannung des Sensors kurz kappen (bzw. in den Sekunden die Abfrage verhindern)-> dann sollte der Bus davon eigentlich doch überhaupt nix mitkriegen?
Ggf. danach den Sensor neu starten (BME.begin() ) ?
Oder liegen am I2C-Bus, im Ruhezustand noch irgendwelche High-Pegel auf den Leitungen oder so Tücken?

Machbar wäre das von der Software her ohne weiteres, da er nicht "bissel falsches Zeug " liefert (die übrige Zeit liefert er allerfeinste, genaue Daten), sondern gleich die minus 180 Grad- die ich hier drin ganz sicher nie habe. Es ist also keine grosse Sache, das Problem zu erkennen, wenn es auftritt.

Übrigens läuft er jetzt wieder seit etwa 17 Stunden ohne Probleme. Hab ihn auch extra paar mal kräftig angestupst, auch am Stecker gewackelt usw.- interessiert ihn nicht. Nachgelötet wird der morgen trotzdem mal-schaden kanns ja nicht.

Aber über die Spannung sagst du nichts aus.
Das wäre schon wichtig, denn da tippe ich drauf.

Und klar, wenn du den Bus nicht beschäftigst, kannst du die Spannung abschalten.
Der Bus darf aber auch für andere Module nicht aktiv sein.

Hallo,
ich habe die Erfahrung gemacht, das es besser ist, BoschSensoren ohne Lib zu nutzen.
Früher oder später zicken die mit Lib.
Gruß und Spaß
Andreas

Bei mir läuft ein BME280 (China, violettes Board, gleiche Bezeichnung) seit 5 Monaten rund um die Uhr an einem ESP8266 mit 3,3V. Auf dem Modul sind keine Levelshifter o.ä. drauf.
Die Werte werden in eine Datenbank geschrieben. Dabei gibt es keine "Hänger".

Ich vermute auch die 5V Versorgung/Anbindung als Ursache.

Gruß Tommy

noiasca:
Willst nicht mal deinen Code reinstellen, damit einige "Spezialisten *)" mal drüberschauen können?

Nein, natürlich nicht. ;D

Wäre eh Quatsch, ohne in in die berühmten Codetags zu setzen, und das funktioniert bei rund zehn Seiten und fünf Tabs einfach nich... :confused:

Ich hoffe du meinst das genauso scherzhaft wie ich. :wink:
Im allgemeinen ist es nicht unbedingt die schlechteste Idee so zu tun, hier aber bringt das gar nix.

@Tommy56: ich kann die Bezeichnungen von allen Bauteilen auf dem Ding nicht erkennen, da es teilweise echt von meiner Hauptplatine verdeckt wird, zähle da jedoch mindestens vier Widerstände und zwei weitere, graue Bauteile- bissel viel für Pullups, meinste nich?
Laut Datenblatt von dem Ding sind bei I2C maximal zwei Widerstände erforderlich- die Pullups. Demnach müssten die grauen Teile Kondensatoren sein...
Ich bin ziemlich sicher: da sind Spannungsteiler. Da der Sensor nur paar Milliamperchen braucht, wäre das völlig ausreichend um die Spannung auf ein passendes Niveau zu senken.

Und: die Platine (die ich hier habe) wird bei Ebay beschrieben mit:

Supply Voltage: 1.8 - 5V DC

Also passt das.
Wüsste auch keinen einzigen Grund, wieso das ganze Tage- oder Wochenlang mit Überspannung funktionieren sollte, dann jedoch mal kurz nicht, und ne Sekunde später dann doch wieder.
Das Problem ist ja reproduzierbar zu beheben, aber nicht reproduzierbar zu verursachen.
So unzuverlässig ist Strom auch wieder nicht. :o

@SkobyMobil: Bibliothek rauswerfen, hmmmmm. Würd mich reizen (ausser der Wire hab ich nur noch die fürn Bosch überhaupt am laufen, alles andere mach ich ohne), aber das dann nur, wenn es partout nicht anders geht- oder ich mal wieder nen Anflug von sportlichem Ehrgeiz verspüre. In ganz seltenen Fällen hab ich mal solche Anwandlungen. Die werden aber, mit fortschreitendem Alter, seltener, hehe.

Morgen wird das Ding erstmal nachgelötet (müsst sowieso langsam mal nen SD-Slot rauf nageln), aktuell tut er schon wieder fast 23 Stunden artig seinen Dienst.
Ausserdem baue ich mal nen gescheiten Stecker für die 5V-Schiene, momentan wird die nur mittels Stiftleiste mit angelöteten Drähten versorgt -viel wackeliger gehts auch nich mehr. Der RTC ist sowas egal (weil sie eh ne Batterie hat), aber der Sensor könnte da pingelig sein. Danach gibts dann keine möglichen Wackelkontakte mehr (mit dran zupfen, rütteln, drücken und schieben konnt ich allerdings den Fehler auch nicht verursachen), und dann wird weiter beobachtet.
Sollte das nicht helfen, schwirrt noch eine Idee in meinem Kopf herum, aber dazu muss ich die Bibliothek von dem Ding wirklich mal genauer untersuchen.

Rabenauge:
....ich kann die Bezeichnungen von allen Bauteilen auf dem Ding nicht erkennen, da es teilweise echt von meiner Hauptplatine verdeckt wird, zähle da jedoch mindestens vier Widerstände und zwei weitere, graue Bauteile- bissel viel für Pullups, meinste nich?
Laut Datenblatt von dem Ding sind bei I2C maximal zwei Widerstände erforderlich- die Pullups. Demnach müssten die grauen Teile Kondensatoren sein...
Ich bin ziemlich sicher: da sind Spannungsteiler. Da der Sensor nur paar Milliamperchen braucht, wäre das völlig ausreichend um die Spannung auf ein passendes Niveau zu senken.

Und: die Platine (die ich hier habe) wird bei Ebay beschrieben mit:

Supply Voltage: 1.8 - 5V DC

Dann mach doch mal bitte ein Foto von der Platine, wenn du sie eh ausbaust.
Wenn da kein SMD-Regler (Transistorgehäuse) drauf ist, dann ist es sicher eine 3,3Volt-Version, egal was bei Ebay steht. Da wurde schon oft "Müll" geschrieben. Ein Link wäre doch auch schon mal was.

Und die Technik geht seltsame Wege.
Entsprechend dem Blinksketch: geht - geht nicht - geht - geht nicht. :wink:

Hm-ich hab eben noch mal genauer bei Ebay gerüsselt und: es gibt verschiedene Ausführungen (und die, die ich habe, wird teilweise mit 3.3V oder auch wie oben beschrieben).
Aber es gibt auch ne wirkliche 5V-Version, mit nem richtigen Regler drauf.

Meine ist Diese.

Bei dem Händler wird sie mit 3.6V angegeben.
Andere geben 5V an- tolle Wurst. Da traut man den Chinesen schon nicht weiter, als man sie werfen kann, und trotzdem.... :confused:

Dann glaub ich mal, dass man den nicht unbedingt mit 5V betreiben sollte- und hab jetzt den mal noch geordert.
Da ich sowieso noch Aussensensoren bauen will, kann ich den anderen dort verwursten, der Prototyp wird nämlich sowieso mit nem 3.3V proMini bestückt.
Insofern ist da nix weggeschmissen.

Der Blinksketch ist ein schlechtes Beispiel: da klappts ziemlich gut vorhersehbar. :slight_smile:

Na.....dann, hat sich das wohl geklärt.
Kannst ja später mal berichten, wie stabil es mit dem neuen Modul läuft.

Mach ich.
Bis jetzt kann ich auch über das andere mal wieder nicht klagen. :wink:

Rabenauge:
Mach ich.
Bis jetzt kann ich auch über das andere mal wieder nicht klagen. :wink:

Das ist Zufall und sicher kein stabiler Zustand.

Hallo Rabenauge,
mit Deinem ersten Link verweist Du auf alles Mögliche, aber nicht auf einen BME280 von Bosch.
Der läuft ziemlich sicher mit NUR 3,3v.

Dein zweiter Link verweist "optisch" auf einen BME280 von Bosch.
Wenn ich mir diese Platine anschaue, dann wäre ich mit den 5v hier ganz vorsichtig, und das Ding sieht nicht
nach einem BMP von Bosch aus.
Gruß und Spaß
Andreas
BMP280 - Bosch

Das kannste Dir für Deinen BMP umstricken, läuft bei mir seid Jahren fehlerfrei.

/*********************************************************************************************** 
 * Sketch:  BMP085_Text.ino
 * Author:  A. Kriwanek: http://www.kriwanek.de/arduino/wetterstation.html
 * Version: 1.00  01.09.2012/17:15
 *
 * This sketch tests a BMP085 barometric sensor. Temperature and pressure are read from the sensor
 * The mathematical computation is  done and the results will be displayed every second on the
 * serial monitor.
 *
 * Used Hardware:
 * - Sparkfun Breakout board BMP085
 * - Arduino UNO Protoboard
 * - Arduino UNO
 * 
 * My sketch is free software: Arduino BMP085_Text.ino von Andreas Kriwanek steht unter 
 * einer Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.
 *
 * My Sketch in wide parts is based on the sketch from Jim Lindblom:
 *
 * BMP085 Extended Example Code
 * by: Jim Lindblom
 * SparkFun Electronics
 * date: 1/18/11
 * license: CC BY-SA v3.0 - http://creativecommons.org/licenses/by-sa/3.0/
 *
 * Update (7/19/11): I've heard folks may be encountering issues
 * with this code, who're running an Arduino at 8MHz. If you're 
 * using an Arduino Pro 3.3V/8MHz, or the like, you may need to 
 * increase some of the delays in the bmp085ReadUP and 
 * bmp085ReadUT functions.
 * 
 * https://www.sparkfun.com/products/9694 Product page
 * http://de.wikipedia.org/wiki/Luftdruck Correction formula to sea level
 * http://www.meteo24.de/wetter/49X8157.html Weather Bad Aibling
 *
 **********************************************************************************************/

#include <Wire.h>

#define BMP085_ADDRESS 0x77        // I2C address of BMP085

const unsigned char OSS = 0;       // Oversampling Setting

// Calibration values of BMP085:
int ac1;
int ac2; 
int ac3; 
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1; 
int b2;
int mb;
int mc;
int md;

// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5; 

float temperature;
float pressure;
float pressureNN;
float pressureCorrection = 0.94028057;  // Höhe 492m ü.NN Bad Aibling. Please calculate your coeffizient
                                        // for your homes elevation!

//----------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------
void setup()
{
  Serial.begin(115200);
  Wire.begin();
  bmp085Calibration();
}

//----------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------
void loop()
{
  temperature = bmp085GetTemperature(bmp085ReadUT())/10;
  pressure = bmp085GetPressure(bmp085ReadUP())/100;
  pressureNN = pressure / pressureCorrection;
  Serial.print("Temperature: ");
  Serial.print(temperature,1);
  Serial.print(" C, Pressure: ");
  Serial.print(pressure,1);
  Serial.print(" hPa in 492m height above sea level, Pressure-NN: ");
  Serial.print(pressureNN,1);
  Serial.println(" hPa");
  delay(1000);
}

//----------------------------------------------------------------------------------------------------------
// Stores all of the bmp085's calibration values into global variables
// Calibration values are required to calculate temp and pressure
// This function should be called at the beginning of the program
void bmp085Calibration()
{
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}

//----------------------------------------------------------------------------------------------------------
// Calculate temperature given ut.
// Value returned will be in units of 0.1 deg C
short bmp085GetTemperature(unsigned int ut)
{
  long x1, x2;
  
  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;

  return ((b5 + 8)>>4);  
}

//----------------------------------------------------------------------------------------------------------
// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up)
{
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
  
  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  
  // Calculate B4
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  
  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;
    
  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;
  
  return p;
}

//----------------------------------------------------------------------------------------------------------
// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
  unsigned char data;
  
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  
  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())
    ;
    
  return Wire.read();
}

//----------------------------------------------------------------------------------------------------------
// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;
  
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  
  return (int) msb<<8 | lsb;
}

//----------------------------------------------------------------------------------------------------------
// Read the uncompensated temperature value
unsigned int bmp085ReadUT()
{
  unsigned int ut;
  
  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x2E);
  Wire.endTransmission();
  
  // Wait at least 4.5ms
  delay(5);
  
  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}

//----------------------------------------------------------------------------------------------------------
// Read the uncompensated pressure value
unsigned long bmp085ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
  
  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS<<6));
  Wire.endTransmission();
  
  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3<<OSS));
  
  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF6);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 3);
  
  // Wait for data to become available
  while(Wire.available() < 3)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  xlsb = Wire.read();
  
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
  
  return up;
}
//----------------------------------------------------------------------------------------------------------

Rabenauge:
Meine ist Diese.

Das ist genau das Teil, das ich beschrieben habe. Nur mit 11,99€ stark überteuert. Direkt beim fC für 3,04 USD.

Gruß Tommy

Sodele- ich habs versprochen:
Der neue Sensor liegt schon ne Weile hier herum.

Er hat tatsächlich nen Spannungsregler drauf, der 3.3V liefert.
Da ich grade eh den Lötkolben geschwungen hab, hab ich ihn nun gegen den vorherigen ausgetauscht: läuft auch.

Der andere, der hier weiter oben gelegentlich Probleme machte, lief im übrigen jetzt die ganze Zeit völlig problemlos. Es gab keine weiteren Aussetzer.
Fazit: kann eigentlich nur ne nicht ganz sichere Verbindung gewesen sein, denn ausser, an allen Verbindungen mal herzhaft zu wackeln, hatte ich nichts weiter unternommen.

Aber nun ist der neue drin, und da er ja die 5V sicher abkann, bleibt er das auch. Der alte wird später in einen Aussensensor wandern, die sollen sowieso nur mit 3.3V laufen, dann passt das.

Hi

Hab gestern auch mit einem BME280-5V 'gespielt' und gleich noch eine Hand voll nachgeordert (war irgendwie das erste Mal, daß ich nicht direkt eine Familien-Packung gekauft habe ...)

Werde diesen Sensor im Bad nutzen, um den Lüfter nach dem Duschen automatisch am Laufen zu halten (wenn ich noch einen 'unangenehmen Geruch'-Sensor finde, könnte ich Das auch noch brauchen ... Versuche mit MQ-2 und MQ-135 wollen noch durchgeführt werden)

MfG

PS: Danke für's Feedback und schön, daß Es jetzt klappt!