#include "DHT.h" //install this library from Library Manager and
//install the additional library it requests while doing so
#define DHTPIN A0 //the digital pin # on wheatIndexCh sensor OUT is connected to
#define DHTTYPE DHT22 //sensor type (there is a DHT11 available as well)
DHT dht(DHTPIN, DHTTYPE); //DHT library function
#define DOOR_ACTUATION_TIME 500
#define MEASURE_RESFRESH 2500
//#define DISPLAY_RESFRESH 5000
#define OPEN 1
#define CLOSED 0
#define ON 1
#define OFF 0
#define FAHRENHEIT true
#define CELSIUS false
//pin assignment
int open_door_relay = 7;
int close_door_relay = 8;
int heated_matts_relay_1 = 9;
int heated_matts_relay_2 = 10;
//Actuator door open and close temperature values in celsius - can be changed to suit application needs
int open_door_temp = 23;
int close_door_temp = 21;
int turn_mat_on_temp = 25; // power on heated matts
int turn_mat_off_temp = 35; // power off heated matts
float humidity;
float temperatureC;
float temperatureF;
float heatIndexC;
// float heatIndexF;
void setup() {
Serial.begin(115200);
Serial.println(F("DHTxx test!"));
dht.begin();
pinMode(open_door_relay, OUTPUT);
pinMode(close_door_relay, OUTPUT);
pinMode(heated_matts_relay_1, OUTPUT);
pinMode(heated_matts_relay_2, OUTPUT);
// deactivating relays
digitalWrite(open_door_relay, LOW);
digitalWrite(close_door_relay, LOW);
digitalWrite(heated_matts_relay_1, LOW);
digitalWrite(heated_matts_relay_2, LOW);
humidity = dht.readHumidity();
temperatureC = dht.readTemperature(CELSIUS);
temperatureF = dht.readTemperature(FAHRENHEIT);
if (isnan(humidity) || isnan(temperatureC) || isnan(temperatureF)) {
Serial.println(F("Failed to read from DHT sensor!"));
while(true) { delay(1000); }
} else {
heatIndexC = dht.computeHeatIndex(temperatureC, humidity);
// heatIndexF = dht.computeHeatIndex(newTemperatureF, newHumidity);
}
}
void loop() {
static uint32_t doorRelayTimer;
static uint32_t measureTimer;
// static uint32_t displayTimer;
static int8_t doorIs = CLOSED;
static int8_t doorShouldBe = CLOSED;
static int8_t heatedMatts = OFF;
// static float prevHeatIndexC = 0;
if(millis() - measureTimer > MEASURE_RESFRESH) {
measureTimer = millis();
digitalWrite(LED_BUILTIN, HIGH);
float newHumidity = dht.readHumidity();
float newTemperatureC = dht.readTemperature(CELSIUS);
float newTemperatureF = dht.readTemperature(FAHRENHEIT);
if (isnan(newHumidity) || isnan(newTemperatureC) || isnan(newTemperatureF)) {
Serial.println(F("Failed to read from DHT sensor!"));
} else {
heatIndexC = dht.computeHeatIndex(newTemperatureC, newHumidity);
// heatIndexF = dht.computeHeatIndex(newTemperatureF, newHumidity);
Serial.print(F("heat Index "));
Serial.print(heatIndexC);
Serial.println("°C");
}
digitalWrite(LED_BUILTIN, LOW);
}
/*
if(prevHeatIndexC != heatIndexC) {
prevHeatIndexC = heatIndexC;
Serial.print(F("heat Index "));
Serial.print(heatIndexC);
Serial.println("°C");
}
if(millis() - displayTimer > DISPLAY_RESFRESH) {
displayTimer = millis();
Serial.print(F("heat Index "));
Serial.print(heatIndexC);
Serial.println("°C");
}
*/
if (doorShouldBe == CLOSED && heatIndexC >= open_door_temp) { //if the temperature value is higher than 27C, extend actuator
doorShouldBe = OPEN;
digitalWrite(open_door_relay, HIGH);
digitalWrite(close_door_relay, LOW);
doorRelayTimer = millis();
Serial.println(F("opening door"));
Serial.println(heatIndexC);
}
else if (doorShouldBe == OPEN && heatIndexC <= close_door_temp) { //if the temperature value is lower than 24C, retract actuator
doorShouldBe = CLOSED;
digitalWrite(open_door_relay, LOW);
digitalWrite(close_door_relay, HIGH);
doorRelayTimer = millis();
Serial.println(F("closing door"));
Serial.println(heatIndexC);
}
if(doorIs != doorShouldBe && millis() - doorRelayTimer > DOOR_ACTUATION_TIME) {
doorIs = doorShouldBe;
digitalWrite(open_door_relay, LOW);
digitalWrite(close_door_relay, LOW);
Serial.print(F("door is "));
Serial.println(doorIs? "opened" : "closed");
}
if (heatedMatts == ON && heatIndexC >= turn_mat_off_temp) { //if the temperature value is higher than 35C, turn off relay
digitalWrite(heated_matts_relay_1, LOW);
digitalWrite(heated_matts_relay_2, LOW);
heatedMatts = OFF;
Serial.println(F("heated matts off"));
Serial.println(heatIndexC);
}
else if (heatedMatts == OFF && heatIndexC <= turn_mat_on_temp) { //if the temperature value is lower than 25C, turn on relay
digitalWrite(heated_matts_relay_1, HIGH);
digitalWrite(heated_matts_relay_2, HIGH);
heatedMatts = ON;
Serial.println(F("heated matts on"));
Serial.println(heatIndexC);
}
}