Hallo liebes Forum,
ich bin mal wieder zu blöd...
Seit Montag versuche ich nun, dem BME680 von Bosch (Temp, Hyg, Druck und Gas) per 3-Wire-SPI Daten zu entlocken...soweit geht das auch.
Aber wenn ich die Rohdaten, also den Sensorwert (hier zunächst nur die Temperatur) mit den im Sensor gespeicherten Kalibrierwerten, zu einem Temperaturwert zu verrechen versuche, kommt nur Käse dabei heraus.
Es kommen sich änderende Werte für den Temp-ADC rüber, die Kalibrierwerte sind auch da und immer gleich (muss ja auch), plausibel sind die auch, hoffe ich.
Aber die Formel, nach der die Werte verrechnet werden sollen, bekomme ich nicht zum Laufen (Datenblatt Seite 17, Link unten).
Am Ende habe ich immer 64°C....was blöd ist, weil das überhaupt nicht stimmt und eigentlich zwei Nachkommawerte dabei sein sollten (auch, wenn das ja eigentlich sinnlos ist von wegen der Sensorgenauigkeit, ist aber so).
Eigentlich müsste sowas wie z.B. 2356 herauskommen, was dann für 23,56°C stehen würde. Außerdem ist die "64" festgenagelt.
Das ist natürlich ein Problem mit den Variablen bzw. deren Zahlenformaten und der ganzen Shifterei mit "signed" und "unsigned" usw., das dabei nötig ist.
Aber es kann doch nicht wahr sein, dass ich das nicht hinbekomme....uarg....
Ich gehe genau nach Datenblatt vor, meinte ich eigentlich...
Hat hier einer schon mal den BME680 verarbeitet?
Die LCD-Texte unten im Code sind für mich nur zur Kontrolle, die eigentliche "Formel" geht von 196...218.
Datenblatt ist hier: bosch-sensortec.com/media/bosc…eets/bst-bme680-ds001.pdf
Alles anzeigen
ich bin mal wieder zu blöd...
Seit Montag versuche ich nun, dem BME680 von Bosch (Temp, Hyg, Druck und Gas) per 3-Wire-SPI Daten zu entlocken...soweit geht das auch.
Aber wenn ich die Rohdaten, also den Sensorwert (hier zunächst nur die Temperatur) mit den im Sensor gespeicherten Kalibrierwerten, zu einem Temperaturwert zu verrechen versuche, kommt nur Käse dabei heraus.
Es kommen sich änderende Werte für den Temp-ADC rüber, die Kalibrierwerte sind auch da und immer gleich (muss ja auch), plausibel sind die auch, hoffe ich.
Aber die Formel, nach der die Werte verrechnet werden sollen, bekomme ich nicht zum Laufen (Datenblatt Seite 17, Link unten).
Am Ende habe ich immer 64°C....was blöd ist, weil das überhaupt nicht stimmt und eigentlich zwei Nachkommawerte dabei sein sollten (auch, wenn das ja eigentlich sinnlos ist von wegen der Sensorgenauigkeit, ist aber so).
Eigentlich müsste sowas wie z.B. 2356 herauskommen, was dann für 23,56°C stehen würde. Außerdem ist die "64" festgenagelt.
Das ist natürlich ein Problem mit den Variablen bzw. deren Zahlenformaten und der ganzen Shifterei mit "signed" und "unsigned" usw., das dabei nötig ist.
Aber es kann doch nicht wahr sein, dass ich das nicht hinbekomme....uarg....
Ich gehe genau nach Datenblatt vor, meinte ich eigentlich...
Hat hier einer schon mal den BME680 verarbeitet?
Die LCD-Texte unten im Code sind für mich nur zur Kontrolle, die eigentliche "Formel" geht von 196...218.
Datenblatt ist hier: bosch-sensortec.com/media/bosc…eets/bst-bme680-ds001.pdf
Quellcode
- Sub Hygro_1_ini_spi_aussenluft
- Dim Status As Byte
- Dim Par_t1 As Word
- Dim Par_t2 As Word
- Dim Par_t3 As Byte
- Dim Var_1 As Long
- Dim Var_2 As Long
- Dim Var_3 As Long
- Local X As Long
- Dim Temp_adc As Dword
- Dim T_comp As Long
- Dim T_fine As Long
- 'Spi Commands senden
- '--------------------------------
- 'Memory Map Page...
- ' Bit 7: write = "0", read = "1"
- Adresse = &B01110011 'Memory Map Page
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Adresse = &B00000000 '0 ins Register, damit Memory Map page "0" aktiviert wird...
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Cs_hyg1 = 1
- '3-wire-Mode init...
- Adresse = &B01110101 ' 3-wire mode
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Adresse = 1 '1 ins Register, damit der 3wire aktiviert wird...
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Cs_hyg1 = 1
- 'who_am_I einlesen...
- Adresse = &B11010000 'who am I
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Who_am_i , 1 , 8 , 10
- Cs_hyg1 = 1
- 'Memory Map Page auf "1"
- Adresse = &B01110011 ' Memory Map page in Bit4
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Adresse = &B00010000 '1 in Bit4 ins Register, damit Memory Map page "1" aktiviert wird...
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Cs_hyg1 = 1
- 'Messung starten (Forced Mode auf H74)
- Adresse = &B01110100 ' Force Sample
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Adresse = &B10010001 'Oversampling "100" - Hum=8x, "100" - Temperatur=8x und "01" ins Register, für "Forced Mode" oder "sample probe"
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Cs_hyg1 = 1
- 'Waitms 5
- 'Messung fertig? Statusregister lesen...
- Status_lesen:
- Adresse = &B10011101 ' Statusregister: Messung fertig?
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Shiftin Soutp_hyg1 , Clk_hyg1 , Status , 1 , 8 , 10
- Cs_hyg1 = 1
- If Status.5 = 0 Then
- Waitms 1
- Goto Status_lesen
- End If
- '*****************************************************************************
- '******************* ****************
- '******************* Beginn der eigentlichen Datenauslesung ****************
- '******************* ****************
- '*****************************************************************************
- '*****************************************************************************
- '******************* Temperatur einlesen...MSB first! ****************
- '*****************************************************************************
- Adresse = &B10100010
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Msb , 1 , 8 , 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Lsb , 1 , 8 , 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Xlsb , 1 , 8 , 10
- Cs_hyg1 = 1
- Temp_adc = Msb
- Shift Temp_adc , Left , 8
- Temp_adc = Temp_adc + Lsb
- Shift Temp_adc , Left , 8
- Temp_adc = Temp_adc + Xlsb
- Shift Temp_adc , Right , 4
- Call Lcd_clear(black)
- Call Lcd_text( "Whois: " + Str(who_am_i) + " - " + "H" + Hex(who_am_i) , 3 , 1 , 2)
- Call Lcd_text( "MSB: " + Str(msb) , 3 , 13 , 2)
- Call Lcd_text( "LSB: " + Str(lsb) , 3 , 25 , 2)
- Call Lcd_text( "XLSB:" + Str(xlsb) , 3 , 37 , 2)
- Call Lcd_text( "T_ADC: " + Str(temp_adc) , 3 , 49 , 2)
- Call Lcd_show()
- Wait 10
- '**************************************************************
- '************* Korrekturwerte einlesen... *******************
- '**************************************************************
- '********************** Par_t1 ******************************
- Adresse = &B11101001
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Lsb , 1 , 8 , 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Msb , 1 , 8 , 10
- Cs_hyg1 = 1
- Par_t1 = Makeint(lsb , Msb)
- '********************** Par_t2und Par_t3 ******************************
- Adresse = &B10001010
- Clk_hyg1 = 1
- Cs_hyg1 = 0
- Shiftout Soutp_hyg1 , Clk_hyg1 , Adresse , 0 , 8 , 10
- Waitus 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Lsb , 1 , 8 , 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Msb , 1 , 8 , 10
- Shiftin Sinp_hyg1 , Clk_hyg1 , Par_t3 , 1 , 8 , 10
- Cs_hyg1 = 1
- Par_t2 = Makeint(lsb , Msb)
- '********************* Temp-Berechnung nach Sensor-Formel *******************
- Call Lcd_clear(black)
- Call Lcd_text( "Temp_adc:" + Str(temp_adc) , 3 , 5 , 2)
- Call Lcd_text( "Par_T1: " + Str(par_t1) , 3 , 15 , 2)
- Call Lcd_text( "Par_T2: " + Str(par_t2) , 3 , 30 , 2)
- Call Lcd_text( "Par_T3: " + Str(par_t3) , 3 , 45 , 2)
- Call Lcd_show()
- Wait 3
- Var_1 = Temp_adc
- Shift Var_1 , Right , 3 , Signed
- X = Par_t1
- Shift X , Left , 1 , Signed
- Var_1 = Var_1 - X
- Var_2 = Var_1 * Par_t2
- Shift Var_2 , Right , 11 , Signed
- X = Var_1
- Shift X , Right , 1 , Signed
- Var_3 = X * X
- Shift Var_3 , Right , 12 , Signed
- X = Par_t3
- Shift X , Left , 4 , Signed
- Var_3 = Var_3 * X
- Shift Var_3 , Right , 14 , Signed
- T_fine = Var_2 + Var_3
- T_comp = T_fine * 5
- T_comp = T_comp + 128
- Shift T_comp , Right , 8 , Signed
- Temp_aussenluft_hyg = T_comp
- Call Lcd_clear(black)
- Call Lcd_text( "Var_1: " + Str(var_1) , 3 , 1 , 2)
- Call Lcd_text( "Var_2: " + Str(var_2) , 3 , 14 , 2)
- Call Lcd_text( "Var_3: " + Str(var_3) , 3 , 27 , 2)
- Call Lcd_text( "T_fine:" + Str(t_fine) , 3 , 40 , 2)
- Call Lcd_text( "Temp: " + Str(t_comp) , 3 , 51 , 2)
- Call Lcd_show()
- Wait 11
- End Sub