/*
############################################################################
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);
}