// Include semaphore supoport
#include <Arduino.h>
#include <LiquidCrystal.h>
#include <Button.h>
#include <ACI_10K_an.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
Button button2(17);  // create ezButton object that attach to pin 7;
Button button5(18);  // create ezButton object that attach to pin 8;
byte LedState1 = LOW;
byte LedState2 = LOW;
Button button1(22); // Connect your button between pin A0 and GND
Button button3(5); // Connect your button between pin A5 and GND
Button button4(6); // Connect your button between pin A3 and GND
// parametrização
int autVent = 0;
float celsius;
int autVeloc = 0;
int VentLador = 0;
int ioniZando = 0;
int ioniZa = 0;
int bomBeamento = 0;
int climaTiz = 0;
int alterVeloc = !0;
int idNiv = 0;
int modoVent = 0 ;
int nivelTanque;
int velVent = 0;
int autLador = 0;
int modVel = 0;
int ionIzar = 0;
void velocidade();
void autovelocidade();
void bombeamento();
void oscilador();
void ionizador();
void fade();
int brightness = 0;  // how bright the LED is
int fadeAmount = random(10);  // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // Inicia a comunicação serial (monitor serial)
  //Wire.begin();
  //Serial1.begin(115200);
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Circular");
  delay(1000);
  lcd.clear();
  randomSeed(analogRead(0));//parametro infinito
  analogReference(DEFAULT);
  pinMode(0, 0); // reserva
  pinMode(21, INPUT_PULLUP);
  pinMode(22, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(27, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(1, OUTPUT); // pastilha Peltier
  pinMode(2, INPUT_PULLUP); //INTERRUPÇÃO no pin2 paa Velocidade
  pinMode(3, OUTPUT); // pino resistencia de aquecimento
  pinMode(4, OUTPUT); // pino auto
  pinMode(28, OUTPUT); // pino led VentLador alto
  pinMode(26, OUTPUT); //pino led VentLador medio
  pinMode(17, INPUT_PULLUP); // pino VentLador
  pinMode(18, INPUT_PULLUP); // pino modoVent auto/temp
  pinMode(19, OUTPUT); //pino led VentLador baixo
  pinMode(20, OUTPUT); // pino led bomBeamento
  pinMode(14, OUTPUT); // pino oscilar
  pinMode(15, OUTPUT); //pino ioniZando
  pinMode(13, OUTPUT); // pino led nivelTanque
  /*
    0
    21 Nível do tanque
    22 climatizar
    26 pino oscilar
    27 Temperatura
    28 pino ionizar
  */
  button1.begin();
  button2.begin(); // set debounce time to 50 milliseconds
  button3.begin();
  button4.begin();
  button5.begin(); // set debounce time to 50 milliseconds

}
// the loop routine runs over and over again forever:
void loop() {
  velocidade();
  autovelocidade();
  bombeamento();
  oscilador();
  ionizador();
}
void autovelocidade() {

  //Temperatura
  Aci_10K an10k; //start an instance of the library
  //Aci_10K an10k(3.3,12);//support for 3.3 volt board and/or 12bit analog read resolution Fahrenheit
  lcd.setCursor(0, 0);
  lcd.print("temp: ");
  lcd.print((float) celsius);

  celsius = (an10k.getTemp(analogRead(27)));
  if (button5.pressed())
    (autVeloc = autVeloc + 1);
  if (autVeloc == 1) {
    autVeloc = 1;
    lcd.setCursor(0, 1);
    lcd.print("temp/auto");
    switch ((int)celsius) {
      case -24 ... 18: {
          digitalWrite(1, LOW);
          digitalWrite(4, !digitalRead(4));
          digitalWrite(3, HIGH);
          delayMicroseconds(50);
          (alterVeloc = 1);
          lcd.setCursor(0, 1);
          lcd.print("temp/auto: baixa");
          break;
        }
      case 20 ... 24: {
          digitalWrite(4, !digitalRead(4));
          digitalWrite(3, !digitalRead(3));
          delayMicroseconds(50);
          digitalWrite(1, LOW);
          (alterVeloc = 2);
          lcd.setCursor(0, 1);
          lcd.print("temp/auto: media");
          break;
        }
      case 26 ... 40: {
          digitalWrite(4, !digitalRead(4));
          digitalWrite(1, !digitalRead(1));
          delayMicroseconds(50);
          digitalWrite(3, LOW);
          digitalWrite(15, HIGH);
          digitalWrite(14, HIGH);
          (alterVeloc = 3);
          lcd.setCursor(0, 1);
          lcd.print("temp/auto:  alta");
          break;
        }
      default: {
          digitalWrite(3, LOW);
          digitalWrite(1, LOW);
          digitalWrite(1, HIGH);
          (alterVeloc = 5);
          lcd.setCursor(0, 1);
          lcd.print("ACIMA DE 40Graus");
        }
    }
  }
  if (autVeloc >= 2) {
    digitalWrite(4, LOW);
    digitalWrite(3, LOW);
    (autVeloc = 0);
    lcd.setCursor(0, 1);
    lcd.print("                 ");
  }
}
void fadeM() {
  // set the brightness of pin 9:
  analogWrite(26, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}
void fadeA() {
  // set the brightness of pin 9:
  analogWrite(28, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}
void velocidade() {

  // instanciando um botão só
  // inicio da parametrização do VentLadordor
  if (button2.pressed())
    (alterVeloc = alterVeloc + 1);
  if (alterVeloc == 1) {
    (alterVeloc = 1);
    analogWrite(26, 0);
    analogWrite(28, 0);
    digitalWrite(19, HIGH);
  }
  if (alterVeloc == 2) {
    (alterVeloc = 2);
    analogWrite(26, 255);
    analogWrite(28, 0);
    digitalWrite(19, LOW);
  }
  if (alterVeloc == 3) {
    (alterVeloc = 3);
    digitalWrite(19, LOW);
    analogWrite(26, 0);
    analogWrite(28, 255);
  }
  if (alterVeloc == 4) {
    (alterVeloc = 4);
    digitalWrite(19, LOW);
    analogWrite(28, 0);
    fadeM();
  }
   if (alterVeloc == 5) {
    (alterVeloc = 5);
    digitalWrite(19, LOW);
    analogWrite(26, 0);
    fadeA();
  }
  if (alterVeloc == 6)
  {
    (alterVeloc = 1);
  }
}
void bombeamento() {
  pinMode(2, INPUT);
  // inicio da parametrização do bombeamento
  // le o estado sensornivel: ligado (LOW) ou desligado (HIGH)
  nivelTanque = digitalRead(2);
  // noInterrupts();
  switch (nivelTanque) { // escolha caso o nível
    case HIGH: { // quando nível está alto
        digitalWrite(13, LOW); // liga o LED de nível baixo
        if (button1.toggled()) { // inicio da parametrização do climatizador
          if (button1.read() == Button::PRESSED)
            digitalWrite(20, !digitalRead(20));
        }
        break;
      }
    case LOW: {
        digitalWrite(13, HIGH); // desliga o LED de nível baixo
        delay(5000);
        digitalWrite(20, LOW); // desliga a bomba

        break;
      }
  }
}
void oscilador() {
  if (button4.toggled()) { // inicio da parametrização do oscilador
    if (button4.read() == Button::PRESSED)
      digitalWrite(14, !digitalRead(14));
  }
}
void ionizador() {
  if (button3.toggled()) {// inicio da parametrização do ionizador
    if (button3.read() == Button::PRESSED)
      digitalWrite(15, !digitalRead(15));
  }
}