Pressure/Temperature/Weather forecast sensor (BMP085)

Hello,

First, thanks you for this interesting pluging, the arduinos are very instesting and have unlimited possibilities.
I am using an Arduino Sensor 1,3 Beta 2 and i have some problem with Pressure/Temperature/Weather forecast sensor (BMP085).
After a lots of tests, i find out that the problem is in the function int sample(float pressure), without run the function, all works well.
I have been little time with Arduino and i don’t know how to enter the debug mode.
Can you guys help me to see where is the error?
Here is the code who has the arduino, here is a BMP085 and only one Dallas DS18b20.

[code]#include <Sleep_n0m1.h>
#include <SPI.h>
#include <EEPROM.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <RF24.h>
#include <Sensor.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

// Set RADIO_ID to something unique in your sensor network (1-254)
// or set to AUTO if you want gw to assign a RADIO_ID for you.
#define RADIO_ID 5

#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected

unsigned long SLEEP_TIME = 30; // Sleep time between reads (in seconds)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
Adafruit_BMP085 bmp = Adafruit_BMP085();

Sensor gw(9, 10);
Sleep sleep;

#define MAX_ATTACHED_DS18B20 16

float lastTemperature[MAX_ATTACHED_DS18B20];
int numSensors=0;
boolean metric = true;
float lastPressure = -1;
float lastTemp = -1;
int lastForecast = -1;
char *weather[] = {“stable”,“sunny”,“cloudy”,“unstable”,“thunderstorm”,“unknown”};
int minutes;
float pressureSamples[180];
int minuteCount = 0;
bool firstRound = true;
float pressureAvg[7];
float dP_dt;

void setup()
{
Serial.begin(BAUD_RATE); // Used to type in characters
sensors.begin();
gw.begin(RADIO_ID);

// Fetch the number of attached sensors
numSensors = sensors.getDeviceCount();
// Register all sensors to gw (they will be created as child devices)
for (int i=0; i<numSensors; i++) {
gw.sendSensorPresentation(i, S_TEMP);
}
gw.sendSensorPresentation(1, S_BARO);
gw.sendSensorPresentation(2, S_TEMP);
metric = gw.isMetricSystem();
if (!bmp.begin()) {
Serial.println(“Could not find a valid BMP085 sensor, check wiring!”);
while (1) {}
}
}

void loop()
{
sensors.requestTemperatures(); // Fetch temperatures from Dallas
delay(100);
Serial.println(“Holaaaa”);
Serial.print(“Temperature = “);
Serial.print(bmp.readTemperature());
Serial.println(” *C”);

Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");

for (int i=0; i<numSensors; i++) {
// Fetch and round temperature to one decimal
float temperature = static_cast(static_cast((metric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
// Only send data if temperature has changed and no error
if (lastTemperature[i] != temperature && temperature != -127.00) {
gw.powerUp(); // Powerup introduces a small delay (which is missing in radio.write powerup)
// Send variable (using registered shortcut) to gw
gw.sendVariable(i, V_TEMP, temperature, 1);
lastTemperature[i]=temperature;
}
}
float pressure = bmp.readPressure();
float temperature = bmp.readTemperature();

if (!metric) {
// Convert to fahrenheit
temperature = temperature * 9.0 / 5.0 + 32.0;
}

//int forecast = sample(pressure);

Serial.print(“Temperature = “);
Serial.print(temperature);
Serial.println(metric?” *C”:" *F");
Serial.print(“Pressure = “);
Serial.print(pressure);
Serial.println(” Pa”);
//Serial.println(weather[forecast]);

if (temperature != lastTemp) {
gw.sendVariable(2, V_TEMP, temperature,1);
lastTemp = temperature;
}

if (pressure != lastPressure) {
gw.sendVariable(1, V_PRESSURE, pressure, 0);
lastPressure = pressure;
}

//if (forecast != lastForecast) {
// gw.sendVariable(1, V_FORECAST, weather[forecast]);
// lastForecast = forecast;
//}

/*
DP/Dt explanation

0 = “Stable Weather Pattern”
1 = “Slowly rising Good Weather”, "Clear/Sunny "
2 = "Slowly falling L-Pressure ", "Cloudy/Rain "
3 = “Quickly rising H-Press”, “Not Stable”
4 = “Quickly falling L-Press”, “Thunderstorm”
5 = "Unknown (More Time needed)
*/

// Power down the radio. Note that the radio will get powered back up
// on the next write() call.
// Power down the radio. Note that the radio will get powered back up
// on the next write() call.
delay(500);
gw.powerDown();
sleep.pwrDownMode(); //set sleep mode
sleep.sleepDelay(SLEEP_TIME * 1000); //sleep for: sleepTime
}

int sample(float pressure) {
// Algorithm found here
// http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
if (minuteCount > 180)
minuteCount = 6;

pressureSamples[minuteCount] = pressure;
minuteCount++;

if (minuteCount == 5) {
	// Avg pressure in first 5 min, value averaged from 0 to 5 min.
	pressureAvg[0] = ((pressureSamples[1] + pressureSamples[2]
			+ pressureSamples[3] + pressureSamples[4] + pressureSamples[5])
			/ 5);
} else if (minuteCount == 35) {
	// Avg pressure in 30 min, value averaged from 0 to 5 min.
	pressureAvg[1] = ((pressureSamples[30] + pressureSamples[31]
			+ pressureSamples[32] + pressureSamples[33]
			+ pressureSamples[34]) / 5);
	float change = (pressureAvg[1] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = ((65.0 / 1023.0) * 2 * change); // note this is for t = 0.5hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 1.5); // divide by 1.5 as this is the difference in time from 0 value.
} else if (minuteCount == 60) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[2] = ((pressureSamples[55] + pressureSamples[56]
			+ pressureSamples[57] + pressureSamples[58]
			+ pressureSamples[59]) / 5);
	float change = (pressureAvg[2] - pressureAvg[0]);
	if (firstRound) //first time initial 3 hour
		dP_dt = ((65.0 / 1023.0) * change); //note this is for t = 1 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 2); //divide by 2 as this is the difference in time from 0 value
} else if (minuteCount == 95) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[3] = ((pressureSamples[90] + pressureSamples[91]
			+ pressureSamples[92] + pressureSamples[93]
			+ pressureSamples[94]) / 5);
	float change = (pressureAvg[3] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 1.5); // note this is for t = 1.5 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 2.5); // divide by 2.5 as this is the difference in time from 0 value
} else if (minuteCount == 120) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[4] = ((pressureSamples[115] + pressureSamples[116]
			+ pressureSamples[117] + pressureSamples[118]
			+ pressureSamples[119]) / 5);
	float change = (pressureAvg[4] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 2); // note this is for t = 2 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 3); // divide by 3 as this is the difference in time from 0 value
} else if (minuteCount == 155) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[5] = ((pressureSamples[150] + pressureSamples[151]
			+ pressureSamples[152] + pressureSamples[153]
			+ pressureSamples[154]) / 5);
	float change = (pressureAvg[5] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 2.5); // note this is for t = 2.5 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 3.5); // divide by 3.5 as this is the difference in time from 0 value
} else if (minuteCount == 180) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[6] = ((pressureSamples[175] + pressureSamples[176]
			+ pressureSamples[177] + pressureSamples[178]
			+ pressureSamples[179]) / 5);
	float change = (pressureAvg[6] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 3); // note this is for t = 3 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 4); // divide by 4 as this is the difference in time from 0 value
	pressureAvg[0] = pressureAvg[5]; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past.
	firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop.
}

if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval.
	return 5; // Unknown, more time needed
else if (dP_dt < (-0.25))
	return 4; // Quickly falling LP, Thunderstorm, not stable
else if (dP_dt > 0.25)
	return 3; // Quickly rising HP, not stable weather
else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05)))
	return 2; // Slowly falling Low Pressure System, stable rainy weather
else if ((dP_dt > 0.05) && (dP_dt < 0.25))
	return 1; // Slowly rising HP stable good weather
else if ((dP_dt > (-0.05)) && (dP_dt < 0.05))
	return 0; // Stable weather
else
	return 5; // Unknown

}

[/code]

Thanks to all.

Mano,

I am very new at this myself but I was able to get the BMP085 sensor to work with the DHT22 last night. Here is the code I used:

[code]#include <Sleep_n0m1.h>
#include <SPI.h>
#include <EEPROM.h>
#include <RF24.h>
#include <Sensor.h>
#include <DHT.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

// Set RADIO_ID to something unique in your sensor network (1-254)
// or set to AUTO if you want gw to assign a RADIO_ID for you.
#define RADIO_ID AUTO
#define CHILD_ID_HUM 2
#define CHILD_ID_TEMP 3
#define HUMIDITY_SENSOR_DIGITAL_PIN 3
#define LIGHT_SENSOR_ANALOG_PIN 0

unsigned long SLEEP_TIME = 30; // Sleep time between reads (in seconds)

Adafruit_BMP085 bmp = Adafruit_BMP085(); // Digital Pressure Sensor

Sensor gw(9, 10);
DHT dht;
Sleep sleep;

float lastTemp;
float lastHum;
boolean metric = true;

float lastPressure = -1;
float lastTempBMP = -1;
int lastForecast = -1;

char *weather[] = {“stable”,“sunny”,“cloudy”,“unstable”,“thunderstorm”,“unknown”};
int minutes;
float pressureSamples[180];
int minuteCount = 0;
bool firstRound = true;
float pressureAvg[7];
float dP_dt;

void setup()
{
Serial.begin(BAUD_RATE); // Used to type in characters
gw.begin(RADIO_ID);
if (!bmp.begin()) {
Serial.println(“Could not find a valid BMP085 sensor, check wiring!”);
while (1) { }
}
dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);

// Register all sensors to gw (they will be created as child devices)
gw.sendSensorPresentation(CHILD_ID_HUM, S_HUM);
gw.sendSensorPresentation(CHILD_ID_TEMP, S_TEMP);

gw.sendSensorPresentation(0, S_BARO);

gw.sendSensorPresentation(1, S_TEMP);

metric = gw.isMetricSystem();
}

void loop()
{
gw.powerUp(); // Power up radio
delay(dht.getMinimumSamplingPeriod());

float temperature = dht.getTemperature();

float pressure = bmp.readPressure();
float temperatureBMP = bmp.readTemperature();

if (isnan(temperature)) {
Serial.println(“Failed reading temperature from DHT”);
} else if (temperature != lastTemp) {
lastTemp = temperature;
if (!metric) {
temperature = dht.toFahrenheit(temperature);
}
gw.sendVariable(CHILD_ID_TEMP, V_TEMP, temperature, 1);
Serial.print("T: ");
Serial.println(temperature);
}

float humidity = dht.getHumidity();
if (isnan(humidity)) {
Serial.println(“Failed reading humidity from DHT”);
} else if (humidity != lastHum) {
lastHum = humidity;
gw.sendVariable(CHILD_ID_HUM, V_HUM, humidity, 1);
Serial.print("H: ");
Serial.println(humidity);
}

if (!metric) {
// Convert to fahrenheit
temperatureBMP = temperatureBMP * 9.0 / 5.0 + 32.0;
}

int forecast = sample(pressure);

Serial.print(“Temperature(BMP) = “);
Serial.print(temperatureBMP);
Serial.println(metric?” *C”:" *F");
Serial.print(“Pressure = “);
Serial.print(pressure);
Serial.println(” Pa”);
Serial.println(weather[forecast]);

if (temperatureBMP != lastTempBMP) {
gw.sendVariable(1, V_TEMP, temperatureBMP,1);
lastTempBMP = temperatureBMP;
}

if (pressure != lastPressure) {
gw.sendVariable(0, V_PRESSURE, pressure, 0);
lastPressure = pressure;
}

if (forecast != lastForecast) {
gw.sendVariable(0, V_FORECAST, weather[forecast]);
lastForecast = forecast;
}

/*
DP/Dt explanation

0 = “Stable Weather Pattern”
1 = “Slowly rising Good Weather”, "Clear/Sunny "
2 = "Slowly falling L-Pressure ", "Cloudy/Rain "
3 = “Quickly rising H-Press”, “Not Stable”
4 = “Quickly falling L-Press”, “Thunderstorm”
5 = "Unknown (More Time needed)
*/

// Power down the radio. Note that the radio will get powered back up
// on the next write() call.
delay(1000); //delay to allow serial to fully print before sleep
gw.powerDown();
sleep.pwrDownMode(); //set sleep mode
sleep.sleepDelay(SLEEP_TIME * 1000); //sleep for: sleepTime
}

int sample(float pressure) {
// Algorithm found here
// http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
if (minuteCount > 180)
minuteCount = 6;

pressureSamples[minuteCount] = pressure;
minuteCount++;

if (minuteCount == 5) {
	// Avg pressure in first 5 min, value averaged from 0 to 5 min.
	pressureAvg[0] = ((pressureSamples[1] + pressureSamples[2]
			+ pressureSamples[3] + pressureSamples[4] + pressureSamples[5])
			/ 5);
} else if (minuteCount == 35) {
	// Avg pressure in 30 min, value averaged from 0 to 5 min.
	pressureAvg[1] = ((pressureSamples[30] + pressureSamples[31]
			+ pressureSamples[32] + pressureSamples[33]
			+ pressureSamples[34]) / 5);
	float change = (pressureAvg[1] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = ((65.0 / 1023.0) * 2 * change); // note this is for t = 0.5hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 1.5); // divide by 1.5 as this is the difference in time from 0 value.
} else if (minuteCount == 60) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[2] = ((pressureSamples[55] + pressureSamples[56]
			+ pressureSamples[57] + pressureSamples[58]
			+ pressureSamples[59]) / 5);
	float change = (pressureAvg[2] - pressureAvg[0]);
	if (firstRound) //first time initial 3 hour
		dP_dt = ((65.0 / 1023.0) * change); //note this is for t = 1 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 2); //divide by 2 as this is the difference in time from 0 value
} else if (minuteCount == 95) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[3] = ((pressureSamples[90] + pressureSamples[91]
			+ pressureSamples[92] + pressureSamples[93]
			+ pressureSamples[94]) / 5);
	float change = (pressureAvg[3] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 1.5); // note this is for t = 1.5 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 2.5); // divide by 2.5 as this is the difference in time from 0 value
} else if (minuteCount == 120) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[4] = ((pressureSamples[115] + pressureSamples[116]
			+ pressureSamples[117] + pressureSamples[118]
			+ pressureSamples[119]) / 5);
	float change = (pressureAvg[4] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 2); // note this is for t = 2 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 3); // divide by 3 as this is the difference in time from 0 value
} else if (minuteCount == 155) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[5] = ((pressureSamples[150] + pressureSamples[151]
			+ pressureSamples[152] + pressureSamples[153]
			+ pressureSamples[154]) / 5);
	float change = (pressureAvg[5] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 2.5); // note this is for t = 2.5 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 3.5); // divide by 3.5 as this is the difference in time from 0 value
} else if (minuteCount == 180) {
	// Avg pressure at end of the hour, value averaged from 0 to 5 min.
	pressureAvg[6] = ((pressureSamples[175] + pressureSamples[176]
			+ pressureSamples[177] + pressureSamples[178]
			+ pressureSamples[179]) / 5);
	float change = (pressureAvg[6] - pressureAvg[0]);
	if (firstRound) // first time initial 3 hour
		dP_dt = (((65.0 / 1023.0) * change) / 3); // note this is for t = 3 hour
	else
		dP_dt = (((65.0 / 1023.0) * change) / 4); // divide by 4 as this is the difference in time from 0 value
	pressureAvg[0] = pressureAvg[5]; // Equating the pressure at 0 to the pressure at 2 hour after 3 hours have past.
	firstRound = false; // flag to let you know that this is on the past 3 hour mark. Initialized to 0 outside main loop.
}

if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval.
	return 5; // Unknown, more time needed
else if (dP_dt < (-0.25))
	return 4; // Quickly falling LP, Thunderstorm, not stable
else if (dP_dt > 0.25)
	return 3; // Quickly rising HP, not stable weather
else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05)))
	return 2; // Slowly falling Low Pressure System, stable rainy weather
else if ((dP_dt > 0.05) && (dP_dt < 0.25))
	return 1; // Slowly rising HP stable good weather
else if ((dP_dt > (-0.05)) && (dP_dt < 0.05))
	return 0; // Stable weather
else
	return 5; // Unknown

}
[/code]

I didn’t have any issues with the sample function but maybe it’s different because I’m using the DHT22. I’m not sure which debug mode you’re referring to but I usually unplug the nano from the Vera and into my computer then use the serial monitor to debug. I’d be interested to hear what other people are doing for debugging though.

[quote=“petewill, post:2, topic:179645”]Mano,

I am very new at this myself but I was able to get the BMP085 sensor to work with the DHT22 last night. Here is the code I used:

I didn’t have any issues with the sample function but maybe it’s different because I’m using the DHT22. I’m not sure which debug mode you’re referring to but I usually unplug the nano from the Vera and into my computer then use the serial monitor to debug. I’d be interested to hear what other people are doing for debugging though.[/quote]

I used your code here petewill.

Thanks!

Glad it worked for you!