/* Simulatore Tergicristallo Anteriore Auto 
ON/ OFF, 2 Velocità (Normale / Veloce)
Azionamento Manuale in mod. Veloce
Azionamento Automatico con Sensore di umidità */

// Creazione Sensore di Umidità e Temperatura
#include <DHT.h> // Libreria Sensore DHT (DHT Sensor Library)
#define DHTPIN 8    // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

// Creazione Servo
#include <Servo.h> // Libreria Servo
// Locking mechanism definitions */
#define SERVO_PIN 6 // Pin a cui è collegato
#define SERVO_LOCK_POS   0 // Posizione Finale
#define SERVO_UNLOCK_POS 180 // Posizione Iniziale / di Stop
Servo Tergicristallo;

// Definizione Pin IN / OUY
const int In = 2; // Interruttore ON / OFG
const int High = 4; // Selettore Velocità
const int Man = 7; // Comando Manuale
int val1 = 0; // Variabile Stato In
int val2 = 0; // Variabile Stato Man
int val3 = 0; // Varianile Stato High
#define LED_BUILTIN 13 // Led Interno al pin 13
#define LED_HR 12 // Led Umidità superiore al 70%

// Variabili di Tempo (In fase di Test)
unsigned long Time;

void setup() {
Serial.begin(9600); // Inizializza Stampante Seriale
dht.begin(); // Inizializza Sensore DHT
Tergicristallo.attach(6); // Inizializza Servo al pin 6
pinMode(In, INPUT); // Imposta In come ingresso
pinMode(High, INPUT); // Imposta Man come ingresso
pinMode(LED_BUILTIN, OUTPUT); // Imposta Led interno come uscita
pinMode(LED_HR, OUTPUT); // Imposta Led Umidità come uscita
Time = millis; // Associa funzione tempo millis a Time
}

void loop() {
// Leggi l'umidità
float h = dht.readHumidity();
// Se l'umidità è superiore al 70% (ad esempio), attiva l'uscita digitale 12
if (h > 70) {
  digitalWrite(LED_HR, HIGH);
  } else {
  digitalWrite(LED_HR, LOW);
  }
  // Stampa Valore Umidità su Stampante Seriale
  Serial.print("Umidità: ");
  Serial.print(h);
  Serial.println("%  ");
  
  // Associa Ingresso alle variabili 1 e 2
  val1 = digitalRead(In); // val1 = In
  val2 = digitalRead(Man); // val = Man

  // In (val1) è On o se l'umidità è > 50%, e Man (val2) è Off ...
  if (((val1 == HIGH || h > 50) && h < 75) && val2 == LOW) {
     Sel_Vel(); // Avvia Ciclo Tergicristallo
     }

  // Se In (val1) e Man (val2) sono entrambi On ... 
  if ((val1 == HIGH && val2 == HIGH)) {
      digitalWrite(LED_BUILTIN, HIGH); // Accendi il led interno
      Tergicristallo.write(SERVO_LOCK_POS); // Avvia Tergicristallo
      delay(500); // Durata Ciclo veloce
      digitalWrite(LED_BUILTIN, LOW); // Spegni il Led interno
      Tergicristallo.write(SERVO_UNLOCK_POS); // Riporta a pos. iniziale Tergicristallo
      delay(500); // Durata Pausa veloce
    }
  
  // Se In (val1), Man (val2) e l'umidità è < 50% ...
  if ((val1 == LOW && val2 == LOW && h < 50)) {
    digitalWrite(LED_BUILTIN, LOW); // Spegni il Led interno
    Tergicristallo.write(SERVO_UNLOCK_POS); // Riporta a pos. iniziale Tergicristallo
    }

  // Se Man (val2) o l'umidità è > 75% ...
  if ((val2 == HIGH || h > 75)) {
  digitalWrite(LED_BUILTIN, HIGH); // Accendi il Led interno
  Tergicristallo.write(SERVO_LOCK_POS); // Avvis Tergicristallo
  delay(500); // Durata Ciclo veloce
  Tergicristallo.write(SERVO_UNLOCK_POS); // Riporta a pos. iniziale Tergicristallo
  delay(500); // Durata Pausa veloce
  }
}

// Ciclo Tergicristallo con Selettore Velocità
void Sel_Vel() {
  // Leggi Valore Umidità
  float h1 = dht.readHumidity();

  // Associa Ingresso alla variabile 3
  val3 = digitalRead(High); // val3 = High

  // Se High (val3) è On o l'umidità è > 75% Avvia Ciclo Veloce:
  if (digitalRead((val3 == LOW || h1 > 75))) {
    digitalWrite(LED_BUILTIN, HIGH); // Accendi il Led interno
    Tergicristallo.write(SERVO_LOCK_POS); // Avvia Tergicristallo
    delay(500); // Durata Ciclo Veloce
    digitalWrite(LED_BUILTIN, LOW); // Spegni il Led interno
    Tergicristallo.write(SERVO_UNLOCK_POS); // Riporta in pos. iniziale Tergicristallo
    delay(500); // Dutata Pausa Veloce
  } else { // Altrimenti Avvia Ciclo Normale
    digitalWrite(LED_BUILTIN, HIGH); // Accendi il Led Interno
    Tergicristallo.write(SERVO_LOCK_POS); // Avvia Tergicristallo
    delay(1000); // Durata Ciclo Normale
    digitalWrite(LED_BUILTIN, LOW); // Spegni il Led interno
    Tergicristallo.write(SERVO_UNLOCK_POS); // Riporta in pos. iniziale Tergicristallo
    delay(1000); // Durata Pausa Normale
  }
  }