diff --git a/README.md b/README.md index aeb7986..9c5e534 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ # GyverBME280 Лёгкая библиотека для работы с BME280 по I2C для Arduino +**Примечание** (от автора форка): Библиотека частично совместима с оригинальной. Отличается только конструктор и процесс инициализации. + ### Совместимость Совместима со всеми Arduino платформами (используются Arduino-функции) diff --git a/src/GyverBME280.cpp b/src/GyverBME280.cpp index 71b2049..a5b38b5 100644 --- a/src/GyverBME280.cpp +++ b/src/GyverBME280.cpp @@ -5,7 +5,7 @@ float pressureToAltitude(float pressure) { if (!pressure) return 0; // If the pressure module has been disabled return '0' pressure /= 100.0F; // Convert [Pa] to [hPa] - return 44330.0 * (1.0 - pow(pressure / 1013.25, 0.1903)); // Сalculate altitude + return 44330.0f * (1.0f - pow(pressure / 1013.25f, 0.1903f)); // Сalculate altitude } float pressureToMmHg(float pressure) { @@ -14,14 +14,17 @@ float pressureToMmHg(float pressure) { /* ============ Setup & begin ============ */ -bool GyverBME280::begin(void) { +GyverBME280::GyverBME280(TwoWire &wire) { + _wire = &wire; +} + +bool GyverBME280::begin() { return begin(0x76); } bool GyverBME280::begin(uint8_t address) { _i2c_address = address; /* === Start I2C bus & check BME280 === */ - Wire.begin(); // Start I2C bus if (!reset()) return false; // BME280 software reset & ack check uint8_t ID = readRegister(0xD0); if (ID != 0x60 && ID != 0x58) return false; // Check chip ID (bme/bmp280) @@ -108,11 +111,11 @@ float GyverBME280::readPressure(void) { float GyverBME280::readHumidity(void) { - Wire.beginTransmission(_i2c_address); // Start I2C transmission - Wire.write(0xFD); // Request humidity data register - if (Wire.endTransmission() != 0) return 0; - Wire.requestFrom(_i2c_address, 2); // Request humidity data - int32_t hum_raw = ((uint16_t)Wire.read() << 8) | (uint16_t)Wire.read(); // Read humidity data + _wire->beginTransmission(_i2c_address); // Start I2C transmission + _wire->write(0xFD); // Request humidity data register + if (_wire->endTransmission() != 0) return 0; + _wire->requestFrom(_i2c_address, 2); // Request humidity data + int32_t hum_raw = ((uint16_t)_wire->read() << 8) | (uint16_t)_wire->read(); // Read humidity data if (hum_raw == 0x8000) return 0; // If the humidity module has been disabled return '0' int32_t value = (readTempInt() - ((int32_t)76800)); // Start humidity converting @@ -139,8 +142,6 @@ void GyverBME280::oneMeasurement(void) { writeRegister(0xF4 , ((readRegister(0xF4) & 0xFC) | 0x02)); // Set the operating mode to FORCED_MODE } -GyverBME280::GyverBME280() {} - /* ============ Private ============ */ /* = BME280 software reset = */ @@ -153,66 +154,66 @@ bool GyverBME280::reset(void) { /* = Read and combine three BME280 registers = */ uint32_t GyverBME280::readRegister24(uint8_t address) { - Wire.beginTransmission(_i2c_address); - Wire.write(address); - if (Wire.endTransmission() != 0) return 0x800000; - Wire.requestFrom(_i2c_address, 3); - return (((uint32_t)Wire.read() << 16) | ((uint32_t)Wire.read() << 8) | (uint32_t)Wire.read()); + _wire->beginTransmission(_i2c_address); + _wire->write(address); + if (_wire->endTransmission() != 0) return 0x800000; + _wire->requestFrom(_i2c_address, 3); + return (((uint32_t)_wire->read() << 16) | ((uint32_t)_wire->read() << 8) | (uint32_t)_wire->read()); } /* = Write one 8-bit BME280 register = */ bool GyverBME280::writeRegister(uint8_t address , uint8_t data) { - Wire.beginTransmission(_i2c_address); - Wire.write(address); - Wire.write(data); - if (Wire.endTransmission() != 0) return false; + _wire->beginTransmission(_i2c_address); + _wire->write(address); + _wire->write(data); + if (_wire->endTransmission() != 0) return false; return true; } /* = Read one 8-bit BME280 register = */ uint8_t GyverBME280::readRegister(uint8_t address) { - Wire.beginTransmission(_i2c_address); - Wire.write(address); - if (Wire.endTransmission() != 0) return 0; - Wire.requestFrom(_i2c_address , 1); - return Wire.read(); + _wire->beginTransmission(_i2c_address); + _wire->write(address); + if (_wire->endTransmission() != 0) return 0; + _wire->requestFrom(_i2c_address , 1); + return _wire->read(); } /* = Structure to store all calibration values = */ void GyverBME280::readCalibrationData(void) { /* first part request*/ - Wire.beginTransmission(_i2c_address); - Wire.write(0x88); - if (Wire.endTransmission() != 0) return; - Wire.requestFrom(_i2c_address , 25); + _wire->beginTransmission(_i2c_address); + _wire->write(0x88); + if (_wire->endTransmission() != 0) return; + _wire->requestFrom(_i2c_address , 25); /* reading */ - CalibrationData._T1 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._T2 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._T3 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P1 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P2 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P3 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P4 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P5 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P6 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P7 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P8 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._P9 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._H1 = Wire.read(); + CalibrationData._T1 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._T2 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._T3 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P1 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P2 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P3 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P4 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P5 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P6 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P7 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P8 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._P9 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._H1 = _wire->read(); /* second part request*/ - Wire.beginTransmission(_i2c_address); - Wire.write(0xE1); - Wire.endTransmission(); - Wire.requestFrom(_i2c_address , 8); + _wire->beginTransmission(_i2c_address); + _wire->write(0xE1); + _wire->endTransmission(); + _wire->requestFrom(_i2c_address , 8); /* reading */ - CalibrationData._H2 = (Wire.read() | (Wire.read() << 8)); - CalibrationData._H3 = Wire.read(); - CalibrationData._H4 = (Wire.read() << 4); - uint8_t interVal = Wire.read(); + CalibrationData._H2 = (_wire->read() | (_wire->read() << 8)); + CalibrationData._H3 = _wire->read(); + CalibrationData._H4 = (_wire->read() << 4); + uint8_t interVal = _wire->read(); CalibrationData._H4 |= (interVal & 0xF); - CalibrationData._H5 = (((interVal & 0xF0) >> 4) | (Wire.read() << 4)); - CalibrationData._H6 = Wire.read(); + CalibrationData._H5 = (((interVal & 0xF0) >> 4) | (_wire->read() << 4)); + CalibrationData._H6 = _wire->read(); } \ No newline at end of file diff --git a/src/GyverBME280.h b/src/GyverBME280.h index d9f8bea..a88251e 100644 --- a/src/GyverBME280.h +++ b/src/GyverBME280.h @@ -10,7 +10,7 @@ Версии: v1.3 - исправлена ошибка при отриц. температуре v1.4 - разбил на h и cpp - v1.5 - добавлена поддержка BMP280 + v1.5 - добавлена поддержка BMP280s */ #ifndef GyverBME280_h @@ -50,8 +50,8 @@ class GyverBME280 { public: - GyverBME280(); // Create an object of class BME280 - bool begin(void); // Initialize sensor with standart 0x76 address + GyverBME280(TwoWire &wire); // Create an object of class BME280 + bool begin(); // Initialize sensor with standart 0x76 address bool begin(uint8_t address); // Initialize sensor with not standart 0x76 address bool isMeasuring(void); // Returns 'true' while the measurement is in progress float readPressure(void); // Read and calculate atmospheric pressure [float , Pa] @@ -68,6 +68,7 @@ public: private: //============================== DEFAULT SETTINGS ========================================| + TwoWire *_wire = nullptr; int _i2c_address = 0x76; // BME280 address on I2C bus | uint8_t _operating_mode = NORMAL_MODE; // Sensor operation mode | uint8_t _standby_time = STANDBY_250MS; // Time between measurements in NORMAL_MODE |