switch to BME280

This commit is contained in:
Nicu Hodos 2024-01-13 15:40:00 +01:00
parent 9957ec6227
commit 47dd714a92
7 changed files with 99 additions and 82 deletions

50
include/bme.h Normal file
View File

@ -0,0 +1,50 @@
#pragma once
#include <Adafruit_BME280.h>
namespace Bme {
Adafruit_BME280 bme; // I2C Interface
struct {
float temp;
float humidity;
float pressure;
float altitude;
float readTemp() {
char buf[10];
sprintf(buf, "%.1f", bme.readTemperature() - 2);
temp = atof(buf);
return temp;
}
float readHumidity() {
char buf[10];
sprintf(buf, "%.1f", bme.readHumidity() - 2);
humidity = atof(buf);
return humidity;
}
void readAll() {
readTemp();
readHumidity();
pressure = bme.readPressure() / 100;
altitude = bme.readAltitude(1006);
}
} data;
void setup() {
Serial.println(F("BME280 setup"));
if (!bme.begin(BME280_ADDRESS_ALTERNATE, &Wire)) {
Serial.println(F("Could not find a valid BME280 sensor, check wiring!"));
return;
}
/* Default settings from datasheet. */
bme.setSampling(Adafruit_BME280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BME280::SAMPLING_X2, // temperature
Adafruit_BME280::SAMPLING_X16, // pressure
Adafruit_BME280::SAMPLING_X2, // humidity
Adafruit_BME280::FILTER_X16,
Adafruit_BME280::STANDBY_MS_500); /* Standby time. */
}
}

View File

@ -1,59 +0,0 @@
#pragma once
#include <Adafruit_BMP280.h>
namespace Bmp {
Adafruit_BMP280 bmp; // I2C Interface
struct {
float temp;
float pressure;
float altitude;
float readTemp() {
char buf[10];
sprintf(buf, "%.1f", bmp.readTemperature() - 2);
temp = atof(buf);
return temp;
}
void readAll() {
readTemp();
pressure = bmp.readPressure() / 100;
altitude = bmp.readAltitude(1006);
}
} data;
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 setup"));
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
/* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}
void loop() {
Serial.print(F("Temperature = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure() / 100); //displaying the Pressure in hPa, you can change the unit
Serial.println(" hPa");
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1019.66)); //The "1019.66" is the pressure(hPa) at sea level in day in your region
Serial.println(" m"); //If you don't know it, modify it until you get your current altitude
Serial.println();
delay(2000);
}
}

View File

@ -5,6 +5,7 @@
#include <Adafruit_I2CDevice.h>
#include <SPI.h>
#include "ntp_time.h"
#include "bme.h"
#define DISPLAY_ADDRESS 0x70
#define BRIGHTNESS_MIN 0
@ -17,6 +18,8 @@
namespace Display {
void displayTime();
void displayTemp();
void displayHumidity();
void drawTime();
void drawColon(bool);
Task tDisplayTime(500, TASK_FOREVER, displayTime, &ts, false, []() {
@ -25,6 +28,12 @@ namespace Display {
}, []() {
drawColon(false);
});
Task tDisplaySensor(5*TASK_SECOND, 4, displayTemp, &ts, false, []() {
tDisplayTime.disable();
return true;
}, []() {
tDisplayTime.enableDelayed(tDisplaySensor.getInterval());
});
bool hourFormat24 = false;
void (*hourFormatChangedCallback)();
@ -104,11 +113,16 @@ namespace Display {
colonOn = !colonOn;
}
void displayTemp(float value) {
tDisplayTime.disable();
clockDisplay.printFloat(value, 1);
void displayTemp() {
clockDisplay.printFloat(Bme::data.temp, 1);
clockDisplay.writeDisplay();
tDisplayTime.enableDelayed(SECONDS(10));
tDisplaySensor.setCallback(&displayHumidity);
}
void displayHumidity() {
clockDisplay.printFloat(Bme::data.humidity, 1);
clockDisplay.writeDisplay();
tDisplaySensor.setCallback(&displayTemp);
}
void displayValue(uint8_t value) {

View File

@ -156,6 +156,14 @@ namespace Ha {
}
};
struct HumiditySensor : Sensor {
HumiditySensor(const char* name, const char* id) : Sensor(name, id) {
deviceClass = "humidity";
unitMeasure = "%";
valueTemplate = "{{ value_json.humidity }}";
}
};
struct PressureSensor : Sensor {
PressureSensor(const char* name, const char* id) : Sensor(name, id) {
deviceClass = "pressure";

View File

@ -3,7 +3,7 @@
#include <AsyncMqttClient.h>
#include <ArduinoJson.h>
#include "ha.h"
#include "bmp.h"
#include "bme.h"
#include "display.h"
#define MQTT_HOST IPAddress(192, 168, 5, 11)
@ -12,7 +12,7 @@
namespace Mqtt {
void publishInit();
void publishBmp280();
void publishBme280();
void connect();
void disconnect();
Task tReConnect(5 * TASK_MINUTE, TASK_FOREVER, connect, &ts);
@ -37,6 +37,7 @@ namespace Mqtt {
Ha::Sensor* sensors[] = {
new Ha::TemperatureSensor{"Temperature", "temperature"},
new Ha::HumiditySensor{"Humidity", "humidity"},
new Ha::PressureSensor{"Pressure", "pressure"},
new Ha::AltitudeSensor{"Altitude", "altitude"}
};
@ -101,11 +102,12 @@ namespace Mqtt {
ts.deleteTask(tPublishInit);
}
void publishBmp280() {
void publishBme280() {
StaticJsonDocument<255> jsonDoc;
jsonDoc["temperature"] = Bmp::data.temp;
jsonDoc["pressure"] = Bmp::data.pressure;
jsonDoc["altitude"] = Bmp::data.altitude;
jsonDoc["temperature"] = Bme::data.temp;
jsonDoc["humidity"] = Bme::data.humidity;
jsonDoc["pressure"] = Bme::data.pressure;
jsonDoc["altitude"] = Bme::data.altitude;
char message[255];
serializeJson(jsonDoc, message);
publish(Ha::Sensor::stateTopic, message);

View File

@ -21,7 +21,7 @@ lib_deps =
marvinroger/AsyncMqttClient@^0.9.0
arkhipenko/TaskScheduler@^3.7.0
adafruit/Adafruit Unified Sensor @ ^1.1.4
adafruit/Adafruit BMP280 Library@^2.5.0
adafruit/Adafruit BME280 Library@^2.2.4
bblanchon/ArduinoJson@6.16.1
build_flags = -D WIFI_ALWAYS_ON=1

View File

@ -14,27 +14,29 @@ Task tWifiConnected(TASK_IMMEDIATE, TASK_ONCE, onWifiConnected, &ts);
#include "wifi.h"
#include "mqtt.h"
#include "display.h"
#include "bmp.h"
#include "bme.h"
#include "ntp_time.h"
#include "ota.h"
#define BUTTON D3
Task tButton(TASK_IMMEDIATE, TASK_ONCE, []() {
Display::displayTemp(Bmp::data.readTemp());
Bme::data.readAll();
Display::tDisplaySensor.restart();
}, &ts);
Task tLed(TASK_IMMEDIATE, TASK_ONCE, []() {
Mqtt::ledMqtt->publishState();
}, &ts);
Task tReadBmp(TASK_MINUTE, TASK_FOREVER, []() {
Task tReadBme(TASK_MINUTE, TASK_FOREVER, []() {
static float lastTemp = 0;
float temp = Bmp::data.temp;
Bmp::data.readAll();
if (temp == Bmp::data.temp) return;
Mqtt::publishBmp280();
if (abs(lastTemp - Bmp::data.temp) > 0.2) {
lastTemp = Bmp::data.temp;
Display::displayTemp(Bmp::data.temp);
float temp = Bme::data.temp;
float humidity = Bme::data.humidity;
Bme::data.readAll();
if ((temp == Bme::data.temp) && (humidity == Bme::data.humidity)) return;
Mqtt::publishBme280();
if (abs(lastTemp - Bme::data.temp) > 0.2) {
lastTemp = Bme::data.temp;
Display::tDisplaySensor.restart();
}
}, &ts);
@ -49,7 +51,7 @@ void setup() {
Ota::setup();
Ntp::setup();
Mqtt::setup();
Bmp::setup();
Bme::setup();
Wifi::setup();
@ -57,7 +59,7 @@ void setup() {
attachInterrupt(digitalPinToInterrupt(BUTTON), onButtonPressed, FALLING);
attachInterrupt(digitalPinToInterrupt(LED_BUILTIN), onLed, CHANGE);
tReadBmp.enable();
tReadBme.enable();
}
void loop() {