Hallo zusammen Da mich schon einige Leute nach einem funktionierenden Code für den BME280 Sensor gefragt haben, habe ich mal einen Beispiel Code zusammengestellt. Der Code ist in Bascom geschrieben. Der AVR liest die Werte des Sensors aus und gibt diese per UART aus. Wer Fragen, Anregungen oder Erweiterungen hat soll sich melden.
Hello Michael. I tried your code. It looks good, but... I have wrong pressure results. Got ~936hPa, when true pressure is about ~970hPa(I'm on 280meters above sea level, QNH=~1000hPa, taken from nearby airport.). I checked this. I got ~970hPa on other manufacturer units. Attached calculation in SMATH. I can't find error. Michał
Hast du t_fine auch mit den kalibrierdaten kompensiert ? Welchen wert bekommst du mit der pressure_32() funktion ?
T_fine is calculated well. Pressure_32 gave wrong pressure and pressure64 gave wrong pressure. Could you tell me what was your altitude when you make printscreen with 917hPa?
my altitude is 580m. I have now tested it on my bme280: BME280: 945hpa Weather forecast (Windfinder.com) @ 13:00: 943hpa I think the sensor provides the correct values, and the calculation is correct.
You are probably right... I have to try with other sensor maybe...
So I checked with BMP280. ("P"!)(got today from China). I haven't time to read all datasheet, but it seems to be very similar to BME280. Pressure is to small as well. I'm really confused...
Found it !! Found it!! Line: T_fine = Temp() This is wrong. You calculate "t_fine" in this function, then(still inside function) you calculate "Temp" and when returning from function variable "Temp" is written to "T_fine".( T_fine = Temp() ) At this moment "t_fine" is wrong and you use it for pressure calculation. Remember t_fine is not temperature. It is only variable about "128000". Check BMP280 datasheet on page 23. Time for beer... Michał P.S. Don't check pressure on Windfinder. Check with some known nearby weather station, with known altitude.
Besten Dank lotnick ! Ich habe den Code soweit angepasst. Ich hoffe es ist so richtig.
Hallo Michael, leider kenne ich mich in Bascom nicht besonders gut aus. Könntest du mir bitte folgenden Code-Teil erklären? Dig_h5 = Wert_array(6) Shift Dig_h5 , Left , 4 X = Wert_array(5) Shift Dig_h5 , Right , 4 Ich verstehe nicht, was sich ändern soll, wenn ich einen 8-bit-Integer in einem 16-bit-Integer zuerst 4 nach links und dann wieder 4 nach rechts shifte? Vielen Dank!
Roman schrieb: > Ich verstehe nicht, was sich ändern soll, wenn ich einen 8-bit-Integer > in einem 16-bit-Integer zuerst 4 nach links und dann wieder 4 nach > rechts shifte? Der Wert bleibt in Bewegung und nimmt nicht zu. ;-) Nein, im Ernst: Das ist bestimmt ein Flüchtigkeitsfehler im Programm, denn er holt sich in der Zeile drüber den 5. Wert aus dem Array und weist ihn x zu, "macht" dann aber nicht an X "herum", sondern noch einmal der Variable "Dig_h5" MfG Paul
Hallo Roman Besten Dank für deinen Hinweis. Der Grund liegt darin, dass bei dig_H4 und dig_H5 nur die bits von 0-11 benötigt werden, und die bits 12-15 gelöscht werden sollen, deshalb die Schieberei. Ich kann dir jetzt aber auf die schnelle garnicht sagen ob der code so überhaupt richtig ist, muss das ganze einmal in einer ruhigen Minuten genau anschauen.
also wie vermutet war da wirklich was falsch an der Schieberei... Die Kalibrierwerte Dig_h4 und Dig_h5 wurden somit falsch zusammengesetzt. Bei meinem Sensor hat sich allerdings der Wert Dig_h4 nicht verändert, nur Dig_h5 war vorher 7 und jetzt 0. Der effektive Luftfeuchtigkeitswert hat sich letztendlich bei mir nicht merklich verändert. Anbei findet Ihr die korrigierte Version.
Hallo Michael, kann es sein das in der Testdaten TXT die Feuchtigkeitswerte noch nicht durch 1,024 geteilt sind? Wenn man die Funktionen aus der Original Lib nimmt, egal ob die 32Bit oder in Double gerechnet, sind die Feuchtigkeitswerte (wenn man ihre Testdaten eingibt) genau um den Faktor 1,024 kleiner. Grüße Ralf
Hallo zusammen Kann ich mit dem Code für den BME280 auch den BMP280 korrekt auslesen? Kann die Höhe korrekt berechnet werden, mit dem BMP180 hatte ich immer Probleme, denn wenn die Temperatur änderte, änderte sich auch die Höhe (???). Danke für die Hilfe! Gruss Thomas
Danke erstmal für deinen Code, der hat mir sehr weitergeholfen. Ich probiere auch seit ein paar Tagen meine China Erungenschaft in Form von BME280 Breakoutboards aus. Ich habe das ganze dann noch mit einem MAX7219 Displayplatinchen aus China verheiratet, damit ich ein autarkes Barometer für eine Infotafel bekomme. Soweit so gut. Zwei Probleme trten bei mir auf. 1. Ist der Barometrische Druck ist um ca. 45hPa zu niedrig. 2. Ich bekomme keine Feuchtigkeitswerte ausgelesen. Gruß, Markus
Thomas R. schrieb: > Kann ich mit dem Code für den BME280 auch den BMP280 > korrekt auslesen? Grundsätzlich ist der Unterschied vom BMP zum BME, dass der BME noch zusätzlich die Luftfeuchtigkeit messen kann. Ich habe beide Datenblätter kurz überflogen, die I2C Adresse ist die selbe, und die Temperatur- und Luftdruckregister sind auch die selben, sowie die Berechnung der Messwerte. Trotzdem wird der Code nicht 1:1 mit dem BMP funktionieren, da bei der Sub Setup_bme280() unter anderem die Filter- und Kalibrierwerte für die Luftfeuchtigkeit geschrieben und gelesen werden. Dementsprechend sind trotzdem ein paar Anpassungen notwendig. Thomas R. schrieb: > Kann die Höhe korrekt berechnet werden, mit dem BMP180 > hatte ich immer Probleme, denn wenn die Temperatur > änderte, änderte sich auch die Höhe (???). Ja ist kein Problem, in der Luftdruckberechnung wird der Luftdruck mit der Temperatur kompensiert. Funktioniert übrigens mit dem BMP180 auch einwandfrei, wenn die Temperaturkompensation nach Datenblatt durchgeführt wird. Markus schrieb: > 1. Ist der Barometrische Druck ist um ca. 45hPa zu niedrig. Besten Dank für deinen Hinweis. Mit was hast du den Luftdruck verglichen ? Markus schrieb: > 2. Ich bekomme keine Feuchtigkeitswerte ausgelesen. Entweder ist das Kontrollregister falsch gesetzt (Osrs_h = 0, Datenblatt ab Seite 25), oder etwas am Takt des AVR stimmt nicht.
Ich denke die Druckdifferenz kommt von der fehlenden Korrektur zum Meeresspiegel. Wir messen aber den Absolutdruck am Einsatzort, also in der Höhe. Der Meterologische wird aber auf 0m referenziert. Warum die Feuchte nicht ausgelesn wird kann ich mir nicht erklären. Ich habe deinen Code 1:1 übernommen, bei dir geht es ja. Da ich die Feuchte nicht brauche wäre es egal, hätte es aber trotzdem gerne verstanden. Gruß, Markus
Also der Luftfeuchte Roh-Wert (Uh) wird ja bei dir korrekt ausgelesen, soweit gut. Aber die Kalibrierwerte h2 bis h6 sind alle 0, dadurch ergibt sich in der Berechnung der Luftfeuchte schlussendlich auch immer 0. In der Sub Setup_bme280() werden alle 24 Kalibrierwerte in einem Rutsch ausgelesen. Die Software i2c Schnittstelle in Bascom unterschtütz soweit ich weis kein Clock Stretching, ist der AVR zu schnell, oder der Sensor zu langsam, ist die i2c komunikation nicht mehr synchron -> es ergibt sich irgend ein misst, oder eben halt 0. Prüfe nochmals ob du den richtigen Quarz hast, wie im Programm eingestellt. Überprüfe nochmals die Fuses ob evtl noch der interne aktiviert ist, der kann unter umständen ca. +/- 10% Abweichung haben.
CONFIG I2CDELAY = value Remarks value A numeric value in the range from 1 to 255. A higher value means a slower I2C clock. You may use a value of 0 too but it will result in a value of 256. For the I2C routines the clock rate is calculated depending on the used crystal. In order to make it work for all I2C devices the slow mode is used. When you have faster I2C devices you can specify a low value. By default a value of 5 is used. This will give a 200 kHZ clock. When you specify 10, 10 uS will be used resulting in a 100 KHz clock. When you use a very low crystal frequency, it is not possible to work with high clock frequencies. Nur so nebenbei erwähnt, ein Auszug aus der bascom-Hilfe
An der Geschwindigkeit liegt es nicht, hab es grad mit einem 4Mhz Quarz und damit halbierter Baudrate versucht. Das schaut identisch aus.
Jetzt habe ich mein Problem erkannt. Ich habe einen BMP280 statt eines BME280 geordert. Dieser ist deutlich günstiger hat dafür aber keine rH Messung an Board. Da ich nur den Druck brauche und für Feuchtigkeit sowieso einen besseren Sensor benutze ist es kein Problem für mich.
So habe das Testprogramm noch ein wenig erweitert: 1. In der Startup Info wird unter anderem auch die Chip ID angezeigt, somit sieht man auch ob man wirklich einen BME280 hat ;-) 2. Höhe über Meer wird nach internationaler Höhenformel berechnet. Dies ist jedoch mit Vorsicht zu geniessen, da ein Mittelwert von 1013hPa und einer Temperatur von 15°C auf Meereshöhe angenommen wird. Je nach Wetterlage kann der Wert deshalb gut +/-50m abweichen. 3. Variometer Test Funktion eingebaut. Beispiel für die Anwendung in einem Segelflugzeug.
Moin. Ich habe mit dem Code V1.2 (v1.3 brauche ich nicht weil ich auch keine Höhe benötige) eine Luftfeuchtigkeit z.z. Abends von 102% was ja eigentlich nicht geht....Nur wenn die Luft 100% hat und es warm ist und Wasser noch verdunstet kann der Wert über 100% liegen. Da wir hier in Berlin z. Z. 4,5 Grad und 998hpa haben frage ich mich ob der Wert von 102% stimmt.... Noch jemand solch einen Wert? Grüße
Sungod schrieb: > Ich habe mit dem Code V1.2 (v1.3 brauche ich nicht weil ich auch keine > Höhe benötige) eine Luftfeuchtigkeit z.z. Abends von 102% was ja > eigentlich nicht geht.... Klar geht das. Schnippe mal mit dem Finger und wenn du dabei eine Nebelwolke erzeugst, war das mit den 102% richtig ;-) Kalibriere doch mal z.B. gegen gesättigter Kochsalzlösung http://nvlpubs.nist.gov/nistpubs/jres/81A/jresv81An1p89_A1b.pdf
Wie soll ich den Kalibrieren? Und die Frage war ja auch ob schonmal jemand in der letzten Zeit (jetzt Herbst) mal über 100% hatte?
Kanst du mal ein Printscreen der seriellen Datenausgabe machen ? Also mit kalibrierwerte, Einstellungen, usw ?
Moin.... Hier die Daten der Ser. Ausgabe BME280 Test Programm V1.2 (c) 2015 by Michael Lehmann Kalibrierwerte: Dig_t1: 28295 Dig_t2: 26163 Dig_t3: 50 Dig_p1: 38494 Dig_p2: -10836 Dig_p3: 3024 Dig_p4: 10935 Dig_p5: -63 Dig_p6: -7 Dig_p7: 9900 Dig_p8: -10230 Dig_p9: 4285 Dig_h1: 75 Dig_h2: 354 Dig_h3: 0 Dig_h4: 338 Dig_h5: 0 Dig_h6: 30 Ut:529279 Up:259315 Uh:29741 Temperatur: 23.88 Grad Luftdruck 64bit: 00.000hPa Luftdruck 32bit: 995.06hPa Luftfeuchtigkeit: 45.476% LF Ut:529309 Up:259324 Uh:29744 Temperatur: 23.89 Grad Luftdruck 64bit: 994.681hPa Luftdruck 32bit: 995.07hPa Luftfeuchtigkeit: 45.489% LF Ut:529322 Up:259328 Uh:29743 Temperatur: 23.89 Grad Luftdruck 64bit: 994.682hPa Luftdruck 32bit: 995.06hPa Luftfeuchtigkeit: 45.489% LF Ich hänge den Sensor mal gleich raus müsste dann 102% anzeigen
sieht soweit alles normal aus.. was ich mir vorstellen könnte ist, wenn du mit dem Sensor nach draußen gehst, sich der Sensor dann auf die 5°C abkühlt, und nun wieder direkt in die warme Wohnung mit 23°C 50% gehst, ist der Taupunkt bei ca. 12°C. Da der Sensor nun aber kälter ist, bildet sich Kondenswasser am Gehäuse, und Du hast einen Wert über 100%.
Hallo Der Sensor hängt schon seid einen.halben Jahr draußen. In so einem Gehäuse wie auch dem Bild. Hab ihn erstmal getauscht...Und der neue Sensor zeigt nun 88% an. Denke das vielleicht die Platine Feuchtigkeit gezogen hat und daher er immer solch hohe Werte angezeigt hat. Ich warte jetzt mal ab ob in den nächsten Tagen der neue Sensor auch erhöhte Werte anzeigt Achso..... Das der Controller mit 14,...MHZ läuft wird ja darauf keinen Einfluss haben....Oder?
:
Bearbeitet durch User
Guten morgen... Heute morgen war wieder 101% War aber auch sehr feucht heute Nacht...
Vielen Dank für den Code. Ich habe diesen für meine LCD-Ausgabe umgestellt. Die rel. Feuchtigkeit ist stets 0% Der Wert vom BME280 ist auch immer konstant. Ich verwende eine kleine China-Platine http://www.ebay.de/itm/401181867055?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT Gibt es unterschiedliche BME280 ?? W.
Hallo Michael, zuerst einmal herzlichen Dank für das Einstellen Deines Codes. Ich habe mir erlaubt, Deinen Code für einen 1-Wire-Slave mit einem ATtiny85 zu "missbrauchen" ;-) Ich hoffe, es ist o.k. Wichtig: Da der ATtiny wegen dem 1-Wire-Bus mit 5V betrieben werden sollte, muss man je nach BME-Breakout evtl. einen Levelkonverter zwischen ATtiny und BME einbauen! Wie diese Slave angesteuert werden, kann man im Bascom-Forum nachlesen: http://www.bascom-forum.de/showthread.php?76-1-Wire-Slave-Baukasten-V-2 Viel Spaß, RoBue
RoBue schrieb: > Wie diese Slave angesteuert werden, kann man im Bascom-Forum nachlesen: > http://www.bascom-forum.de/showthread.php?76-1-Wire-Slave-Baukasten-V-2 Der Link stimmt leider nicht mehr. Forum scheint geschlossen worden zu sein. Artikel steht nun in http://bascomforum.de/index.php?thread/361-1-wire-slave-baukasten-v-2/ LG RoBue
Wie kommt es im Quellcode zu "Const Bme280_adress = &HEC" ? Laut Datenblatt ist die I2C Adresse je nach SDO &H76/77 ?!
Beides ist richtig. ... aber aus einem mir nicht näher bekannten Grund muss &HEC angegeben werden, da irgendwo ein shift_r für eine Division durch zwei sorgt und dann kommt halt &H76 raus. Joe
Joe schrieb: > für eine Division durch zwei sorgt und > dann kommt halt &H76 raus. Gut beobachtet. Der konkrete Blick aufs Protokoll sorgt dann für endgültige Klarheit.
Obige Quellcodes enthalten einen bösen Fehler in der I2C-Konfiguration: SDA/SCL befinden sich beim 328er auf PortC.4 und 5!
Die PINs können in der Soft-Konfiguration nach Belieben festgelegt werden.
Joe schrieb: > Die PINs können in der Soft-Konfiguration nach Belieben festgelegt > werden. Möglicherweise ist mir als Bascom-Anfänger noch ein Detail entgangen? Compiliert mit I2C auf PortC0/1 so wie im Quellcode angegeben funktioniert das Programm jedoch nicht richtig und die Sensordaten sind Müll. Ich verwende Bascom 2.0.8.0 und $regfile="m328pbdef.dat" (neuerer PB-Typ).
Joe schrieb: > Siehe Zeile ~25. Ja danke, alles klar. I2C in Software. Schön wenns funktioniert. Geht bei mir über C0/1 trotzdem nicht, über die I2C Hardware-Pins C4/5 hingegen blendend.
In manchen .def-Dateien für einige Controller fehlt bei BASCOM die Festlegung der Ports als Input/Output, wenn I2C-Ports configuriert werden. Insbesondere der Output-Port muss dann zusätzlich als solcher configuriert werden. Versuchs mal.
Anbei eine hühnerfutterfreie Schaltung (Abb. 1) mit weiteren Hinweisen für die Firmware BME280.hex (Ver. 1.3) von Michael Lehmann hier aus diesem Thread. Danke dafür. Der ATMega 328 gibt die Sensordaten des BME 280 bzw. der Platine GYBME280 am seriellen Ausgang entweder zur Anzeige durch ein Terminalprogramm oder zur Weiterverarbeitung aus. Dazu muss der RxD Anschluss eines TTL/Seriell bzw. TTL/USB Wandlers am Anschluss TxD angeschlossen werden. Die 2. Abbildung zeigt eine noch nicht ganz fertige Darstellungsmöglichkeit für die Sensordaten. Die Programmierung erfolgte durch das Programm „Profilab“. Dabei war die gemessene Temperatur ca. 3 Grad C zu hoch und die gemessene Feuchte um ca. 7 % zu niedrig. Wurde im Profilab-Programm entsprechend korrigiert. Euer Messtechniker
Moin, Habe dankend den Bascomcode übernommen für nen Datenlogger/Wetterstation (was sonst). Echt viel Arbeit die drinsteckt und bestimmt so manchem geholfen hat !!! Nach einer Zeit X fängt der Sensor/meine Schaltung/mein Programm an sinnlose Werte zu liefern, aus -3 grad werden Nachts dann für 2 Stunden +37 grad, und dann stimmt wieder alles. Machmal auch die Feuchte oder der Luftdruck die "hängen bleiben". Ich habe mich zugegeben noch nicht mit den möglichen Modes etc. auseinandergesetzt sondern den Code wie gesagt zu 99% übernommen. Ich lese den BME280 einmal die Sekunde aus, das sollte ja kein Problem sein. Habe testweise mal reingeschrieben, daß alle 60min der BME neu initialisert wird, macht keinen Unterschied im großen und ganzen. Wenn ich den Controller resette, dann stimmen die Werte wieder. Insgesamt werden noch ca 6 weitere Werte anderer Sensoren geloggt, die passen immer, sonst hätte ich nen fehler im Programm vermutet. Habe auch Errors auf dem Bus mitgeloggt etc.... Dasselbe macht der Sensor auch wenn ich ihn in Testumgebung bei Raumtemperatur nur am Breadboard und mit minimalem Code fürs LCD betreibe, 1Hz auslesen und anzeigen, irgendwann zeigt er 37,xx grad..... Jemand ne Idee ?
Ich habe den Code von Michael auch (etwas umgebaut) vor längerer Zeit verwendet. Hat auch funktioniert. Nach einer kleinen Änderung geht nur noch die Temperatur korrekt. Bei der Durchsicht von Michaels Code habe ich noch einen Fehler gefunden (oder etwas nicht verstanden?): In der Setup_bme280 Routine werden ab &HE1 8 Byte geladen. Muesste Dig_h4 = Wert_array(4) Shift Dig_h4 , Left , 4 X = Wert_array(5) X = X And &HF Dig_h4 = Dig_h4 + X Dig_h5 = Wert_array(6) Shift Dig_h5 , Left , 4 X = Wert_array(5) Shift X , Right , 4 Dig_h5 = Dig_h5 + X Dig_h6 = Wert_array(7) nicht heissen: Dig_h4 = Wert_array(4) Shift Dig_h4 , Left , 4 X = Wert_array(5) X = X And &HF Dig_h4 = Dig_h4 + X Dig_h5 = Wert_array(7) Shift Dig_h5 , Left , 4 X = Wert_array(6) Shift X , Right , 4 Dig_h5 = Dig_h5 + X Dig_h6 = Wert_array(8) ??? falsche Indices) Guenter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.