#include "RTClib.h"
#include <LiquidCrystal.h>
#include "DHT.h"

//o botão preto decrementa, o botão branco incrementa, botão cinza volta tela, botão vermelho avança a tela e 
//o botão verde é exclusivo para confirmar(ao ativar uma sala e confirmar, vai para a sala de monitoramento & serve para desligar a sirene)
//os ajustes necessários eram: começar a hora final em 23, a sirene não ser acionada ao clicar no botão branco quando fosse para a tela principal
//apenas aparecer a mensagem se esta ou não ativado, mostrar já de inicio que as salas estão desativadas, e configurar em quais salas o monitoramento seria ativado.
//na salas, ao ativar o botão branco (ele também serve pra desativar), clicar em simular movimento e depois clicar no botão 
//verde (é o botão de confirma, ele liga a sirene) e para desligar o Led, clicar no botão preto.
// botão preto esta decrementando corretamente as horas agr.
int cont = 0;
int adjustedhour = 00; //hora ajustada inicial
int adjustedminute = 00; //minuto ajustado inicial
int adjustedhourend = 23; //hora ajustada final
int adjustedminuteend = 00; //minuto ajustado final
int temp = 0;
bool habilita = 0; 
int Setpoint = 0;
unsigned long lastButtonPressA1 = 0; //subtrai
unsigned long lastButtonPressA2 = 0; //soma
unsigned long lastButtonPressA3 = 0; //retorna
unsigned long lastButtonPressA0 = 0; //avança
unsigned long lastButtonPressA8 = 0; //variavel específica para o botão verde(alarme)

unsigned long tempoLed1 = 0;
unsigned long tempoLed2 = 0;
unsigned long tempoLed3 = 0;
unsigned long tempoLed4 = 0;

unsigned long debounceDelay = 200;
unsigned long currentMillis = millis();


//partes novas
int a = 5;
//variaveis para mecher com o sensor
int s1 = 0; //variavel para mecher com a sala sensor 1
int s2 = 0; //variavel para o sensor 2
int s3 = 0; //variável para o sensor 3
int s4 = 0; // variavel para o sensor 4

int pirState = 0; // vai detectar movimento nos sensores
int val = 0; 
//para mecher com o alarme e ar condicionado
bool alarme = 0;
bool pessoa = 0;

bool sensorAtivo = 0;
bool sensorAtivo2 = 0;
bool sensorAtivo3 = 0;
bool sensorAtivo4 = 0;


RTC_DS1307 rtc;

#define DHTPIN 6
//define os nomes dos pins para melhor compreensão
#define confirma A8
#define sensor4 A7
#define ledS4 23
#define sensor3 A6
#define ledS3 22
#define sensor2 A5
#define ledS2 2
#define sensor1 A4
#define ledS1 3

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

char daysOfTheWeek[7][12] = {"Dom", "Seg", "Ter", "Quar", "Qui", "Sex", "Sab"};

LiquidCrystal lcd_1(12, 11, 10, 9, 8, 7);

void setup () {

  pinMode(4, OUTPUT); //led ar condicionado
  pinMode(A1, INPUT); //decrementa //desliga alarme
  pinMode(A2, INPUT); //incrementa //liga alarme
  pinMode(A3, INPUT); //volta tela
  pinMode(A0, INPUT); //troca de tela
  pinMode(5, OUTPUT); //led alarme
  pinMode(3, OUTPUT); // led sensor 1
  pinMode(2, OUTPUT); // led sensor 2
  pinMode(22, OUTPUT); // led sensor 3
  pinMode(23, OUTPUT); // led sensor 4
  pinMode(A4, INPUT); // sensor 1
  pinMode(A5, INPUT); // sensor 2
  pinMode(A6, INPUT); // sensor 3
  pinMode(A7, INPUT); // sensor 4
  pinMode(A8, INPUT); // botão de acionamento do alarme ao sair a pessoa da sala

  Serial.begin(115200);

   lcd_1.begin(16, 2);
   dht.begin();

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

   DateTime now = rtc.now();
   adjustedhour = now.hour();
   adjustedminute = now.minute();

   digitalWrite(ledS1, 1);
   digitalWrite(ledS2, 1);
   digitalWrite(ledS3, 1);
   digitalWrite(ledS4, 1);
}

void loop () {
  DateTime now = rtc.now();

  float temp = dht.readTemperature();

  //configuração do horario do ar condicionado 
  if (now.hour() > adjustedhour && now.hour() < adjustedhourend){
    habilita = 1;
    Serial.println("habilita1");
    pessoa = 0;
    alarme = 0;
  }
  else if(now.hour() == adjustedhour && now.minute() >= adjustedminute){
    habilita = 1;
    Serial.println("habilita2");
    pessoa = 0;
    alarme = 0;
  } //são dois else if, portanto ele vai começar no primeiro
  else if(now.hour() == adjustedhourend && now.minute() <= adjustedminuteend){ // só vai desligar quando meu minuto atual for maior que meu minuto final
    habilita = 1;
    Serial.println("habilita3");
    pessoa = 0;
    alarme = 0;
  } else{
    habilita = 0;
    pessoa = 1;
    alarme = 1;
  }

  //daqui o tempo em que os led brancos ficam ligados após serem configurados DENTRO  do horario comercial
  if (habilita == 1){ //tela 3
        if (Setpoint < temp){
          digitalWrite(4,1);
          Serial.println("habilita");
        }
        else{
          digitalWrite(4, 0);
        } 
  } 
  else{
    digitalWrite(4, 0);
    }

  if (habilita == 1 & sensor1 == 1){
     digitalWrite(ledS1, 0);
      tempoLed1 = millis();
  } 
  if ((millis() - tempoLed1) > (a - 5) * 1000){
     digitalWrite(ledS1, 1);
  }

  if (habilita == 1 & sensor2 == 1){
     digitalWrite(ledS2, 0);
      tempoLed2 = millis();
  } 
  if ((millis() - tempoLed2) > (a - 5) * 1000){
     digitalWrite(ledS2, 1);
  }

  if (habilita == 1 & sensor3 == 1){
     digitalWrite(ledS3, 0);
      tempoLed3 = millis();
  } 
  if ((millis() - tempoLed3) > (a - 5) * 1000){
     digitalWrite(ledS3, 1);
  }

  if (habilita == 1 & sensor4 == 1){
     digitalWrite(ledS4, 0);
      tempoLed4 = millis();
  } 
  if ((millis() - tempoLed4) > (a - 5) * 1000){
     digitalWrite(ledS4, 1);
  }
  //até aqui
  
  if (digitalRead(A0) == 1){ //troca de tela avança
    if (millis() - lastButtonPressA0 > debounceDelay)
    {
      lcd_1.clear();
      cont++;
      lastButtonPressA0 = millis();
      if (cont >= 12 ) cont = 0;    
      }
      while (digitalRead(A0) == 1);
  }

  if (digitalRead(A3) == 1){ //troca de tela retorna
    if (millis() - lastButtonPressA3 > debounceDelay)
    {
      lcd_1.clear();
      cont--;
      lastButtonPressA3 = millis();
      if (cont < 0) cont = 11;
      }
      while (digitalRead(A3) == 1);
  }

  if (habilita == 0 && pessoa == 1){
      if (digitalRead(sensor1) == 1 || digitalRead(sensor2) == 1 || digitalRead(sensor3) == 1 || digitalRead(sensor4) == 1)
      { 
         if (digitalRead(confirma) == 1) {
            lcd_1.clear();
            cont = 20;
            digitalWrite(5, 1); // This line is executed
            pessoa = 1;
         }
      }
  } else if (digitalRead(sensor1) == 0 || digitalRead(sensor2) == 0 || digitalRead(sensor3) == 0 || digitalRead(sensor4) == 0);
      {

      }

  switch(cont){
    case(0):
      lcd_1.setCursor(0,0); // tela 1
      lcd_1.print(now.day());
      lcd_1.print("/");
      lcd_1.print(now.month());
      lcd_1.print("/");
      lcd_1.print(now.year());
    
      lcd_1.setCursor(0,1);
      lcd_1.print(daysOfTheWeek[now.dayOfTheWeek()]);
      lcd_1.print(" ");
      lcd_1.print(now.hour());
      lcd_1.print(":");
      lcd_1.print(now.minute());
      lcd_1.print(":");
      lcd_1.print(now.second());
      lcd_1.print(" "); //
      
      lcd_1.setCursor(11, 0);
      lcd_1.print(temp);

      if(digitalRead(A2)== 1){
        lcd_1.setCursor(15, 1);
        lcd_1.print("A");
        lcd_1.print(pessoa);       
      }
      if (digitalRead(A1) == 1){
        lcd_1.setCursor(15, 1);
        lcd_1.print("D");
        lcd_1.print(pessoa);
      } 
      if (digitalRead(confirma)==1){
        habilita = 0;
        pessoa = 0;
        alarme = 1;
        digitalWrite (5,1);
      } else (digitalRead(confirma)==0);{
        digitalWrite (5,0);
      }
      
    break;

    case(1): // tela 2 //inicio da minha hora
       lcd_1.setCursor(0,0); //na linha 0 na primeira coluna
       lcd_1.print("h:"); //printo 
       lcd_1.setCursor(9,0);
       lcd_1.print("<inicio");
       lcd_1.setCursor(2, 0); //na minha linha 2 ainda na coluna 0
       if(adjustedhour < 10) lcd_1.print("0"); // ajusto a hora E printo 0 no final
       lcd_1.print(adjustedhour); //printo minha hora ajustada
      
      lcd_1.setCursor(0,1); //na linha 0, coluna 1
      lcd_1.print("m:"); //printo m
      lcd_1.setCursor(2, 1); //na linha 2, coluna 1
      if(adjustedminute < 10) lcd_1.print("0"); //se meus minutos ajustados forem menor que 10, printo 0
      lcd_1.print(adjustedminute); //printo oq está acontecendo
    
   if (digitalRead(A2) == 1){
        if (millis() - lastButtonPressA2 > debounceDelay){
        lastButtonPressA2 = millis();
        adjustedhour++;
        if (adjustedhour > 23) adjustedhour = 0;
        }        
      }
      while (digitalRead(A2) == 1);
   
     if (digitalRead(A1) == 1){
        if (millis() - lastButtonPressA1 > debounceDelay){
         lastButtonPressA1 = millis();
         adjustedhour--;
         if(adjustedhour < 0) adjustedhour = 0;
        }
         while (digitalRead(A1) == 1);
        }       
     break;
        
     case(2): //inicio do meu minuto em que:
      lcd_1.setCursor(0,0); //na linha 0 na primeira coluna
      lcd_1.print("h:"); //printo h
      lcd_1.setCursor(2, 0); //na minha linha 2 ainda na coluna 0
      if(adjustedhour < 10) lcd_1.print("0"); // ajusto a hora E printo 0 no final como medida preventiva
      lcd_1.print(adjustedhour); //printo minha hora ajustada.

      lcd_1.setCursor(0,1); //na linha 0, coluna 1
      lcd_1.print("m:"); //printo 
      lcd_1.setCursor(9, 1);
      lcd_1.print("<inicio");
      lcd_1.setCursor(2, 1); //na linha 2, coluna 1
      if(adjustedminute < 10) lcd_1.print("0"); //se meus minutos ajustados forem menor que 10, printo 0
      lcd_1.print(adjustedminute); //printo oq está acontecendo

      if (digitalRead(A2) == 1){
        if (millis() - lastButtonPressA2 > debounceDelay){
          adjustedminute++;
          if (adjustedminute > 59) adjustedminute = 0;
          }
          lastButtonPressA2 = millis();
      }
      while (digitalRead(A2) == 1);
      
      if (digitalRead(A1)==1){
          if(millis() - lastButtonPressA1 > debounceDelay){
            adjustedminute--;
          if (adjustedminute < 0) adjustedminute = 0;
          }
         lastButtonPressA1 = millis();
         }
        while (digitalRead(A1) == 1);
      break;

      case(3): //fim da minha hora 
        lcd_1.setCursor(0,0); //na linha 0 na primeira coluna
        lcd_1.print("h:"); //printo 
        lcd_1.setCursor(11,0);
        lcd_1.print("<fim");
        lcd_1.setCursor(2, 0); //na minha linha 2 ainda na coluna 0
        if(adjustedhourend < 10) lcd_1.print("0"); // ajusto a hora E printo 0 no final
        lcd_1.print(adjustedhourend); //printo minha hora ajustada
        
        lcd_1.setCursor(0,1); //na linha 0, coluna 1
        lcd_1.print("m:"); //printo m
        lcd_1.setCursor(2, 1); //na linha 2, coluna 1
        if(adjustedminuteend < 10) lcd_1.print("0"); //se meus minutos ajustados forem menor que 10, printo 0
        lcd_1.print(adjustedminuteend); //printo oq está acontecendo

        if (digitalRead(A2) == 1){
        if (millis() - lastButtonPressA2 > debounceDelay){
        lastButtonPressA2 = millis();
        adjustedhourend++;
        if (adjustedhourend > 23) adjustedhourend = 0;
        }        
      }
      while (digitalRead(A2) == 1);
   
     if (digitalRead(A1) == 1){
        if (millis() - lastButtonPressA1 > debounceDelay){
         lastButtonPressA1 = millis();
         adjustedhourend--;
         if(adjustedhourend < 0) adjustedhourend = 23;
        }
         while (digitalRead(A1) == 1);
        }       
     break; 

     case(4): //fim do meu minuto
      lcd_1.setCursor(0,0); //na linha 0 na primeira coluna
      lcd_1.print("h:"); //printo h
      lcd_1.setCursor(2, 0); //na minha linha 2 ainda na coluna 0
      if(adjustedhourend < 10) lcd_1.print("0"); // ajusto a hora E printo 0 no final como medida preventiva
      lcd_1.print(adjustedhourend); //printo minha hora ajustada.

      lcd_1.setCursor(0,1); //na linha 0, coluna 1
      lcd_1.print("m:"); //printo 
      lcd_1.setCursor(11, 1);
      lcd_1.print("<fim");
      lcd_1.setCursor(2, 1); //na linha 2, coluna 1
      if(adjustedminuteend < 10) lcd_1.print("0"); //se meus minutos ajustados forem menor que 10, printo 0
      lcd_1.print(adjustedminuteend); //printo oq está acontecendo

      if (digitalRead(A2) == 1){
        if (millis() - lastButtonPressA2 > debounceDelay){
          lastButtonPressA2 = millis();
          adjustedminuteend++;
          if (adjustedminuteend > 59) adjustedminuteend = 0;
          }
      }
      while (digitalRead(A2) == 1);
      
      if (digitalRead(A1)==1){
          if(millis() - lastButtonPressA1 > debounceDelay){
            lastButtonPressA1 = millis();
            adjustedminuteend--;
            if (adjustedminuteend < 0) adjustedminuteend = 0;
          }
         }
        while (digitalRead(A1) == 1);
      break;
      
      case(5):
        lcd_1.setCursor(0,0);
        lcd_1.print("Setpoint:");
        if (Setpoint < 10) lcd_1.print("0");
        lcd_1.print(Setpoint);
        lcd_1.setCursor(0,1);
        lcd_1.print("Temp:");
        lcd_1.print(temp);
        if (digitalRead(A2)==1){
          if (millis() - lastButtonPressA2 > debounceDelay){
            lastButtonPressA2 = millis();
            Setpoint++;
            if (Setpoint > 35) Setpoint = 0;
          }
        }

        if (digitalRead(A1) == 1){
          if (millis() - lastButtonPressA1 > debounceDelay){
            lastButtonPressA1 = millis();
            Setpoint--;
            if (Setpoint < 0) Setpoint = 0;
          }
        }
      break;
      
      case(6):
        lcd_1.setCursor(5,0); //pessoa
        lcd_1.print("ALARME");
        lcd_1.setCursor(7,1);
        lcd_1.print("off");

        if (digitalRead(A2)==1){ //se meu botão A2 for pressionado
        alarme = 1; //meu alarme será ligado
        lcd_1.setCursor(7,1);
        lcd_1.print("ON ");
        cont = 0;
        lcd_1.clear();
        debounceDelay = 1;
        } else if (digitalRead(A1)==1){ 
          alarme = 0; // meu alarme é igual a zero
          lcd_1.setCursor(7,1);
          lcd_1.print("OFF");
        }
      break;

      case(7):
        lcd_1.setCursor(1,0);
        lcd_1.print("Tempo sensores");
        lcd_1.setCursor(7,1);    
        if (a < 10) lcd_1.print("0");
        lcd_1.print(a);

        if (digitalRead(A2) == 1){
          if (millis() - lastButtonPressA2 > debounceDelay){
          lastButtonPressA2 = millis();
          a++;
          if (a > 59) a = 5;
          }
      }

      if (digitalRead(A1) == 1){
        if (millis() - lastButtonPressA1 > debounceDelay){
          lastButtonPressA1 = millis();
          a--;
          if (a < 5) a = 5;
        }
      }
      break;

//A2 (botão branco), tanto ativa quanto desativa no case das salas (8,9,10 e 11)
      case(8):
        lcd_1.setCursor(0,0);
        lcd_1.print("Sala 1:");
       
        if (digitalRead(A2) == 1) {
          sensorAtivo = !sensorAtivo;
        }
        if (sensorAtivo == 1){
          lcd_1.setCursor(0,1);
          lcd_1.print("Ativado   ");

        } else {
          lcd_1.setCursor(0,1);
          lcd_1.print("Desativado");
        }
         if (digitalRead(A2) == 1) { // Botão branco altera o estado
           if (millis() - lastButtonPressA2 > debounceDelay) {
           lastButtonPressA2 = millis();
           sensorAtivo = !sensorAtivo; // Alterna entre ativado/desativado
           digitalWrite(ledS1, 1);
           if (digitalRead(confirma) == 1){
           digitalWrite(5,1);
           }
           }
         }
      break;

      case(9):
        lcd_1.setCursor(0,0);
        lcd_1.print("Sala 2:");

        if (digitalRead(A2) == 1){
          sensorAtivo2 = !sensorAtivo2;
        } 
        if (sensorAtivo2 == 1) {
            lcd_1.setCursor(0,1);
            lcd_1.print("Ativado   ");
        } else { 
            lcd_1.setCursor(0,1);
            lcd_1.print("Desativado");
        } 
        if (digitalRead(A2) == 1) {
          if (millis() - lastButtonPressA2 > debounceDelay) {
           lastButtonPressA2 = millis();
           sensorAtivo2 = !sensorAtivo2;
           digitalWrite(ledS2,1);
           if (digitalRead(confirma)==1){
            digitalWrite(5,1);
           }
          }                                                    
        }
      break;

      case(10):
        lcd_1.setCursor(0,0);
        lcd_1.print("Sala 3:");

        if (digitalRead(A2) == 1){
          sensorAtivo3 = !sensorAtivo3;
        } 
        if (sensorAtivo3 == 1){
              lcd_1.setCursor(0,1);
              lcd_1.print("Ativado   ");
        } else {
              lcd_1.setCursor(0,1);
              lcd_1.print("Desativado");
        }
        if (digitalRead(A2) == 1) {
          if (millis() - lastButtonPressA2 > debounceDelay) {
          lastButtonPressA2 = millis();
          sensorAtivo3 = !sensorAtivo3;
          digitalWrite(ledS3, 1);
          if (digitalRead(confirma)==1){
            digitalWrite (5,1);
          }
          }
        }
      break;

      case(11):
        lcd_1.setCursor(0,0);
        lcd_1.print("Sala 4:");

        if (digitalRead(A2) == 1){
              sensorAtivo4 = !sensorAtivo4;
        }
        if (sensorAtivo4 == 1){
              lcd_1.setCursor(0,1);
              lcd_1.print("Ativado   ");
        } else {
          lcd_1.setCursor(0,1);
          lcd_1.print("Desativado");
        }
        if (digitalRead(A2) == 1) {
          if (millis() - lastButtonPressA2 > debounceDelay) {
            lastButtonPressA2 = millis();
            sensorAtivo4 = !sensorAtivo4;
            digitalWrite (ledS4, 1);
            if (digitalRead(confirma)==1){
              digitalWrite (5,1);
            }
            }
          }
    break;

      case(20):
        lcd_1.setCursor(0,0);
        lcd_1.print("Movimento em:");

          if (digitalRead(confirma) == 1){
            digitalWrite(5,1);
          } if (digitalRead(A1)==1){
            digitalWrite(5,0);
          }
          if (digitalRead(sensor1) == 1) {
            if (sensorAtivo){
                lcd_1.setCursor(0, 1);
                lcd_1.print("S1!");
                Serial.println("S1");
              }} else if (digitalRead(sensor2) == 1) {
                  if (sensorAtivo2){
                  lcd_1.setCursor(3, 1);
                  lcd_1.print("S2!");
                  Serial.println("S2!");
              } } else if (digitalRead(sensor3) == 1){
                 if (sensorAtivo3){
                  lcd_1.setCursor(6, 1);
                  lcd_1.print("S3!");
                  Serial.println("S3");
              }} else if (digitalRead(sensor4)==1) {
                 if (sensorAtivo4){
                  lcd_1.setCursor(9, 1);
                  lcd_1.print("S4!");
                  Serial.println("S4");
              }}
              else {
                lcd_1.setCursor(0,1);
                lcd_1.print("                 ");
                digitalWrite(ledS1, 1);
                digitalWrite(ledS2, 1);
                digitalWrite(ledS3, 1);
                digitalWrite(ledS4, 1);
              }
        break;
        }
        
        //nessa parte quando o sensor 1 for acionado, tempoLed1 irá guardar a informação 
        //configurada no tempo em que o led fica ligado, se o tempo for maior que a informação configurada - 5, irá * por 1000 segundos
        if (digitalRead(sensor1) == 1){
          digitalWrite(ledS1, 0);
          tempoLed1 = millis();
        } 
        if ((millis() - tempoLed1) > (a - 5) * 1000){
          digitalWrite(ledS1, 1);
        }

       //nessa parte quando o sensor 2 for acionado, tempoLed2 irá guardar a informação 
       //configurada no tempo em que o led fica ligado, se o tempo for maior que a informação configurada - 5, irá * por 1000 segundos  
        if (digitalRead(sensor2) == 1){
            digitalWrite(ledS2, 0);
            tempoLed2 = millis();
        } 
        if ((millis() - tempoLed2) > (a - 5) * 1000){
            digitalWrite(ledS2, 1);
        }
        
        //nessa parte quando o sensor 3 for acionado, tempoLed3 irá guardar a informação 
        //configurada no tempo em que o led fica ligado, se o tempo for maior que a informação configurada - 5, irá * por 1000 segundos
        if (digitalRead(sensor3) == 1){
            digitalWrite(ledS3, 0);
            tempoLed3 = millis();
        }
        if ((millis() - tempoLed3) > (a - 5) * 1000){
            digitalWrite(ledS3, 1);
        }

        //nessa parte quando o sensor 4 for acionado, tempoLed4 irá guardar a informação 
        //configurada no tempo em que o led fica ligado, se o tempo for maior que a informação configurada - 5, irá * por 1000 segundos
        if (digitalRead(sensor4) == 1){
            digitalWrite(ledS4, 0);
            tempoLed4 = millis();
        } 
        if ((millis() - tempoLed4) > (a - 5) * 1000){
            digitalWrite(ledS4, 1);
        }
}
$abcdeabcde151015202530fghijfghij
GND5VSDASCLSQWRTCDS1307+