From 98d77db6ee0423f2ecbd03d5aa6d64b1823554bc Mon Sep 17 00:00:00 2001 From: LukaGitH Date: Tue, 1 May 2018 18:07:02 +0200 Subject: [PATCH 1/3] Updated to new BME280 lib --- Examples/GarageMote/GarageMote.ino | 101 +++++++++-------------------- 1 file changed, 32 insertions(+), 69 deletions(-) diff --git a/Examples/GarageMote/GarageMote.ino b/Examples/GarageMote/GarageMote.ino index d1f9fc3..e5cff0d 100644 --- a/Examples/GarageMote/GarageMote.ino +++ b/Examples/GarageMote/GarageMote.ino @@ -4,7 +4,7 @@ // Can trigger door open/close // http://www.LowPowerLab.com/GarageMote // ********************************************************************************** -// Copyright Felix Rusu 2016, http://www.LowPowerLab.com/contact +// Copyright Felix Rusu 2018, http://www.LowPowerLab.com/contact // ********************************************************************************** // License // ********************************************************************************** @@ -37,8 +37,7 @@ //For WeatherShield with BME280 see the WeatherNode example #ifdef WEATHERSHIELD - #include //get it here: https://github.com/LowPowerLab/SFE_BMP180 - #include //get it here: https://github.com/LowPowerLab/SI7021 + #include //get it here: https://github.com/sparkfun/SparkFun_BME280_Arduino_Library/tree/master/src #include #endif //**************************************************************************************************************** @@ -46,7 +45,7 @@ //**************************************************************************************************************** #define GATEWAYID 1 #define NODEID 11 -#define NETWORKID 250 +#define NETWORKID 100 //#define FREQUENCY RF69_433MHZ //#define FREQUENCY RF69_868MHZ #define FREQUENCY RF69_915MHZ //Match this with the version of your Moteino! (others: RF69_433MHZ, RF69_868MHZ) @@ -94,8 +93,7 @@ #endif #ifdef WEATHERSHIELD - SI7021 weatherShield_SI7021; - SFE_BMP180 weatherShield_BMP180; + BME280 bme280; #endif //function prototypes @@ -112,6 +110,9 @@ unsigned long lastWeatherSent=0; int ledPulseValue=0; boolean ledPulseDirection=false; //false=down, true=up char Pstr[10]; +char Fstr[10]; +char Hstr[10]; +double F,P,H; char sendBuf[30]; SPIFlash flash(8, 0xEF30); //WINDBOND 4MBIT flash chip on CS pin D8 (default for Moteino) @@ -155,17 +156,27 @@ void setup(void) else setStatus(STATUS_UNKNOWN); #ifdef WEATHERSHIELD - //initialize weather shield sensors - weatherShield_SI7021.begin(); - if (weatherShield_BMP180.begin()) - { DEBUGln("BMP180 init success"); } - else { DEBUGln("BMP180 init fail\n"); } + Wire.begin(); + Wire.setClock(400000); //Increase to fast I2C speed! + + //initialize weather shield BME280 sensor + bme280.setI2CAddress(0x77); //0x76,0x77 is valid. + bme280.beginI2C(); + bme280.setMode(MODE_SLEEP); //MODE_SLEEP, MODE_FORCED, MODE_NORMAL is valid. See 3.3 + bme280.setStandbyTime(0); //0 to 7 valid. Time between readings. See table 27. + bme280.setFilter(0); //0 to 4 is valid. Filter coefficient. See 3.4.4 + bme280.setTempOverSample(1); //0 to 16 are valid. 0 disables temp sensing. See table 24. + bme280.setPressureOverSample(1); //0 to 16 are valid. 0 disables pressure sensing. See table 23. + bme280.setHumidityOverSample(1); //0 to 16 are valid. 0 disables humidity sensing. See table 19. + P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg + F = bme280.readTempF(); + H = bme280.readFloatHumidity(); + #endif } unsigned long doorPulseCount = 0; char input=0; -double P; void loop() { @@ -312,10 +323,16 @@ void loop() if (millis()-lastWeatherSent > WEATHERSENDDELAY) { lastWeatherSent = millis(); - P = getPressure(); - P*=0.0295333727; //transform to inHg + bme280.setMode(MODE_FORCED); //Wake up sensor and take reading + P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg + F = bme280.readTempF(); + H = bme280.readFloatHumidity(); + + dtostrf(F, 3,2, Fstr); + dtostrf(H, 3,2, Hstr); dtostrf(P, 3,2, Pstr); - sprintf(sendBuf, "F:%d H:%d P:%s", weatherShield_SI7021.getFahrenheitHundredths(), weatherShield_SI7021.getHumidityPercent(), Pstr); + + sprintf(sendBuf, "F:%s H:%s P:%s", Fstr, Hstr, Pstr); byte sendLen = strlen(sendBuf); radio.send(GATEWAYID, sendBuf, sendLen); } @@ -366,57 +383,3 @@ void Blink(byte PIN, byte DELAY_MS) delay(DELAY_MS); digitalWrite(PIN,LOW); } - -#ifdef WEATHERSHIELD -double getPressure() -{ - char status; - double T,P,p0,a; - // If you want sea-level-compensated pressure, as used in weather reports, - // you will need to know the altitude at which your measurements are taken. - // We're using a constant called ALTITUDE in this sketch: - - // If you want to measure altitude, and not pressure, you will instead need - // to provide a known baseline pressure. This is shown at the end of the sketch. - // You must first get a temperature measurement to perform a pressure reading. - // Start a temperature measurement: - // If request is successful, the number of ms to wait is returned. - // If request is unsuccessful, 0 is returned. - status = weatherShield_BMP180.startTemperature(); - if (status != 0) - { - // Wait for the measurement to complete: - delay(status); - - // Retrieve the completed temperature measurement: - // Note that the measurement is stored in the variable T. - // Function returns 1 if successful, 0 if failure. - status = weatherShield_BMP180.getTemperature(T); - if (status != 0) - { - // Start a pressure measurement: - // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait). - // If request is successful, the number of ms to wait is returned. - // If request is unsuccessful, 0 is returned. - status = weatherShield_BMP180.startPressure(3); - if (status != 0) - { - // Wait for the measurement to complete: - delay(status); - - // Retrieve the completed pressure measurement: - // Note that the measurement is stored in the variable P. - // Note also that the function requires the previous temperature measurement (T). - // (If temperature is stable, you can do one temperature measurement for a number of pressure measurements.) - // Function returns 1 if successful, 0 if failure. - status = weatherShield_BMP180.getPressure(P,T); - if (status != 0) - { - return P; - } - } - } - } - return 0; -} -#endif \ No newline at end of file From f09a8608ed3720cb81269850d1f9793e2c475b11 Mon Sep 17 00:00:00 2001 From: LukaGitH Date: Tue, 1 May 2018 18:08:04 +0200 Subject: [PATCH 2/3] Updated to new BME280 lib --- Examples/MotionMote/MotionMote.ino | 78 +++++++++++++++++++----------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/Examples/MotionMote/MotionMote.ino b/Examples/MotionMote/MotionMote.ino index c4ac759..510e1a3 100644 --- a/Examples/MotionMote/MotionMote.ino +++ b/Examples/MotionMote/MotionMote.ino @@ -6,7 +6,7 @@ // IMPORTANT: adjust the settings in the configuration section below !!! // ********************************************************************************** -// Copyright Felix Rusu of LowPowerLab.com, 2016 +// Copyright Felix Rusu of LowPowerLab.com, 2018 // RFM69 library and sample code by Felix Rusu - lowpowerlab.com/contact // ********************************************************************************** // License @@ -29,21 +29,21 @@ // Please maintain this license information along with authorship // and copyright notices in any redistribution of this code // ********************************************************************************** -#include //get it here: https://www.github.com/lowpowerlab/rfm69 -#include //get it here: https://www.github.com/lowpowerlab/rfm69 -#include //comes with Arduino IDE (www.arduino.cc) -#include //get library from: https://github.com/lowpowerlab/lowpower - //writeup here: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/ -#include //get it here: https://www.github.com/lowpowerlab/spiflash -#include //get it here: https://github.com/sparkfun/SparkFun_BME280_Breakout_Board/tree/master/Libraries/Arduino/src -#include //comes with Arduino +#include //get it here: https://www.github.com/lowpowerlab/rfm69 +#include //get it here: https://www.github.com/lowpowerlab/rfm69 +#include //comes with Arduino IDE (www.arduino.cc) +#include //get library from: https://github.com/lowpowerlab/lowpower + //writeup here: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/ +#include //get it here: https://www.github.com/lowpowerlab/spiflash +#include //get it here: https://github.com/sparkfun/SparkFun_BME280_Arduino_Library/tree/master/src +#include //comes with Arduino //**************************************************************************************************************** //**** IMPORTANT RADIO SETTINGS - YOU MUST CHANGE/CONFIGURE TO MATCH YOUR HARDWARE TRANSCEIVER CONFIGURATION! **** //**************************************************************************************************************** +#define GATEWAYID 1 #define NODEID 88 //unique for each node on same network #define NETWORKID 100 //the same on all nodes that talk to each other -#define GATEWAYID 1 //Match frequency to the hardware version of the radio on your Moteino (uncomment one): //#define FREQUENCY RF69_433MHZ //#define FREQUENCY RF69_868MHZ @@ -96,8 +96,10 @@ char BATstr[10]; //longest battery voltage reading message = 9chars char sendBuf[32]; byte sendLen; #ifdef ENABLE_BME280 - float temperature=0; + double F,P,H; + char Pstr[10]; char Fstr[10]; + char Hstr[10]; #endif void motionIRQ(void); @@ -135,14 +137,22 @@ void setup() { if (flash.initialize()) flash.sleep(); //if Moteino has FLASH-MEM, make sure it sleeps #ifdef ENABLE_BME280 - bme280.settings.commInterface = I2C_MODE; - bme280.settings.I2CAddress = 0x77; - bme280.settings.runMode = 3; //Normal mode - bme280.settings.tStandby = 0; - bme280.settings.filter = 0; - bme280.settings.tempOverSample = 1; - bme280.settings.pressOverSample = 1; - bme280.settings.humidOverSample = 1; + + Wire.begin(); + Wire.setClock(400000); //Increase to fast I2C speed! + + //initialize weather shield BME280 sensor + bme280.setI2CAddress(0x77); //0x76,0x77 is valid. + bme280.beginI2C(); + bme280.setMode(MODE_SLEEP); //MODE_SLEEP, MODE_FORCED, MODE_NORMAL is valid. See 3.3 + bme280.setStandbyTime(0); //0 to 7 valid. Time between readings. See table 27. + bme280.setFilter(0); //0 to 4 is valid. Filter coefficient. See 3.4.4 + bme280.setTempOverSample(1); //0 to 16 are valid. 0 disables temp sensing. See table 24. + bme280.setPressureOverSample(1); //0 to 16 are valid. 0 disables pressure sensing. See table 23. + bme280.setHumidityOverSample(1); //0 to 16 are valid. 0 disables humidity sensing. See table 19. + P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg + F = bme280.readTempF(); + H = bme280.readFloatHumidity(); #endif } @@ -167,10 +177,16 @@ void loop() { #ifdef ENABLE_BME280 //read BME sensor - bme280.begin(); - dtostrf(bme280.readTempF(), 3,2, Fstr); - bme280.writeRegister(BME280_CTRL_MEAS_REG, 0x00); //sleep the BME280 - sprintf(sendBuf, "MOTION BAT:%sv F:%s", BATstr, Fstr); + bme280.setMode(MODE_FORCED); //Wake up sensor and take reading + P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg + F = bme280.readTempF(); + H = bme280.readFloatHumidity(); + + dtostrf(F, 3,2, Fstr); + dtostrf(H, 3,2, Hstr); + dtostrf(P, 3,2, Pstr); + + sprintf(sendBuf, "MOTION BAT:%sv F:%s H:%s P:%s", BATstr, Fstr, Hstr, Pstr); #else sprintf(sendBuf, "MOTION BAT:%sv", BATstr); #endif @@ -195,10 +211,16 @@ void loop() { { #ifdef ENABLE_BME280 //read BME sensor - bme280.begin(); - dtostrf(bme280.readTempF(), 3,2, Fstr); - bme280.writeRegister(BME280_CTRL_MEAS_REG, 0x00); //sleep the BME280 - sprintf(sendBuf, "BAT:%sv F:%s", BATstr, Fstr); + bme280.setMode(MODE_FORCED); //Wake up sensor and take reading + P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg + F = bme280.readTempF(); + H = bme280.readFloatHumidity(); + + dtostrf(F, 3,2, Fstr); + dtostrf(H, 3,2, Hstr); + dtostrf(P, 3,2, Pstr); + + sprintf(sendBuf, "MOTION BAT:%sv F:%s H:%s P:%s", BATstr, Fstr, Hstr, Pstr); #else sprintf(sendBuf, "BAT:%sv", BATstr); #endif @@ -246,4 +268,4 @@ void checkBattery() batteryVolts = BATT_FORMULA(readings / 10.0); dtostrf(batteryVolts, 3,2, BATstr); //update the BATStr which gets sent every BATT_CYCLES or along with the MOTION message } -} \ No newline at end of file +} From fe4cea20cebce3c754b637568b651a5f8f16a69f Mon Sep 17 00:00:00 2001 From: LukaGitH Date: Tue, 1 May 2018 18:09:23 +0200 Subject: [PATCH 3/3] Updated to new BME280 lib --- Examples/WeatherNode/WeatherNode.ino | 33 ++++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/Examples/WeatherNode/WeatherNode.ino b/Examples/WeatherNode/WeatherNode.ino index 313baf1..3116c1c 100644 --- a/Examples/WeatherNode/WeatherNode.ino +++ b/Examples/WeatherNode/WeatherNode.ino @@ -5,7 +5,7 @@ // http://www.LowPowerLab.com/WeatherShield // Example setup (with R1): http://lowpowerlab.com/blog/2015/07/24/attic-fan-cooling-tests/ // ********************************************************************************** -// Copyright Felix Rusu 2016, http://www.LowPowerLab.com/contact +// Copyright Felix Rusu 2018, http://www.LowPowerLab.com/contact // ********************************************************************************** // License // ********************************************************************************** @@ -33,7 +33,7 @@ #include //get it here: https://github.com/lowpowerlab/spiflash #include //included in Arduino IDE (www.arduino.cc) #include //included in Arduino IDE (www.arduino.cc) -#include //get it here: https://github.com/sparkfun/SparkFun_BME280_Breakout_Board/tree/master/Libraries/Arduino/src +#include //get it here: https://github.com/sparkfun/SparkFun_BME280_Arduino_Library/tree/master/src #include //get it here: https://github.com/lowpowerlab/lowpower //writeup here: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/ @@ -104,6 +104,7 @@ BME280 bme280; char Pstr[10]; char Fstr[10]; char Hstr[10]; +double F,P,H; char buffer[50]; void setup(void) @@ -130,15 +131,21 @@ void setup(void) sprintf(buffer, "WeatherMote - transmitting at: %d Mhz...", FREQUENCY==RF69_433MHZ ? 433 : FREQUENCY==RF69_868MHZ ? 868 : 915); DEBUGln(buffer); + Wire.begin(); + Wire.setClock(400000); //Increase to fast I2C speed! + //initialize weather shield BME280 sensor - bme280.settings.commInterface = I2C_MODE; - bme280.settings.I2CAddress = 0x77; - bme280.settings.runMode = 3; //Normal mode - bme280.settings.tStandby = 0; - bme280.settings.filter = 0; - bme280.settings.tempOverSample = 1; - bme280.settings.pressOverSample = 1; - bme280.settings.humidOverSample = 1; + bme280.setI2CAddress(0x77); //0x76,0x77 is valid. + bme280.beginI2C(); + bme280.setMode(MODE_SLEEP); //MODE_SLEEP, MODE_FORCED, MODE_NORMAL is valid. See 3.3 + bme280.setStandbyTime(0); //0 to 7 valid. Time between readings. See table 27. + bme280.setFilter(0); //0 to 4 is valid. Filter coefficient. See 3.4.4 + bme280.setTempOverSample(1); //0 to 16 are valid. 0 disables temp sensing. See table 24. + bme280.setPressureOverSample(1); //0 to 16 are valid. 0 disables pressure sensing. See table 23. + bme280.setHumidityOverSample(1); //0 to 16 are valid. 0 disables humidity sensing. See table 19. + P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg + F = bme280.readTempF(); + H = bme280.readFloatHumidity(); radio.sendWithRetry(GATEWAYID, "START", 6); Blink(LED, 100);Blink(LED, 100);Blink(LED, 100); @@ -159,7 +166,6 @@ void setup(void) unsigned long doorPulseCount = 0; char input=0; -double F,P,H; byte sendLoops=0; byte battReadLoops=0; float batteryVolts = 5; @@ -179,12 +185,11 @@ void loop() sendLoops = SEND_LOOPS-1; //read BME sensor - bme280.begin(); + bme280.setMode(MODE_FORCED); //Wake up sensor and take reading P = bme280.readFloatPressure() * 0.0002953; //read Pa and convert to inHg F = bme280.readTempF(); H = bme280.readFloatHumidity(); - bme280.writeRegister(BME280_CTRL_MEAS_REG, 0x00); //sleep the BME280 - + dtostrf(F, 3,2, Fstr); dtostrf(H, 3,2, Hstr); dtostrf(P, 3,2, Pstr);