I did delete it but understand now why I shouldn't have. I will re-add it (different device id) and let you know. It may take a little while as I am waiting for some radios with external antennas and an finding in the meantime that my radio reception is too limited to proceed.
Posts made by Myles L
-
RE: Barometric Pressure Sensor Using MS5637
-
RE: Barometric Pressure Sensor Using MS5637
Ok, so close! Adding back the rest I get and endless string of � in the serial monitor and nothing adds to Vera.
I don't actually need the temp (tried commenting it out but could not get it to compile) if that makes it easier?
Here is what I have:
#include <SPI.h>
#include <MySensor.h>
#include <Wire.h>
#include <BaroSensor.h>#define BARO_CHILD 0
#define TEMP_CHILD 1
#define DEVICE_ID 99unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in seconds)
MySensor gw;
float lastPressure = -1;
float lastTemp = -1;
int lastForecast = -1;
const 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;
boolean metric;
MyMessage tempMsg(TEMP_CHILD, V_TEMP);
MyMessage pressureMsg(BARO_CHILD, V_PRESSURE);
MyMessage forecastMsg(BARO_CHILD, V_FORECAST);void setup()
{
Serial.begin(9600);
gw.begin(NULL, DEVICE_ID, false);
delay(1000);
Serial.println("Got to GW.Begin");
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Pressure Sensor", "1.0");
Serial.println("Sketch data Presented");
delay(1000);
BaroSensor.begin();
Serial.println("Brometer Sensor started...");
delay(1000);
// Register sensors to gw (they will be created as child devices)
gw.present(BARO_CHILD, S_BARO);
Serial.println("presenting Barometer");
delay(1000);
gw.present(TEMP_CHILD, S_TEMP);
Serial.println("presenting Thermometer");
delay(1000);
metric = gw.getConfig().isMetric;
Serial.println("requesting Metric");
delay(1000);
Serial.println("Setup Complete");
}void loop()
{
if(!BaroSensor.isOK())
{
Serial.print("Sensor not Found/OK. Error: ");
Serial.println(BaroSensor.getError());
BaroSensor.begin(); // Try to reinitialise the sensor if we can
}float pressure = BaroSensor.getPressure()/100;
float temperature = BaroSensor.getTemperature();
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.send(tempMsg.set(temperature,1));
lastTemp = temperature;
}if (pressure != lastPressure) {
gw.send(pressureMsg.set(pressure, 0));
lastPressure = pressure;
}if (forecast != lastForecast)
{
gw.send(forecastMsg.set(weather[forecast]));
lastForecast = forecast;
}/*
DP/Dt explanation0 = "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)
*/gw.sleep(SLEEP_TIME);
}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
} -
RE: Barometric Pressure Sensor Using MS5637
Using that sketch I was able to add it to Vera, it just does not report pressure or forecast (obviously as there is no data being presented to it)
-
RE: Barometric Pressure Sensor Using MS5637
The Sensor and Ethernet gateway both have 4.7uf electrolytic capacitors across the power input of the radio's (I cant get much distance out of them, maybe <10 metres, but they do work for the relay sensor).
The serial output looks like this: ��Ah���Y5����������i��`q!���J�����
-
RE: Barometric Pressure Sensor Using MS5637
I have deleted the Vera devices and I have also tried removing and re-adding the MySensors plugin in Vera. When I add the pressure sensor now it still adds as a node. Code is below:
#include <SPI.h>
#include <MySensor.h>
#include <Wire.h>
#include <BaroSensor.h>#define BARO_CHILD 0
#define TEMP_CHILD 1unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in seconds)
MySensor gw;
float lastPressure = -1;
float lastTemp = -1;
int lastForecast = -1;
const 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;
boolean metric;
MyMessage tempMsg(TEMP_CHILD, V_TEMP);
MyMessage pressureMsg(BARO_CHILD, V_PRESSURE);
MyMessage forecastMsg(BARO_CHILD, V_FORECAST);void setup() {
gw.begin(NULL, false);// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Pressure Sensor", "1.0");
delay(1000);
BaroSensor.begin();
delay(1000);
// Register sensors to gw (they will be created as child devices)
gw.present(BARO_CHILD, S_BARO);
delay(1000);
gw.present(TEMP_CHILD, S_TEMP);
delay(1000);
metric = gw.getConfig().isMetric;
}void loop()
{
if(!BaroSensor.isOK())
{
Serial.print("Sensor not Found/OK. Error: ");
Serial.println(BaroSensor.getError());
BaroSensor.begin(); // Try to reinitialise the sensor if we can
}float pressure = BaroSensor.getPressure()/100;
float temperature = BaroSensor.getTemperature();
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.send(tempMsg.set(temperature,1));
lastTemp = temperature;
}if (pressure != lastPressure) {
gw.send(pressureMsg.set(pressure, 0));
lastPressure = pressure;
}if (forecast != lastForecast)
{
gw.send(forecastMsg.set(weather[forecast]));
lastForecast = forecast;
}/*
DP/Dt explanation0 = "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)
*/gw.sleep(SLEEP_TIME);
}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
}
-
RE: Barometric Pressure Sensor Using MS5637
By adding those changes it went back to not outputting to the serial interface. I was able to get it to output again by removing the DEFINE DEVICE ID and the DEVICE ID section (not sure why that made a difference) but then it goes back to only adding a node to Vera.
Really appreciate your determination to solve this and I am learning lots along the way!
-
RE: Barometric Pressure Sensor Using MS5637
Tried delays right up to 5000 and also added a few others but unfortunately it still only presents the repeater node to Vera
-
RE: Barometric Pressure Sensor Using MS5637
Thank you so much, it is so close. Code compiles, uploads and there is output from the serial monitor but when adding the device to Vera only a repeater node gets added and not the actual pressure sensor.
The additional pressure sensor files have been uploaded to Vera.
-
RE: Relay Actuator On/Off Status Reversed
Works like a charm. For anyone else having the same problem I had to upload the sketch as normal, add the device to vera then modify the sketch using griffinsaic suggestion for it to work. Thanks again
-
RE: Relay Actuator On/Off Status Reversed
Thanks, I did try that as it seemed like the logical choice but no success. now that I know it works I will be more persistent!
-
RE: Relay Actuator On/Off Status Reversed
The relay actuator sketch 'RelayActuator.ino'
// Example sketch showing how to control physical relays.
// This example will remember relay state even after power failure.#include <MySensor.h>
#include <SPI.h>#define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1 // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relayMySensor gw;
void setup()
{
// Initialize library and add callback for incoming messages
gw.begin(incomingMessage, AUTO, true);
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Relay", "1.0");// Fetch relay status
for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices)
gw.present(sensor, S_LIGHT);
// Then set relay pins in output mode
pinMode(pin, OUTPUT);
// Set relay to last known state (using eeprom storage)
digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
}
}void loop()
{
// Alway process incoming messages whenever possible
gw.process();
}void incomingMessage(const MyMessage &message) {
// We only expect one type of message from controller. But we better check anyway.
if (message.type==V_LIGHT) {
// Change relay state
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
// Store state in eeprom
gw.saveState(message.sensor, message.getBool());
// Write some debug info
Serial.print("Incoming change for sensor:");
Serial.print(message.sensor);
Serial.print(", New status: ");
Serial.println(message.getBool());
}
} -
RE: Relay Actuator On/Off Status Reversed
Thanks, I checked the relay specs and it is active low but so is the relay in the suggested buying guide. Is there a way to mod the sketch to send 5v to the active low modules so that the relay is only triggered when the voltage drops, correcting the reversed on/off indicator?
-
Relay Actuator On/Off Status Reversed
Hello,
I am currently using the relay actuator sketch to control 6 relays for an irrigation control system using Vera (VeraLite, UI7, Ethernet gateway) but for some reason the on/off status of the devices is showing up in reverse in Vera (off when on and on when off). I could use the normally closed contacts on the relays to correct the problem but then the relays would be constantly on when the irrigation solenoids are off.
Any suggestions on how to correct the problem are welcome, thanks.
-
RE: Barometric Pressure Sensor Using MS5637
Yes, I have that. It is just a really a really basic sketch that prints the sensor data to a serial output. I am also very interested in the weather forecast part of the MySensors sketch which is why I was trying to mod it.
#include <Wire.h>
#include <BaroSensor.h>void setup()
{
Serial.begin(9600);
BaroSensor.begin();
}void loop()
{
if(!BaroSensor.isOK()) {
Serial.print("Sensor not Found/OK. Error: ");
Serial.println(BaroSensor.getError());
BaroSensor.begin(); // Try to reinitialise the sensor if we can
}
else {
Serial.print("Temperature: ");
Serial.println(BaroSensor.getTemperature());
Serial.print("Pressure: ");
Serial.println(BaroSensor.getPressure());
}
delay(1000);
} -
RE: Barometric Pressure Sensor Using MS5637
Thanks, I added debug prints after each line but still get nothing on the serial monitor. Does that mean I can assume that the problem is in the initial setup section (the code before void setup(){)?
I couldn't find a way to add debug prints to that section but any suggestions on how to are welcome.
-
RE: Barometric Pressure Sensor Using MS5637
Sorry about that, I changed
#include <Adafruit_BMP085.h> changed to #include <BaroSensor.h> (Alternate library files for different baro sensor)
Adafruit_BMP085 bmp = Adafruit_BMP085(); changed to BaroSensorClass bmp = BaroSensorClass(); (BaroSensorClass is referenced in the library files)
float pressure = bmp.readSealevelPressure(205)/100; **changed to ** float pressure = bmp.getPressure(); (also referenced in the library)
float temperature = bmp.readTemperature(); changed to float temperature = bmp.getTemperature(); (same reason)
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) { } **changed to ** bmp.begin(); (Could not get the sketch to compile using the original so changed to just start the baro sensor)Thanks again.
-
Barometric Pressure Sensor Using MS5637
Hello
Very new to Arduino and MySensors so please excuse any novice mistakes. I am trying to get the Pressure Sensor sketch to work with a different pressure sensor http://www.freetronics.com.au/collections/modules/products/barometric-pressure-sensor-module#.VLSnlNH9mUk
I have modified the code (included below) but when I try to add it to Vera (VeraLite, UI7, Ethernet Gateway, and yes it does work with other sensors surprisingly!) no new device is included and when I open a serial monitor no response is available. I have confirmed the pressure sensor itself is working using a different sketch. Any suggestions would be appreciated.
#include <SPI.h>
#include <MySensor.h>
#include <Wire.h>
#include <BaroSensor.h>#define BARO_CHILD 0
#define TEMP_CHILD 1unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in seconds)
BaroSensorClass bmp = BaroSensorClass(); // Digital Pressure Sensor
MySensor gw;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;
boolean metric;
MyMessage tempMsg(TEMP_CHILD, V_TEMP);
MyMessage pressureMsg(BARO_CHILD, V_PRESSURE);
MyMessage forecastMsg(BARO_CHILD, V_FORECAST);void setup() {
gw.begin();// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Pressure Sensor", "1.0");bmp.begin();
// Serial.println("Could not find a valid sensor, check wiring!");
//while (1) { }
//}// Register sensors to gw (they will be created as child devices)
gw.present(BARO_CHILD, S_BARO);
gw.present(TEMP_CHILD, S_TEMP);
metric = gw.getConfig().isMetric;
}void loop() {
float pressure = bmp.getPressure(); //(205)/100; // 205 meters above sealevel
float temperature = bmp.getTemperature();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.send(tempMsg.set(temperature,1));
lastTemp = temperature;
}if (pressure != lastPressure) {
gw.send(pressureMsg.set(pressure, 0));
lastPressure = pressure;
}if (forecast != lastForecast) {
gw.send(forecastMsg.set(weather[forecast]));
lastForecast = forecast;
}/*
DP/Dt explanation0 = "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)
*/gw.sleep(SLEEP_TIME);
}int sample(float pressure) {
// Algorithm found here
// http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
if (minuteCount == 180)
minuteCount = 5;pressureSamples[minuteCount] = pressure; minuteCount++; if (minuteCount == 5) { // Avg pressure in first 5 min, value averaged from 0 to 5 min. pressureAvg[0] = ((pressureSamples[0] + pressureSamples[1] + pressureSamples[2] + pressureSamples[3] + pressureSamples[4]) / 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
}