/*############################################################################
  #Codigo criado por: MarioParente
  # Data: __/__/2023
  # Detalhes do projeto: v0.1 - Hitorico de temperatura das ultima 24h
  #                             Não gera historico e não usa RTC
  #                             24h corrido com 0h o ligamento do projeto
\############################################################################*/

#include <Adafruit_SSD1306.h>
#include "DHTesp.h"

const int DHT_PIN = 23;

int T = 0;
int H = 0;

int Agora_T = 0;
int Max_T = 0;
int Min_T = 0;

int Agora_H = 0;
int Max_H = 0;
int Min_H = 0;

int Menu = 0;

int Segundo = 0;
int Minuto = 0;

int T_Ponto = -1;
int Ponto_A = 27;
int Ponto_B = 0;







DHTesp dhtSensor;
Adafruit_SSD1306 display(128, 64, &Wire);

static const unsigned char PROGMEM Bateria[] =  {
B11111111, B11111110,B10000000, B00000010,
B10000000, B00000011,B10000000, B00000011,
B10000000, B00000011,B10000000, B00000010,
B11111111, B11111110,};

static const unsigned char PROGMEM Status_Bateria_Carregar[] =  {
B00001000,B00011100,
B00111110,B01111111,
B00011100,B00011100,
B00011100,B00000000,
};

static const unsigned char PROGMEM Status_Bateria_Descarregar[] =  {
B00001000,B00001000,
B00011100,B00001000,
};

static const unsigned char PROGMEM grau[] =  {
B11000000,B11000000,
};

void setup() {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  display.clearDisplay();
  display.display();
  display.setTextColor(WHITE,BLACK);
  display.setTextSize(1);
  Texto_grafico();
  Grafico();
  Iniciando();
}

void loop() {
  TempAndHumidity  data = dhtSensor.getTempAndHumidity();
  T = int(data.temperature);
  H = int(data.humidity);

  switch (Menu) {
    case 0:
      Normal(T,H);
    break;

    case 1:
      Maximo(T,H);
    break;

    case 2:
      Minino(T,H);
    break;

    default:
      Normal(T,H);
    break;
  }

  Tempo();
  Alteracao();
  delay(2000);
}



void Tempo() {

  Segundo = (millis() / 1000.0);

  Minuto = Segundo / 60;
  

  //Serial.println("Temp: " + String(Temp));
  Serial.println("Segundo: " + String(Segundo));
  Serial.println("Minuto: " + String(Minuto));
  Serial.println("Hora: "+ String(int(Minuto/60)));
  Serial.println("T_Ponto: " + String(T_Ponto));
  Serial.println("");
  //Serial.println("Temp: "+Temp)


  if (T_Ponto != Minuto/15){
    T_Ponto = Minuto/15;
    Ponto(T_Ponto,T);
  }
}


void Alteracao(){
  if (Menu == 0){
    Menu = 1;
  }
  else if (Menu == 1){
    Menu = 2;
  }
  else if (Menu == 2){
    Menu = 0;
  }
  else{
    Menu = 0;
  }
}

void Iniciando(){
  TempAndHumidity  data = dhtSensor.getTempAndHumidity();
  T = int(data.temperature);
  H = int(data.humidity);

  Agora_T = T;
  Max_T = T;
  Min_T = T;

  Agora_H = H;
  Max_H = H;
  Min_H = H;
}

void Normal(int x,int n){
  Serial.println("Temp: " + String(x) + "°C");
  Serial.println("Humidity: " + String(n) + "%");
  display.setCursor(35,0); 
  display.print("Agora:"+ String(x) + "C "+ String(n) + "%  ");
  display.display();
  delay(1000);
}

void Maximo(int x,int n){
  if (x > Max_T){
    Max_T = x;
  }

  if (n > Max_H){
    Max_H = n;
  }


  Serial.println("Temp: " + String(Max_T) + "°C");
  Serial.println("Humidity: " + String(Max_H) + "%");
  display.setCursor(35,0); 
  display.print("Max  :"+ String(Max_T) + "C "+ String(Max_H) + "%  ");
  display.display();
}

void Minino(int x,int n){
  if (x < Min_T){
    Min_T = x;
  }

  if (n < Min_H){
    Min_H = n;
  }

  Serial.println("Temp: " + String(Min_T) + "°C");
  Serial.println("Humidity: " + String(Min_H) + "%");
  display.setCursor(35,0); 
  display.print("Min  :"+ String(Min_T) + "C "+ String(Min_H) + "%  ");
  display.display();
}

void Grafico(){
  display.drawLine(27, 53, 126, 53, 1); //linha Horizontal
  display.drawLine(27, 13, 27, 53, 1); //linha Vertical
  //pintos linha horizontal
  display.drawPixel(29, 54, 1); //ponto de 0h
  display.drawPixel(29, 55, 1); 
  display.drawPixel(53, 54, 1); //ponto de 6h
  display.drawPixel(53, 55, 1); 
  display.drawPixel(77, 54, 1); //ponto de 12h
  display.drawPixel(77, 55, 1); 
  display.drawPixel(101, 54, 1); //ponto de 18h
  display.drawPixel(101, 55, 1);
  display.drawPixel(125, 54, 1); //ponto de 24h
  display.drawPixel(125, 55, 1);
  //pintos linha Vertical
  display.drawPixel(25, 15, 1); //ponto de 60º
  display.drawPixel(26, 15, 1); 
  display.drawPixel(25, 24, 1); //ponto de 45º
  display.drawPixel(26, 24, 1); 
  display.drawPixel(25, 33, 1); //ponto de 30º
  display.drawPixel(26, 33, 1); 
  display.drawPixel(25, 42, 1); //ponto de 15º
  display.drawPixel(26, 42, 1);
  display.drawPixel(25, 51, 1); //ponto de 0º
  display.drawPixel(26, 51, 1);
  display.display();
}

void Texto_grafico(){
  //Texto horizontal hora
  display.setCursor(27,57); 
  display.print("0"); //texto 0h
  display.setCursor(51,57);
  display.print("6"); //texto 6h
  display.setCursor(73,57);
  display.print("12"); //texto 12h
  display.setCursor(97,57);
  display.print("18"); //texto 18h
  //texto Vertical temp º
  display.setCursor(13,12); 
  display.print("60"); //texto temp 60
  display.setCursor(13,21); 
  display.print("45"); //texto temp 45
  display.setCursor(13,30); 
  display.print("30"); //texto temp 30
  display.setCursor(13,39); 
  display.print("15"); //texto temp 15
  display.setCursor(19,48); 
  display.print("0"); //texto temp 0
  //Legenda
  display.setCursor(0,0); 
  display.print("Temp"); 
  display.setCursor(0,57); 
  display.print("Hora"); 
  display.display();
}

void Ponto(int x, int y){

  x += 28;

  y = min(y,60);
  y = max(y,0);
  y = map(y, 60, 0, 15, 51);
  
  if(Ponto_B == 0){
    Ponto_B = y;
  }

  // x = tempo = largura
  // y = Temperatura = altura
  //display.drawPixel(x, y, 1);                  //Cada 15 minutos gera um ponto no grafico
                                                 //- melhor visualização para pouca variação
                                                 // de temperatura


  display.drawLine(Ponto_A, Ponto_B, x, y, 1); //Cada 15 minutos gera uma linha do ponto
                                                 //  anterior para o proximo ponto no grafico
                                                 // - melhor visualização para pouca variação
                                                 // de temperatura


  Ponto_A = x;
  Ponto_B = y;
  display.display();

}

/*

a linha horizintal começa no 28 até 125
a linha vertical   começa no  14 até 52
cada letra tem 5 pixel de largura e 7 de altura + 1 pixel largura depois da letra em preto 
5pixel por hora
32pixel por 6h
64pixel por meio dia
11,25 miutos por pixel por hora
#################################
1 pixel por 15 minuto
4 pixel por 1 hora
96 pixel por dia
*/