305 lines
7.8 KiB
C++
305 lines
7.8 KiB
C++
//Badkamer
|
|
|
|
// Enable debug prints to serial monitor
|
|
#define MY_DEBUG
|
|
|
|
// Enable and select radio type attached
|
|
#define MY_RADIO_NRF24
|
|
//#define MY_RADIO_RFM69
|
|
|
|
// Enable repeater functionality for this node
|
|
#define MY_REPEATER_FEATURE
|
|
|
|
#include <SPI.h>
|
|
#include <MySensors.h>
|
|
#include <DHT.h>
|
|
|
|
#define SLEEP_MODE false // Watt-value can only be reported when sleep mode is false.
|
|
|
|
#define CHILD_ID_HUM 0
|
|
#define CHILD_ID_TEMP 1
|
|
#define HUMIDITY_SENSOR_DIGITAL_PIN 3
|
|
|
|
#define RELAY_PIN 4 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
|
|
#define CHILD_ID_RELAY10 2 // Total number of attached relays
|
|
#define CHILD_ID_RELAY30 3 // Total number of attached relays
|
|
#define CHILD_ID_ENABLED 4 // 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 relay
|
|
#define CHILD_ID_SETPOINT 10 //Setpoint
|
|
|
|
//#define HUM_VENTILATION_ON 50
|
|
//#define TIME_ON10 60000
|
|
//#define TIME_ON30 180000
|
|
//#define CHECK_FREQ_30s 3000
|
|
//#define CHECK_FREQ_5m 30000
|
|
|
|
//#define HUM_VENTILATION_ON 70
|
|
#define HUM_VENTILATION_ONMAX 95
|
|
#define TIME_ON10 600000
|
|
#define TIME_ON30 1800000
|
|
#define CHECK_FREQ_30s 30000
|
|
#define CHECK_FREQ_5m 300000
|
|
|
|
DHT dht;
|
|
float lastTemp;
|
|
float lastHum;
|
|
boolean metric = true;
|
|
|
|
unsigned long currentTime;
|
|
unsigned long SEND_FREQUENCY = 300000;
|
|
unsigned long CHECK_FREQUENCY = 30000;
|
|
unsigned long lastSend;
|
|
unsigned long lastCheck;
|
|
unsigned long lastOn10;
|
|
unsigned long lastOn30;
|
|
boolean On10 = false;
|
|
boolean On30 = false;
|
|
boolean Check_Enabled = true;
|
|
int COUNT_ON = 0;
|
|
int HUM_VENTILATION_ON=70;
|
|
|
|
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
|
|
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);
|
|
MyMessage msgRelay10(CHILD_ID_RELAY10, V_LIGHT);
|
|
MyMessage msgRelay30(CHILD_ID_RELAY30, V_LIGHT);
|
|
MyMessage msgEnabled(CHILD_ID_ENABLED, V_LIGHT);
|
|
MyMessage msgSetpoint(CHILD_ID_SETPOINT, V_DIMMER);
|
|
|
|
//Setup routine
|
|
void setup()
|
|
{
|
|
|
|
// Initialize library and add callback for incoming messages
|
|
|
|
//gw.begin(incomingMessage);
|
|
|
|
dht.setup(HUMIDITY_SENSOR_DIGITAL_PIN);
|
|
|
|
pinMode(RELAY_PIN, OUTPUT);
|
|
digitalWrite(RELAY_PIN, RELAY_OFF);
|
|
|
|
send(msgRelay10.set(RELAY_OFF));
|
|
send(msgRelay30.set(RELAY_OFF));
|
|
send(msgEnabled.set(RELAY_ON));
|
|
|
|
metric = getControllerConfig().isMetric;
|
|
// metric = getConfig().isMetric;
|
|
lastSend = 0;
|
|
lastCheck = 0;
|
|
|
|
//Request Setpoint
|
|
//gw.request(CHILD_ID_SETPOINT, V_DIMMER);
|
|
send(msgSetpoint.set(HUM_VENTILATION_ON));
|
|
}
|
|
|
|
|
|
|
|
void presentation()
|
|
{
|
|
// Send the Sketch Version Information to the Gateway
|
|
sendSketchInfo("Badkamer", "1.7");
|
|
|
|
// Register all sensors to gw (they will be created as child devices)
|
|
present(CHILD_ID_HUM, S_HUM);
|
|
present(CHILD_ID_TEMP, S_TEMP);
|
|
present(CHILD_ID_RELAY10, S_LIGHT);
|
|
present(CHILD_ID_RELAY30, S_LIGHT);
|
|
present(CHILD_ID_ENABLED, S_LIGHT);
|
|
present(CHILD_ID_SETPOINT, S_DIMMER);
|
|
|
|
|
|
}
|
|
|
|
//Main loop
|
|
void loop()
|
|
{
|
|
|
|
|
|
// gw.process();
|
|
|
|
currentTime = millis();
|
|
|
|
//If milis goes to 0
|
|
if(lastCheck > currentTime)
|
|
lastCheck = currentTime;
|
|
if(lastSend > currentTime)
|
|
lastSend = currentTime;
|
|
if(lastOn30 > currentTime)
|
|
lastOn30 = currentTime;
|
|
if(lastOn10 > currentTime)
|
|
lastOn10 = currentTime;
|
|
|
|
//wait(dht.getMinimumSamplingPeriod());
|
|
|
|
//Set switch on Domoticz to off after 10 min
|
|
if(On10 && (currentTime > (lastOn10 + TIME_ON10)))
|
|
{
|
|
Serial.println("Ventilation Off --> Domoticz");
|
|
send(msgRelay10.set(RELAY_OFF));
|
|
On10 = false;
|
|
}
|
|
|
|
//Set switch on Domoticz to off after 30 min
|
|
if(On30 && (currentTime > (lastOn30 + TIME_ON30)))
|
|
{
|
|
Serial.println("Ventilation Off --> Domoticz");
|
|
send(msgRelay30.set(RELAY_OFF));
|
|
On30 = false;
|
|
}
|
|
|
|
//Check every 30 sec the HUMIDITY if it is above 70% then switch ventilation on and change check frequence to 5min.
|
|
if(((currentTime - lastCheck) > CHECK_FREQUENCY))
|
|
{
|
|
lastCheck=currentTime;
|
|
float humidity = dht.getHumidity();
|
|
if (isnan(humidity))
|
|
{
|
|
Serial.println("Failed reading humidity from DHT");
|
|
}
|
|
//Check if HUM > 70 and check enabled or HUM > 95
|
|
else if ((humidity > HUM_VENTILATION_ON && Check_Enabled) || humidity > HUM_VENTILATION_ONMAX)
|
|
{
|
|
if (COUNT_ON < 3)
|
|
{
|
|
send(msgHum.set(humidity, 1));
|
|
Serial.println("Humidity > ");
|
|
Serial.print(HUM_VENTILATION_ON);
|
|
Serial.println("% --> Ventilation on for 10 minuts");
|
|
|
|
send(msgRelay10.set(RELAY_ON));
|
|
lastOn10=currentTime;
|
|
On10=true;
|
|
digitalWrite(RELAY_PIN, RELAY_ON);
|
|
wait(1000);
|
|
digitalWrite(RELAY_PIN, RELAY_OFF);
|
|
Serial.println("Humidity > ");
|
|
Serial.print(HUM_VENTILATION_ON);
|
|
Serial.println("% --> Check every 5min");
|
|
COUNT_ON = COUNT_ON + 1;
|
|
}
|
|
else
|
|
{
|
|
Serial.println("Humidity > ");
|
|
Serial.print(HUM_VENTILATION_ON);
|
|
Serial.println("% --> Ventilation already 3 times on !");
|
|
|
|
}
|
|
CHECK_FREQUENCY = CHECK_FREQ_5m;
|
|
lastHum = humidity;
|
|
}
|
|
else if (humidity <= HUM_VENTILATION_ON)
|
|
{
|
|
if (lastHum > HUM_VENTILATION_ON)
|
|
{
|
|
send(msgHum.set(humidity, 1));
|
|
lastHum = humidity;
|
|
}
|
|
Serial.print("Humidity < ");
|
|
Serial.print(HUM_VENTILATION_ON);
|
|
Serial.println("% --> Check every 30sec");
|
|
CHECK_FREQUENCY = CHECK_FREQ_30s;
|
|
COUNT_ON = 0;
|
|
}
|
|
}
|
|
|
|
|
|
//Send data only every 5 minuts
|
|
bool sendTime = (currentTime - lastSend) > SEND_FREQUENCY;
|
|
if ((currentTime - lastSend) > SEND_FREQUENCY)
|
|
{
|
|
lastSend=currentTime;
|
|
float temperature = dht.getTemperature();
|
|
if (isnan(temperature))
|
|
{
|
|
Serial.println("Failed reading temperature from DHT");
|
|
}
|
|
else if (temperature != lastTemp)
|
|
{
|
|
lastTemp = temperature;
|
|
if (!metric)
|
|
{
|
|
temperature = dht.toFahrenheit(temperature);
|
|
}
|
|
send(msgTemp.set(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;
|
|
send(msgHum.set(humidity, 1));
|
|
Serial.print("H: ");
|
|
Serial.println(humidity);
|
|
}
|
|
}
|
|
if(lastCheck > currentTime)
|
|
lastCheck = currentTime;
|
|
if(lastSend > currentTime)
|
|
lastSend = currentTime;
|
|
|
|
}
|
|
|
|
// Check incomming messages
|
|
void receive(const MyMessage &message)
|
|
{
|
|
//Message of type V_LIGHT ?
|
|
if (message.type==V_LIGHT)
|
|
{
|
|
//Button 10min.
|
|
if (message.sensor==CHILD_ID_RELAY10 && message.getBool()==1)
|
|
{
|
|
Serial.println("Domoticz --> Ventilation on for 10 minuts");
|
|
digitalWrite(RELAY_PIN, RELAY_ON);
|
|
On10=true;
|
|
lastOn10=currentTime;
|
|
wait(1000);
|
|
digitalWrite(RELAY_PIN, RELAY_OFF);
|
|
}
|
|
//Button 30min.
|
|
if (message.sensor==CHILD_ID_RELAY30 && message.getBool()==1)
|
|
{
|
|
Serial.println("Domoticz --> Ventilation on for 30 minuts");
|
|
digitalWrite(RELAY_PIN, RELAY_ON);
|
|
On30=true;
|
|
lastOn30=currentTime;
|
|
wait(3000);
|
|
digitalWrite(RELAY_PIN, RELAY_OFF);
|
|
}
|
|
if (message.sensor==CHILD_ID_ENABLED)
|
|
{
|
|
if(message.getBool()==1)
|
|
{
|
|
Check_Enabled = true;
|
|
Serial.println("Domoticz --> Ventilation Enabled, checking humidity !!");
|
|
}
|
|
else
|
|
{
|
|
Check_Enabled = false;
|
|
Serial.println("Domoticz --> Ventilation Disabled, outside humidity also high !?");
|
|
}
|
|
}
|
|
}
|
|
|
|
//Message of type V_DIMMER ?
|
|
if (message.type==V_DIMMER)
|
|
{
|
|
if (message.sensor==CHILD_ID_SETPOINT)
|
|
{
|
|
HUM_VENTILATION_ON=message.getInt();
|
|
Serial.print("Domoticz --> Setpoint received : ");
|
|
Serial.print(HUM_VENTILATION_ON);
|
|
Serial.println(" %");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|