/**
ESP32 + DHT22 PUMP and VALVES control
https://wokwi.com/projects/340876993056735827
*/
#include "DHTesp.h"
const int DHT_PIN_HUMIDITY[] = {15 ,18, 19, 21, 22, 23};
const int FREEZE_PIN = 2;
const int PUMP_PIN = 27;
const int DHT_PIN_TEMP = 13;
const int VALVE_PIN[] = {14, 26, 25, 33, 32, 12};
int actualValveOpened[] = {0, 0, 0, 0, 0, 0};
int freezeOpened;
int myIndex;
DHTesp dhtSensor[6];
DHTesp freezeSensor;
TempAndHumidity data[6];
TempAndHumidity freezeData;
int numberOfOpenedValve(){
int sum = 0;
for(int i = 0; i < 6; i++){
if(actualValveOpened[i] == 1){
sum++;
}
}
return sum;
}
void setup() {
Serial.begin(9600);
for(int i = 0; i < 6; i++)
{
dhtSensor[i].setup(DHT_PIN_HUMIDITY[i], DHTesp::DHT22);
pinMode(VALVE_PIN[i], OUTPUT);
}
pinMode(PUMP_PIN, OUTPUT);
pinMode(FREEZE_PIN, OUTPUT);
freezeSensor.setup(DHT_PIN_TEMP, DHTesp::DHT22);
freezeOpened = 0;
myIndex = 0;
}
void loop() {
if(myIndex < 6){
/*************CODE FOR VALVE**************/
data[myIndex] = dhtSensor[myIndex].getTempAndHumidity();
if(data[myIndex].temperature > 4){
if(numberOfOpenedValve() > 0){
digitalWrite(PUMP_PIN, HIGH);
}else{
digitalWrite(PUMP_PIN, LOW);
}
if(numberOfOpenedValve() < 3 && data[myIndex].humidity < 30){
digitalWrite(VALVE_PIN[myIndex], HIGH);
actualValveOpened[myIndex] = 1;
}
if(data[myIndex].humidity > 80 && actualValveOpened[myIndex] == 1){
digitalWrite(VALVE_PIN[myIndex], LOW);
actualValveOpened[myIndex] = 0;
}
} else {
digitalWrite(VALVE_PIN[myIndex], LOW);
actualValveOpened[myIndex] = 0;
digitalWrite(PUMP_PIN, LOW);
}
Serial.print("h" + String(myIndex + 1) + ":" + String(data[myIndex].humidity, 1) + "% | ");
/***************************/
}
myIndex++;
if (myIndex == 6){
/*************CODE FOR UNFREEZE**************/
freezeData = freezeSensor.getTempAndHumidity();
Serial.println("T: " + String(freezeData.temperature, 2) + " °C");
if(freezeData.temperature < 0 && freezeData.humidity > 50 ){
freezeOpened = 1;
digitalWrite(FREEZE_PIN, HIGH);
}
if(freezeData.temperature > 4 && freezeOpened == 1 ){
freezeOpened = 0;
digitalWrite(FREEZE_PIN, LOW);
}
/***************************/
myIndex = 0;
}
delay(10);
}