burst read for measurements

This commit is contained in:
clinton 2016-09-29 15:25:11 +10:00
parent f4c803b036
commit 2d4affa09b
1 changed files with 38 additions and 41 deletions

View File

@ -43,16 +43,17 @@ const (
CAL_H5_MSB_REG = 0xE6 CAL_H5_MSB_REG = 0xE6
CAL_H6_REG = 0xE7 CAL_H6_REG = 0xE7
TMP_MSB_REG = 0xFA MEASUREMENT_START_REG = 0xF7
TMP_LSB_REG = 0xFB PRESSURE_MSB_IDX = 0
TMP_XLSB_REG = 0xFC PRESSURE_LSB_IDX = 1
PRESSURE_XLSB_IDX = 2
PRESSURE_MSB_REG = 0xF7 TMP_MSB_IDX = 3
PRESSURE_LSB_REG = 0xF8 TMP_LSB_IDX = 4
PRESSURE_XLSB_REG = 0xF9 TMP_XLSB_IDX = 5
HUMIDITY_MSB_REG = 0xFD HUMIDITY_MSB_IDX = 6
HUMIDITY_LSB_REG = 0xFE HUMIDITY_LSB_IDX = 7
CTRL_MEAS_REG = 0xF4 CTRL_MEAS_REG = 0xF4
CONFIG_REG = 0xF5 CONFIG_REG = 0xF5
@ -320,27 +321,27 @@ func New(bus embd.I2CBus, addr byte) (*BME280, error) {
return s, err return s, err
} }
func (s *BME280) fineT() (int32, error) { func (s *BME280) fineT(d []byte) int32 {
adcT, err := readInt24(TMP_XLSB_REG, TMP_LSB_REG, TMP_MSB_REG, s.Bus, s.Addr) adcT := int32((uint32(d[TMP_MSB_IDX])<<12)|(uint32(d[TMP_LSB_IDX])<<4)) | ((int32(d[TMP_XLSB_IDX]) >> 4) & 0x0F)
if err != nil {
return 0, err
}
var1 := (((adcT >> 3) - (int32(s.Cal.T1) << 1)) * (int32(s.Cal.T2))) >> 11 var1 := (((adcT >> 3) - (int32(s.Cal.T1) << 1)) * (int32(s.Cal.T2))) >> 11
var2 := (((((adcT >> 4) - (int32(s.Cal.T1))) * ((adcT >> 4) - (int32(s.Cal.T1)))) >> 12) * (int32(s.Cal.T3))) >> 14 var2 := (((((adcT >> 4) - (int32(s.Cal.T1))) * ((adcT >> 4) - (int32(s.Cal.T1)))) >> 12) * (int32(s.Cal.T3))) >> 14
return (var1 + var2), nil return (var1 + var2)
} }
// Humdity returns the relative humidity. Output value of "46.332" represents 46.332 %rH. // Reads all measurements from the sensor. Call Humidity, Pressure or Temperature to retrieve calibrated readings.
func (s *BME280) Humidity() (float64, error) { func (s *BME280) Measurements() ([]byte, error) {
fineT, err := s.fineT() buf := make([]byte, 8)
if err != nil { err := s.Bus.ReadFromReg(s.Addr, MEASUREMENT_START_REG, buf)
return 0, err
} return buf, err
adcH, err := readUInt16(HUMIDITY_LSB_REG, HUMIDITY_MSB_REG, s.Bus, s.Addr) }
if err != nil {
return 0, err // Humdity returns the relative humidity from the supplied measurements. Output value of "46.332" represents 46.332 %rH.
} func (s *BME280) Humidity(d []byte) float64 {
fineT := s.fineT(d)
adcH := (uint16(d[HUMIDITY_MSB_IDX]) << 8) | uint16(d[HUMIDITY_LSB_IDX])
varH := float64(fineT) - 76800.0 varH := float64(fineT) - 76800.0
varH = (float64(adcH) - (s.Cal.H4*64.0 + s.Cal.H5/16384.0*varH)) * varH = (float64(adcH) - (s.Cal.H4*64.0 + s.Cal.H5/16384.0*varH)) *
@ -352,20 +353,16 @@ func (s *BME280) Humidity() (float64, error) {
varH = 0.0 varH = 0.0
} }
return varH, nil return varH
} }
// Returns the pressure in Pascals. A value of "96386.2" equals 963.862 hPa. // Returns the pressure in Pascals from the supplied measurements. A value of "96386.2" equals 963.862 hPa.
func (s *BME280) Pressure() (float64, error) { func (s *BME280) Pressure(d []byte) float64 {
fineT, err := s.fineT() fineT := s.fineT(d)
if err != nil {
return 0, err
}
adcP, err := readInt24(PRESSURE_XLSB_REG, PRESSURE_LSB_REG, PRESSURE_MSB_REG, s.Bus, s.Addr) adcP := int32((uint32(d[PRESSURE_MSB_IDX])<<12)|
if err != nil { (uint32(d[PRESSURE_LSB_IDX])<<4)) |
return 0, err ((int32(d[PRESSURE_XLSB_IDX]) >> 4) & 0x0F)
}
var1 := int64(fineT) - 128000 var1 := int64(fineT) - 128000
var2 := var1 * var1 * s.Cal.P6 var2 := var1 * var1 * s.Cal.P6
@ -374,7 +371,7 @@ func (s *BME280) Pressure() (float64, error) {
var1 = (var1 * var1 * s.Cal.P3 >> 8) + (var1 * s.Cal.P2 << 12) var1 = (var1 * var1 * s.Cal.P3 >> 8) + (var1 * s.Cal.P2 << 12)
var1 = ((int64(1) << 47) + var1) * s.Cal.P1 >> 33 var1 = ((int64(1) << 47) + var1) * s.Cal.P1 >> 33
if var1 == 0 { if var1 == 0 {
return 0, nil // avoid exception caused by division by zero return 0 // avoid exception caused by division by zero
} }
p_acc := 1048576 - int64(adcP) p_acc := 1048576 - int64(adcP)
p_acc = (((p_acc << 31) - var2) * 3125) / var1 p_acc = (((p_acc << 31) - var2) * 3125) / var1
@ -383,11 +380,11 @@ func (s *BME280) Pressure() (float64, error) {
p_acc = ((p_acc + var1 + var2) >> 8) + (s.Cal.P7 << 4) p_acc = ((p_acc + var1 + var2) >> 8) + (s.Cal.P7 << 4)
p_acc = p_acc >> 8 // /256 p_acc = p_acc >> 8 // /256
return float64(p_acc), nil return float64(p_acc)
} }
// Temperature returns the temperature in Degrees Celcius. Output value of "30.33" equals 30.33°C. // Temperature returns the temperature in Degrees Celcius from the supplied measurements. Output value of "30.33" equals 30.33°C.
func (s *BME280) Temperature() (float64, error) { func (s *BME280) Temperature(d []byte) float64 {
fineT, err := s.fineT() fineT := s.fineT(d)
return (float64(fineT) / 5120.0), err return (float64(fineT) / 5120.0)
} }