@peka VCC and GND on arduino is 5,337V and from Pin 3-6 to IN1-4 i messurt 4,3V
Update i can trigger the relay when i remove the jumper
A picture of my setup:
@peka VCC and GND on arduino is 5,337V and from Pin 3-6 to IN1-4 i messurt 4,3V
Update i can trigger the relay when i remove the jumper
A picture of my setup:
@Heinz Thank you.
I have made this sketch without errors.
// DHT-Sensor
// BMP085 Sensor
#include <SPI.h>
#include <MySensor.h>
#include <Wire.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
const bool sendAlways = true;
const float SEALEVEL = 688; // Westendorf
const float SEALEVEL_PRESSURE = 1013.25;
// ----------------------------------------------------------------------------
#define CHILD_ID_HUM 2
#define CHILD_ID_TEMP 3
#define HUMIDITY_SENSOR_DIGITAL_PIN 3
#define CHILD_ID_LIGHT 1
#define LIGHT_SENSOR_ANALOG_PIN 1
DHT dht;
float lastTemp;
float lastHum;
boolean metric = true;
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
// ----------------------------------------------------------------------------
#define BARO_CHILD 0
#define TEMP_CHILD 1
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
unsigned long SLEEP_TIME1 = 30000; // 1 minute required for forecast algorithm
unsigned long SLEEP_TIME2 = 30000; // 1 minute required for forecast algorithm
unsigned long SLEEP_TIME3 = 900000; // sleep time between reads (seconds * 1000 milliseconds)
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(1); // Digital Pressure Sensor
MySensor gw;
MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
int lastLightLevel;
int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point
int oldBatteryPcnt = 0;
/*
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)
*/
const char *weatherStrings[] = { "stable", "sunny", "cloudy", "unstable", "thunderstorm", "unknown" };
enum FORECAST
{
STABLE = 0, // Stable weather
SUNNY = 1, // Slowly rising HP stable good weather
CLOUDY = 2, // Slowly falling Low Pressure System, stable rainy weather
UNSTABLE = 3, // Quickly rising HP, not stable weather
THUNDERSTORM = 4, // Quickly falling LP, Thunderstorm, not stable
UNKNOWN = 5 // Unknown, more time needed
};
const char *situationStrings[] = { "very low", "low", "normal", "high", "very high" };
enum WEATHER_SITUATION
{
VERY_LOW_PRESSURE = 0, // Tiefdruck p>-7.5hPa
LOW_PRESSURE = 1, // Tiefdruck p>-2.5hPa
NORMAL_PRESSURE = 2, // Normal p <+/-02.5hPa
HIGH_PRESSURE = 3, // Hochdruck p>2.5hPa
VERY_HIGH_PRESSURE = 4, // Hochdruck p>7.5hPa
};
float lastPressure = -1;
float lastPressureTemp = -1;
int lastForecast = -1;
int lastSituation = NORMAL_PRESSURE;
const int LAST_SAMPLES_COUNT = 5;
float lastPressureSamples[LAST_SAMPLES_COUNT];
// get kPa/h be dividing hPa by 10
#define CONVERSION_FACTOR (1.0/10.0)
int minuteCount = 0;
bool firstRound = true;
// average value is used in forecast algorithm.
float pressureAvg;
// average after 2 hours is used as reference value for the next iteration.
float pressureAvg2;
float dP_dt;
MyMessage tempMsg(TEMP_CHILD, V_TEMP);
MyMessage pressureMsg(BARO_CHILD, V_PRESSURE);
MyMessage forecastMsg(BARO_CHILD, V_FORECAST);
MyMessage situationMsg(BARO_CHILD, V_VAR1);
MyMessage forecastMsg2(BARO_CHILD, V_VAR2);
void displaySensorDetails(void)
{
sensor_t sensor;
bmp.getSensor(&sensor);
Serial.println(F("------------------------------------"));
Serial.print(F("Sensor: ")); Serial.println(sensor.name);
Serial.print(F("Driver Ver: ")); Serial.println(sensor.version);
Serial.print(F("Unique ID: ")); Serial.println(sensor.sensor_id);
Serial.print(F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F(" hPa"));
Serial.print(F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F(" hPa"));
Serial.print(F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F(" hPa"));
Serial.println(F("------------------------------------"));
Serial.println(F(""));
delay(500);
}
void initPressureSensor()
{
if (!bmp.begin())
{
Serial.println(F("Could not find a valid BMP085 sensor, check wiring!"));
while (1) {}
}
displaySensorDetails();
}
void initHumiditySensor()
{
dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
}
void setup()
{
// use the 1.1 V internal reference
#if defined(__AVR_ATmega2560__)
analogReference(INTERNAL1V1);
#else
analogReference(INTERNAL);
#endif
gw.begin();
gw.sendSketchInfo("Weather Station Sensor", "2.1");
initPressureSensor();
initHumiditySensor();
gw.present(BARO_CHILD, S_BARO);
gw.present(TEMP_CHILD, S_TEMP);
gw.present(CHILD_ID_HUM, S_HUM);
gw.present(CHILD_ID_TEMP, S_TEMP);
gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
metric = gw.getConfig().isMetric;
int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
Serial.println(lightLevel);
if (lightLevel != lastLightLevel) {
gw.send(msg.set(lightLevel));
lastLightLevel = lightLevel;
}
gw.sleep(SLEEP_TIME);
}
int getWeatherSituation(float pressure)
{
int situation = NORMAL_PRESSURE;
float delta = pressure - SEALEVEL_PRESSURE;
if (delta > 7.5)
{
situation = VERY_HIGH_PRESSURE;
}
else if (delta > 2.5)
{
situation = HIGH_PRESSURE;
}
else if (delta < -7.5)
{
situation = VERY_LOW_PRESSURE;
}
else if (delta < -2.5)
{
situation = LOW_PRESSURE;
}
else
{
situation = NORMAL_PRESSURE;
}
return situation;
}
bool updatePressureSensor()
{
bool changed = false;
sensors_event_t event;
bmp.getEvent(&event);
if (event.pressure)
{
float absolutePressure = event.pressure;
Serial.print(F("abs Pressure = "));
Serial.print(absolutePressure);
Serial.println(F(" hPa"));
//float altitude = bmp.pressureToAltitude(SEALEVEL_PRESSURE, pressure);
//Serial.print(F("Altitude = "));
//Serial.print(altitude);
//Serial.println(F(" m"));
//sealevel pressure p0 from absolute pressure.
float pressure = bmp.seaLevelForAltitude(SEALEVEL, absolutePressure);
float pressureTemperature;
bmp.getTemperature(&pressureTemperature);
if (!metric)
{
// Convert to fahrenheit
pressureTemperature = pressureTemperature * 9.0 / 5.0 + 32.0;
}
int forecast = sample(pressure);
int situation = getWeatherSituation(pressure);
if (sendAlways || (pressureTemperature != lastPressureTemp))
{
changed = true;
lastPressureTemp = pressureTemperature;
Serial.print(F("Temperature = "));
Serial.print(pressureTemperature);
Serial.println(metric ? F(" *C") : F(" *F"));
if (!gw.send(tempMsg.set(lastPressureTemp, 1)))
{
lastPressureTemp = -1.0;
}
}
if (sendAlways || (pressure != lastPressure))
{
changed = true;
lastPressure = pressure;
Serial.print(F("sealevel Pressure = "));
Serial.print(pressure);
Serial.println(F(" hPa"));
if (!gw.send(pressureMsg.set(lastPressure, 1)))
{
lastPressure = -1.0;
}
}
if (sendAlways || (forecast != lastForecast))
{
changed = true;
lastForecast = forecast;
Serial.print(F("Forecast = "));
Serial.println(weatherStrings[forecast]);
if (gw.send(forecastMsg.set(weatherStrings[lastForecast])))
{
if (!gw.send(forecastMsg2.set(lastForecast)))
{
}
}
else
{
lastForecast = -1.0;
}
}
if (sendAlways || (situation != lastSituation))
{
changed = true;
lastSituation = situation;
Serial.print(F("Situation = "));
Serial.println(situationStrings[situation]);
if (!gw.send(situationMsg.set(lastSituation, 0)))
{
lastSituation = -1.0;
}
}
}
return changed;
}
bool updateHumiditySensor()
{
bool changed = false;
float temperature = dht.getTemperature();
float humidity = dht.getHumidity();
if (!isnan(temperature))
{
#ifdef SEND_WHEN_CHANGED
if (temperature != lastTemp)
#endif
{
lastTemp = temperature;
if (!metric)
{
temperature = dht.toFahrenheit(temperature);
}
changed = true;
Serial.print(F("T: "));
Serial.println(temperature);
if (!gw.send(msgTemp.set(temperature, 1)))
{
lastTemp = -1.0;
}
}
}
else
{
Serial.println(F("Failed reading temperature from DHT"));
}
if (!isnan(humidity))
{
#ifdef SEND_WHEN_CHANGED
if (humidity != lastHum)
#endif
{
lastHum = humidity;
changed = true;
Serial.print(F("H: "));
Serial.println(humidity);
if (!gw.send(msgHum.set(lastHum, 1)))
{
lastHum = -1.0;
}
}
}
else
{
Serial.println(F("Failed reading humidity from DHT"));
}
return changed;
}
void loop()
{
// get the battery Voltage
int sensorValue = analogRead(BATTERY_SENSE_PIN);
#ifdef DEBUG
Serial.println(sensorValue);
#endif
// 1M, 470K divider across battery and using internal ADC ref of 1.1V
// Sense point is bypassed with 0.1 uF cap to reduce noise at that point
// ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
// 3.44/1023 = Volts per bit = 0.003363075
float batteryV = sensorValue * 0.003363075;
int batteryPcnt = sensorValue / 10;
#ifdef DEBUG
Serial.print("Battery Voltage: ");
Serial.print(batteryV);
Serial.println(" V");
Serial.print("Battery percent: ");
Serial.print(batteryPcnt);
Serial.println(" %");
#endif
if (oldBatteryPcnt != batteryPcnt) {
// Power up radio after sleep
gw.sendBatteryLevel(batteryPcnt);
oldBatteryPcnt = batteryPcnt;
}
updatePressureSensor();
gw.sleep(SLEEP_TIME1);
updateHumiditySensor();
gw.sleep(SLEEP_TIME2);
gw.sleep(SLEEP_TIME3);
}
float getLastPressureSamplesAverage()
{
float lastPressureSamplesAverage = 0;
for (int i = 0; i < LAST_SAMPLES_COUNT; i++)
{
lastPressureSamplesAverage += lastPressureSamples[i];
}
lastPressureSamplesAverage /= LAST_SAMPLES_COUNT;
//Serial.print(F("### 5min-Average:"));
//Serial.print(lastPressureSamplesAverage);
//Serial.println(F(" hPa"));
return lastPressureSamplesAverage;
}
// Algorithm found here
// http://www.freescale.com/files/sensors/doc/app_note/AN3914.pdf
// Pressure in hPa --> forecast done by calculating kPa/h
int sample(float pressure)
{
// Calculate the average of the last n minutes.
int index = minuteCount % LAST_SAMPLES_COUNT;
lastPressureSamples[index] = pressure;
minuteCount++;
if (minuteCount > 185)
{
minuteCount = 6;
}
if (minuteCount == 5)
{
pressureAvg = getLastPressureSamplesAverage();
}
else if (minuteCount == 35)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change * 2; // note this is for t = 0.5hour
}
else
{
dP_dt = change / 1.5; // divide by 1.5 as this is the difference in time from 0 value.
}
}
else if (minuteCount == 65)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) //first time initial 3 hour
{
dP_dt = change; //note this is for t = 1 hour
}
else
{
dP_dt = change / 2; //divide by 2 as this is the difference in time from 0 value
}
}
else if (minuteCount == 95)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 1.5; // note this is for t = 1.5 hour
}
else
{
dP_dt = change / 2.5; // divide by 2.5 as this is the difference in time from 0 value
}
}
else if (minuteCount == 125)
{
float lastPressureAvg = getLastPressureSamplesAverage();
pressureAvg2 = lastPressureAvg; // store for later use.
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 2; // note this is for t = 2 hour
}
else
{
dP_dt = change / 3; // divide by 3 as this is the difference in time from 0 value
}
}
else if (minuteCount == 155)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 2.5; // note this is for t = 2.5 hour
}
else
{
dP_dt = change / 3.5; // divide by 3.5 as this is the difference in time from 0 value
}
}
else if (minuteCount == 185)
{
float lastPressureAvg = getLastPressureSamplesAverage();
float change = (lastPressureAvg - pressureAvg) * CONVERSION_FACTOR;
if (firstRound) // first time initial 3 hour
{
dP_dt = change / 3; // note this is for t = 3 hour
}
else
{
dP_dt = change / 4; // divide by 4 as this is the difference in time from 0 value
}
pressureAvg = pressureAvg2; // 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.
}
int forecast = UNKNOWN;
if (minuteCount < 35 && firstRound) //if time is less than 35 min on the first 3 hour interval.
{
forecast = UNKNOWN;
}
else if (dP_dt < (-0.25))
{
forecast = THUNDERSTORM;
}
else if (dP_dt > 0.25)
{
forecast = UNSTABLE;
}
else if ((dP_dt > (-0.25)) && (dP_dt < (-0.05)))
{
forecast = CLOUDY;
}
else if ((dP_dt > 0.05) && (dP_dt < 0.25))
{
forecast = SUNNY;
}
else if ((dP_dt >(-0.05)) && (dP_dt < 0.05))
{
forecast = STABLE;
}
else
{
forecast = UNKNOWN;
}
Serial.print(F("Forecast at minute "));
Serial.print(minuteCount);
Serial.print(F(" dP/dt = "));
Serial.print(dP_dt);
Serial.print(F("kPa/h --> "));
Serial.println(weatherStrings[forecast]);
return forecast;
}```