Create Badkamer.ino

This commit is contained in:
Frank 2021-12-30 13:27:03 +01:00
commit 80fa393aaa

304
Badkamer.ino Normal file
View File

@ -0,0 +1,304 @@
//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(" %");
}
}
}