'Routine to read the SHT11 Humidity sensor chip 'Orginal By Stuart Leslie 'Changes and Extensions by Kristina Wetzke 'Uses BascomAVR 'Variablen Dim Messergebnis As Word Dim Command As Byte Dim Tt As String * 20 Dim Ff As String * 20 Dim Calc1 As Single Dim Calc2 As Single Dim RH_lin As Single Dim RH_komp As Single Dim Tempc As Single Dim Tempf As Single Dim CRS As Single 'Konstanten 'Konstanten für die Elimination der Nichtlinerarität des Feuchtesensoren 'vorausgesetzt wird eine 12bit Sensorausgabe für die relative Feuchte 'Datenblatt 1.1.1 Const C1 = -4 Const C2 = 0.648 Const C3 = -0.00072 'Konstanten für die Berücksichtigung der Temperaturkoeffizienten 'wichtig für Temperaturen, die deutlich von 25°C abweichen 'Datenblatt 1.1.1 Const T1 = 0.01 Const T2 = 0.00128 'T1C und T1F für die Umrechnung des 14bit-Ausgangssignals in Temperaturwert 'Datenblatt 1.1.2 Const T1c = 0.04 Const T1f = 0.072 'Umbennung Sck Alias Portb.0 Dataout Alias Portb.1 Datain Alias Pinb.1 'Unterprogramme Declare Sub Getit() Declare Sub connection_reset() Declare Sub transmission_start() Declare Sub temperatur_berechnen() Declare Sub feuchte_linear_berechnen() Declare Sub feuchte_kompensiert_berechnen() Declare Sub statusregister() Declare Sub befehl_senden() '----------------------------------------------------------------------------------- 'Hauptprogramm Command=&00011110 Call transmission_start Call befehl_senden Call satusregister Do Call connection_reset Command = &B00000011 'Messe Temperatur Call befehl_senden Waitms 70 '12-Bit-Messung dauert mindestens 55ms - warten bis Messung beendet Call Getit Call temperatur_berechnen Call connection_reset Command = &B00000101 'Messe Feuchte Call befehl_senden Waitms 20 '8-Bit-Messung dauert mindestens 11ms - warten bis Messung beendet Call Getit Call feuchte_linear_berechnen If tempc <= 5 Call feuchte_kompensiert_berechnen Else If tempc >= 45 Call feuchte_kompensiert_berechnen Else RH_komp = RH_lin End If End if Ff = Fusing(RH_komp , "##.##") Print Tt ; " " ; Ff Wait 1 Loop '----------------------------------------------------------------------------------- 'Unterprogramm Getit Sub Getit Local Datavalue As Word Local Databyte As Byte Config Pinb.1 = Input Shiftin Datain , Sck , Databyte , 1 'get the MSB Datavalue = Databyte Config Datain = Output Reset Dataout Set Sck Reset Sck Config Datain = Input Shiftin Datain , Sck , Databyte , 1 'get the LSB Shift Datavalue , Left , 8 Datavalue = Datavalue Or Databyte Dataword = Datavalue Config Datain = Output Set Dataout Set Sck Reset Sck End Sub '----------------------------------------------------------------------------------- 'Unterprogramm connection_reset 'Connection Reset Sequenz 'Datenblatt 2.2.4 Sub connection_reset Config datain = output Set Dataout For Ctr = 1 To 15 Set Sck Waitus 2 Reset Sck Waitus 2 Next Ctr Call transmission_start End Sub '----------------------------------------------------------------------------------- 'Unterprogramm transmission_start 'start with "transmission start – Befehlssequenz 'Datenblatt 2.2.3 Sub transmission_start Config datain = output Set Sck Reset Dataout Reset Sck Set Sck Set Dataout Reset Sck End Sub '----------------------------------------------------------------------------------- 'Unterprogramm temperatur_berechnen Sub temperatur_berechnen Tempf = T1f * Dataword Tempf = Tempf - 40 Tempc = T1c * Dataword Tempc = Tempc - 40 Tt = Fusing(tempc , "###.##") End Sub '----------------------------------------------------------------------------------- 'Unterprogramm feuchte_linear_berechnen Sub feuchte_linear_berechnen Calc1 = C2 * Dataword Calc2 = Dataword * Dataword Calc2 = C3 * Calc2 Calc1 = Calc1 + C1 Rhlinear = Calc1 + Calc2 End Sub '----------------------------------------------------------------------------------- 'Unterprogramm feuchte_kompensiert_berechnen Sub feuchte_kompensiert_berechnen Calc = T2 * Dataword Calc = Calc + T1c Calc2 = Tempc - 25 Calc = Calc2 * Calc RH_komp = Calc + RH_lin End Sub '----------------------------------------------------------------------------------- 'Unterprogramm statusregister Sub statusregister Call transmission_start Command = &B00000110 Call befehl_senden Call transmission_start Command = &B00000001 'Switch to 8/12 bit resolution Call befehl_senden End Sub '----------------------------------------------------------------------------------- 'Unterprogramm befehl_senden Sub befehl_senden Config Datain = Output Shiftout Dataout , Sck , Command , 1 Reset Dataout Reset Sck Set Sck Bitwait Datain , Reset 'Wait ACK Reset Sck End Sub '----------------------------------------------------------------------------------- End