//Bibliotecas
#include <DHT.h> // Biblioteca utilizada para gerenciar o sensor de Temperatura e Umidade.
#include <DHT_U.h>// Arquivo aulixiar da Biblioteca acima.
#include <Wire.h> //Biblioteca utilizada para gerenciar a comunicação entre dispositicos através do protocolo I2C
#include <LiquidCrystal_I2C.h> //Biblioteca controlar display 20x4 através do I2C
#include <RTClib.h> // Biblioteca de controle do módulo de relógio

//Variáveis
float temperatura = 0;
float umidade = 0;
float tMax = 0;
float tMin = 100;

//Definições do display lcd e do sensor DHT22
#define col  20 //Define o número de colunas do display utilizado
#define lin   4 //Define o número de linhas do display utilizado
#define ende  0x27 //Define o endereço do display
#define dhtPin 4 // pino de dados do DHT22
#define dhtType DHT22   // DHT 22  (AM2302)
RTC_DS1307 rtc;
DHT dht(dhtPin, dhtType);
LiquidCrystal_I2C lcd(ende, col, lin); //Cria o objeto lcd passando como parâmetros o endereço, o nº de colunas e o nº de linhas

void setup() {
  lcd.init(); //Inicializa a comunicação com o display já conectado
  lcd.clear(); //Limpa a tela do display
  lcd.backlight(); //Aciona a luz de fundo do display
  dht.begin(); //Inicializa o sensor DHT
  rtc.begin(); //Inicializa o módulo RTC
  delay(2000);// ATENÇAO - Para que o DHT funcione bem, ele precisa de aproximadamente 2 segundos antes de iniciarmos a leitura
  //lcd.setCursor(0, 0); //Coloca o cursor do display na coluna 1 e linha 1
  //lcd.print("LAB - Monitor Local"); //Exibe a mensagem na primeira linha do display
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Esta linha deve ser executada apenas uma vez, pois acerta o relógio de acordo com a data da compilação
  //Serial.begin(9600);
}

void loop() {
  temperatura = dht.readTemperature(); // Faz a leitura da temperatura
  umidade = dht.readHumidity(); //Faz a leitura da umidade.
  DateTime now = rtc.now(); //Inicia a leitura da data e hora
  lcd.setCursor(0, 0);
  if (temperatura > tMax) {
    tMax = temperatura;
    lcd.print("Max=");
    if (tMax < 10) {
      lcd.print("0");
      lcd.setCursor(5, 0);
      lcd.print(tMax);
    } else {
      lcd.print(tMax);
    }
  }
  lcd.setCursor(11, 0);
  if (temperatura < tMin) {
    tMin = temperatura;
    lcd.print("Min=");
    if (tMin < 10) {
      lcd.print("0");
      lcd.setCursor(16, 0);
      lcd.print(tMin);
    } else {
      lcd.print(tMin);
    }
  }
  lcd.setCursor(0, 1); //Posiciona o cursor no display (Coluna, Linha)
  if (now.day() < 10) {// verifica de o dia é menor que 10 pra colocar um zero antes
    lcd.print("0");
    lcd.setCursor(1, 1);
    lcd.print(now.day());
  } else {
    lcd.print(now.day()); // Imprime o dia
  }
  lcd.setCursor(2, 1);
  lcd.print("/");
  lcd.setCursor(3, 1);
  if (now.month() < 10) {
    lcd.print("0");
    lcd.setCursor(4, 1);
    lcd.print(now.month());
  } else {
    lcd.print(now.month());
  }
  lcd.setCursor(5, 1);
  lcd.print("/");
  lcd.setCursor(6, 1);
  lcd.print(now.year());
  lcd.setCursor(12, 1);// Posiciona o cursor na segunda linha
  if (rtc.now().hour() < 10) {
    lcd.print("0");
    lcd.setCursor(13, 1);
    lcd.print(rtc.now().hour());
  } else {
    lcd.print(rtc.now().hour());      // Imprime a Hora
  }
  lcd.print(":");                   // Imprime o texto entre aspas
  if (rtc.now().minute() < 10) {
    lcd.setCursor(15, 1);
    lcd.print("0");
    lcd.print(rtc.now().minute());    // Imprime o Minuto
  } else {
    lcd.print(rtc.now().minute());
  }
  lcd.print(":");                   // Imprime o texto entre aspas
  if (rtc.now().second() < 10) {
    lcd.setCursor(18, 1);
    lcd.print("0");
    lcd.print(rtc.now().second());
  } else {
    lcd.print(rtc.now().second());
  }
  lcd.setCursor(0, 2);
  lcd.print("Temperatura: ");
  lcd.setCursor(14, 2);
  if (temperatura <10) {
    lcd.print("0");
    lcd.print(temperatura);
  } else {
    lcd.print(temperatura);
  }
  lcd.setCursor(19, 2);
  lcd.print("C");
  lcd.setCursor(0, 3);
  lcd.print("Umidade    :");
  lcd.setCursor(14, 3);
  lcd.print(umidade, 2);
  lcd.setCursor(19, 3);
  lcd.print("%");
  delay(999);
  //lcd.noDisplay();// Desliga Display:
  //lcd.display();// Liga Display:
}
GND5VSDASCLSQWRTCDS1307+