To use the node in your project you should have the dinosalvioni/bmx280 library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.
C++ implementation
#pragma XOD require "https://github.com/christandlg/BMx280MI"
// Arduino - BMP280 / BME280
// 3.3V ---- VCC
// GND ----- GND
// SDA ----- SDA
// SCL ----- SCL
// some BMP280/BME280 modules break out the CSB and SDO pins as well:
// 5V ------ CSB (enables the I2C interface)
// GND ----- SDO (I2C Address 0x76)
// 5V ------ SDO (I2C Address 0x77)
// other pins can be left unconnected.
{{#global}}
#include <Arduino.h>
#include <Wire.h>
#include <BMx280MI.h>
//#define I2C_ADDRESS 0x76
{{/global}}
struct State {
};
{{ GENERATED_CODE }}
void evaluate(Context ctx) {
auto state = getState(ctx);
if (isInputDirty<input_UPD>(ctx)) {
Wire.begin();
//create a BMx280I2C object using the I2C interface with I2C Address 0x76
auto I2C_ADDRESS = getValue<input_ADDR>(ctx);
BMx280I2C bmx280(I2C_ADDRESS);
if (!bmx280.begin())
{
Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
}
if (bmx280.isBME280())
Serial.println("sensor is a BME280");
else
Serial.println("sensor is a BMP280");
//reset sensor to default parameters.
bmx280.resetToDefaults();
//by default sensing is disabled and must be enabled by setting a non-zero
//oversampling setting.
//set an oversampling setting for pressure and temperature measurements.
bmx280.writeOversamplingPressure(BMx280MI::OSRS_P_x16);
bmx280.writeOversamplingTemperature(BMx280MI::OSRS_T_x16);
//if sensor is a BME280, set an oversampling setting for humidity measurements.
if (bmx280.isBME280())
bmx280.writeOversamplingHumidity(BMx280MI::OSRS_H_x16);
//start a measurement
if (!bmx280.measure())
{
//Serial.println("could not start measurement, is a measurement already running?");
return;
}
//wait for the measurement to finish
int i = 0;
do
{
delay(100);
i=i+1;
} while (!bmx280.hasValue() or i<10);
auto temperature = bmx280.getTemperature();
auto pressure = bmx280.getPressure();
auto humidity = bmx280.getHumidity();
emitValue<output_PRES>(ctx, pressure);
emitValue<output_TEMP>(ctx, temperature);
if (bmx280.isBME280())
emitValue<output_HUM>(ctx, humidity);
}emitValue<output_DONE>(ctx, 1);
}