// BMP180_otherInterfaces.ino // // shows how to use the BMP180MI library with interfaces other than the native I2C or SPI interfaces. // // Copyright (c) 2018 Gregor Christandl // // connect the bmp180 to the Arduino like this: // Arduino - bmp180 // 5V ------ VCC // GND ----- GND // SDA ----- SDA // SCL ----- SCL #include #include #include #define I2C_ADDRESS 0x77 //class derived from BMP180MI that implements communication using a library other than the native I2C library. class BMP180Wire1 : public BMP180MI { public: //constructor of the derived class. //@param address i2c address of the sensor. BMP180Wire1(uint8_t i2c_address) : address_(i2c_address) //initialize the BMP180Wire1 classes private member address_ to the i2c address provided { //nothing else to do here... } private: //this function must be implemented by derived classes. it is used to initialize the interface. first time communication //test are not necessary - these checks are done by the BMP180MI class //@return true on success, false otherwise. bool beginInterface() { Wire1.begin(); return true; } //this function must be implemented by derived classes. this function is responsible for reading data from the sensor. //@param reg register to read. //@return read data (1 byte). uint8_t readRegister(uint8_t reg) { #if defined(ARDUINO_SAM_DUE) //workaround for Arduino Due. The Due seems not to send a repeated start with the code above, so this //undocumented feature of Wire::requestFrom() is used. can be used on other Arduinos too (tested on Mega2560) //see this thread for more info: https://forum.arduino.cc/index.php?topic=385377.0 Wire1.requestFrom(address_, 1, reg, 1, true); #else Wire1.beginTransmission(address_); Wire1.write(reg); Wire1.endTransmission(false); Wire1.requestFrom(address_, static_cast(1)); #endif return Wire1.read(); } //this function can be implemented by derived classes. implementing this function is optional. //@param reg register to read. //@param length number of registers to read (max: 4) //@return read data. LSB = last register read. uint32_t readRegisterBurst(uint8_t reg, uint8_t length) { if (length > 4) return 0L; uint32_t data = 0L; #if defined(ARDUINO_SAM_DUE) //workaround for Arduino Due. The Due seems not to send a repeated start with the code below, so this //undocumented feature of Wire::requestFrom() is used. can be used on other Arduinos too (tested on Mega2560) //see this thread for more info: https://forum.arduino.cc/index.php?topic=385377.0 Wire1.requestFrom(address_, length, data, length, true); #else Wire1.beginTransmission(address_); Wire1.write(reg); Wire1.endTransmission(false); Wire1.requestFrom(address_, static_cast(length)); for (uint8_t i = 0; i < length; i++) { data <<= 8; data |= Wire1.read(); } #endif return data; } //this function must be implemented by derived classes. this function is responsible for sending data to the sensor. //@param reg register to write to. //@param data data to write to register. void writeRegister(uint8_t reg, uint8_t data) { Wire1.beginTransmission(address_); Wire1.write(reg); Wire1.write(data); Wire1.endTransmission(); } uint8_t address_; //i2c address of sensor }; //create an bmp180 object using the I2C interface, I2C address 0x77 and IRQ pin number 2 BMP180Wire1 bmp180(I2C_ADDRESS); void setup() { // put your setup code here, to run once: Serial.begin(9600); //wait for serial connection to open (only necessary on some boards) while (!Serial); //begin() initializes the interface, checks the sensor ID and reads the calibration parameters. if (!bmp180.begin()) { Serial.println("begin() failed. check your BMP180 Interface and I2C Address."); while (1); } //reset sensor to default parameters. bmp180.resetToDefaults(); //enable ultra high resolution mode for pressure measurements bmp180.setSamplingMode(BMP180MI::MODE_UHR); //... } void loop() { // put your main code here, to run repeatedly: delay(1000); //start a temperature measurement if (!bmp180.measureTemperature()) { Serial.println("could not start temperature measurement, is a measurement already running?"); return; } //wait for the measurement to finish. proceed as soon as hasValue() returned true. do { delay(100); } while (!bmp180.hasValue()); Serial.print("Temperature: "); Serial.print(bmp180.getTemperature()); Serial.println("degC"); //start a pressure measurement. pressure measurements depend on temperature measurement, you should only start a pressure //measurement immediately after a temperature measurement. if (!bmp180.measurePressure()) { Serial.println("could not start perssure measurement, is a measurement already running?"); return; } //wait for the measurement to finish. proceed as soon as hasValue() returned true. do { delay(100); } while (!bmp180.hasValue()); Serial.print("Pressure: "); Serial.print(bmp180.getPressure()); Serial.println("Pa"); }