#include "BME280.h" #include #include #include #include BME280::BME280() { valid = false; } bool BME280::begin(void) { SPI.begin(BME_SCK, BME_MISO, BME_MOSI, BME_CS); pinMode(18, OUTPUT); digitalWrite(18, HIGH); // disable LoRa_CS pinMode(BME_CS, OUTPUT); digitalWrite(BME_CS, LOW); // enable bme280 CS delay(100); // bme = new Adafruit_BME280(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI bme = new Adafruit_BME280(BME_CS); // hardware SPI bme->setSampling(Adafruit_BME280::sensor_mode::MODE_NORMAL, Adafruit_BME280::sensor_sampling::SAMPLING_X8, Adafruit_BME280::sensor_sampling::SAMPLING_X8, Adafruit_BME280::sensor_sampling::SAMPLING_X8, Adafruit_BME280::sensor_filter::FILTER_OFF, Adafruit_BME280::standby_duration::STANDBY_MS_250); valid = bme->begin(); if (!valid) bme->init(); if (!valid) return false; return true; } void BME280::sleep() { bme->setSampling(Adafruit_BME280::sensor_mode::MODE_SLEEP, Adafruit_BME280::sensor_sampling::SAMPLING_X16, Adafruit_BME280::sensor_sampling::SAMPLING_X16, Adafruit_BME280::sensor_sampling::SAMPLING_X16, Adafruit_BME280::sensor_filter::FILTER_OFF, Adafruit_BME280::standby_duration::STANDBY_MS_1000); } bool BME280::reinit() { pinMode(18, OUTPUT); digitalWrite(18, HIGH); // disable LoRa_CS pinMode(BME_CS, OUTPUT); // digitalWrite(BME_CS, LOW); // enable bme280 CS valid = false; for (int retries=0; !valid && retries<5; retries++) { /* reset chip */ Serial.println("resetting BME280"); SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); digitalWrite(BME_CS, LOW); constexpr byte BME280_REGISTER_SOFTRESET = 0xE0; SPI.transfer(BME280_REGISTER_SOFTRESET & ~0x80); SPI.transfer(0xB6); digitalWrite(BME_CS, HIGH); SPI.endTransaction(); // release the SPI bus delay(300); // wait for chip to wake up valid = bme->init(); retries++; checkValid(); } if (!valid) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); return false; } } void BME280::printValues() { Serial.print("Temperature = "); Serial.print(bme->readTemperature()); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bme->readPressure() / 100.0F); Serial.println(" hPa"); Serial.print("Approx. Altitude = "); Serial.print(bme->readAltitude(SEALEVELPRESSURE_HPA)); Serial.println(" m"); Serial.print("Humidity = "); Serial.print(bme->readHumidity()); Serial.println(" %"); Serial.println(); } float BME280::readTemperature(void) { float temp = bme->readTemperature(); if (temp < -40 || temp > 85) valid = false; else valid = true; return temp; } float BME280::readPressure(void) { float p = bme->readPressure() / 100.0F; if (p < 300 || p > 1100) valid = false; else valid = true; return p; } float BME280::readHumidity(void) { float h = bme->readHumidity(); if (h < 0 || h > 100) valid = false; else valid = true; return h; } bool BME280::checkValid(void) { readPressure(); return valid; }