code: func (d *BME280Driver) calculateHumidity(rawH uint32) float32 {
  	var rawT int32
  	var err error
  	var h float32
  
  	rawT, err = d.rawTemp()
  	if err != nil {
  		return 0
  	}
  
  	_, tFine := d.calculateTemp(rawT)
  	h = float32(tFine) - 76800
  
  	if h == 0 {
  		return 0 // TODO err is 'invalid data' from Bosch - include errors or not?
  	}
  
  	x := float32(rawH) - (float32(d.hc.h4)*64.0 +
  		(float32(d.hc.h5) / 16384.0 * h))
  
  	y := float32(d.hc.h2) / 65536.0 *
  		(1.0 + float32(d.hc.h6)/67108864.0*h*
  			(1.0+float32(d.hc.h3)/67108864.0*h))
  
  	h = x * y
  	h = h * (1 - float32(d.hc.h1)*h/524288)
  	return h
  }
docs: // Adapted from https://github.com/BoschSensortec/BME280_driver/blob/master/bme280.c
  // function bme280_compensate_humidity_double(s32 v_uncom_humidity_s32)