/**
   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);
}