/*
############################################################################
  Autor: Mario Parente
  Projeto: Sistema medidor de Corrente e Consumo com ACS712
  Data: 16/06/2023
  Detalhes do projeto: V1.04.0 em desenvolvimento.
############################################################################
*/

// Adicionando as Bibliotecas de suporte
#include <Adafruit_SSD1306.h>  // Biblioteca para o display OLED.

struct Tempo {
  int dia;       // Adicionado para armazenar o número de dias
  int hora;
  int minuto;
  int segundo;
  char texto[30]; // Aumente o tamanho do texto para acomodar o novo formato
} tempoAtual;

// Variáveis globais
unsigned long miliTotal = 0;
unsigned long miliPassado = 0;
int tensao = 5;  // Tensão fixa em Volts
#define ACS712 A0
int modelo = 185;  // Sensibilidade do sensor ACS712
float offset = 2.5;  // Offset de 2.5V para 0A
float consumo = 0;
float corrente = 0;
float watt = 0;
float fatorTempo = 1.0 / 3600000.0;  // Fator de tempo em horas
Adafruit_SSD1306 display(128, 32, &Wire, -1);  // Objeto Display

void setup() {
  // Configuração do display OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE, BLACK);
  display.setCursor(0, 0);
  display.println(F(" Monitor de Corrente "));
  display.display();
}

void calcularTempo() {
  unsigned long tempoMillis = millis();
  tempoAtual.dia = tempoMillis / 86400000; // 86400000 ms em um dia
  tempoAtual.hora = (tempoMillis / 3600000) % 24;
  tempoAtual.minuto = (tempoMillis / 60000) % 60;
  tempoAtual.segundo = (tempoMillis / 1000) % 60;
  sprintf(tempoAtual.texto, "Tempo: %02dd %02d:%02d:%02d", tempoAtual.dia, tempoAtual.hora, tempoAtual.minuto, tempoAtual.segundo);
  }

void loop() {
  // Calcula o tempo decorrido
  miliPassado = millis() - miliTotal;
  miliTotal = millis();

  // Calcula corrente e potência
  float leituraACS712 = (analogRead(ACS712) * (5.0 / 1024));  // Converte leitura para Volts
  corrente = (leituraACS712 - offset) / (modelo / 1000.0);  // Calcula a corrente em Amperes
  watt = tensao * corrente;  // Calcula a potência em Watts
  consumo += watt * miliPassado * fatorTempo;  // Atualiza o consumo em Watt-horas

  // Atualiza o display com as medições
  display.fillRect(0, 8, 127, 31, BLACK);
  display.setCursor(0, 8);

  display.print(F("I: "));
  display.print(corrente, 1);
  display.print(F("A"));
  display.setCursor(50, 8);
  display.print(F("V: "));
  display.print(tensao);
  display.println(F("V"));

  display.print(F("W: "));
  display.print(watt, 1);
  display.print(F("W"));

  display.setCursor(50, 16);
  display.print(F("C: "));
  display.print(consumo, 2);
  display.println(F("Wh"));


  // Exibe o tempo decorrido
  calcularTempo();
  display.println(tempoAtual.texto);
  display.display();

  // Atraso para evitar sobrecarga
  delay(100);
}