You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

106 lines
2.9 KiB

#include "BME280.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
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
valid = bme->begin();
if (!valid) bme->init();
if (!valid) return false;
bme->setSampling(Adafruit_BME280::sensor_mode::MODE_NORMAL,
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_250);
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
int retries = 0; valid = false;
while (!valid) {
if (retries > 9) break;
valid = bme->init();
retries++;
delay(100);
float p = bme->readPressure() / 100.0F;
if (p < 300 || p > 1100) valid = false;
// constexpr byte BME280_REGISTER_SOFTRESET = 0xE0;
// bme->write8(BME280_REGISTER_SOFTRESET, 0xB6);
}
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;
}