void BaroSensorClass::begin() { Wire.begin(); Wire.beginTransmission(BARO_ADDR); Wire.write(CMD_RESET); err = _endTransmission(); if(err) return; uint16_t prom[7]; for(int i = 0; i < 7; i++) { Wire.beginTransmission(BARO_ADDR); Wire.write(CMD_PROM_READ(i)); err = _endTransmission(false); if(err) return; int req = Wire.requestFrom(BARO_ADDR, 2); if(req != 2) { err = ERR_BAD_READLEN; return; } prom[i] = ((uint16_t)Wire.read()) << 8; prom[i] |= Wire.read(); } // TODO verify CRC4 in top 4 bits of prom[0] (follows AN520 but not directly...) c1 = prom[1]; c2 = prom[2]; c3 = prom[3]; c4 = prom[4]; c5 = prom[5]; c6 = prom[6]; initialised = true; }
uint32_t BaroSensorClass::takeReading(uint8_t trigger_cmd, BaroOversampleLevel oversample_level) { Wire.beginTransmission(BARO_ADDR); Wire.write(trigger_cmd); err = _endTransmission(); if(err) return 0; uint8_t sampling_delay = pgm_read_byte(SamplingDelayMs + (int)oversample_level); delay(sampling_delay); Wire.beginTransmission(BARO_ADDR); Wire.write(CMD_READ_ADC); err = _endTransmission(false); if(err) return 0; int req = Wire.requestFrom(BARO_ADDR, 3); if(req != 3) req = Wire.requestFrom(BARO_ADDR, 3); // Sometimes first read fails...? if(req != 3) { err = ERR_BAD_READLEN; return 0; } uint32_t result = (uint32_t)Wire.read() << 16; result |= (uint32_t)Wire.read() << 8; result |= Wire.read(); return result; }
float Compass::getReading() { _beginTransmission(); _endTransmission(); //time delays required by HMC6352 upon receipt of the command //Get Data. Compensate and Calculate New Heading : 6ms delay(6); Wire.requestFrom(HMC6352SlaveAddress, 2); //get the two data bytes, MSB and LSB //"The heading output data will be the value in tenths of degrees //from zero to 3599 and provided in binary format over the two bytes." byte MSB = Wire.read(); byte LSB = Wire.read(); float headingSum = (MSB << 8) + LSB; //(MSB / LSB sum) float headingInt = headingSum / 10; return headingInt; }