hw_timer_t *My_timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;

// Mapeamento de Hardware
const int A_input = 36;  // Pino de leitura de tensão
const int LED = 2;      // Pino do LED

// Variáveis Globais
float correnteRms;           // Corrente medida pelo sensor
bool ReadcorrentEnabled = false;  // Variável para controlar o estado da interrupção
volatile int totalInterruptCounter;

// Variáveis para o cronômetro
bool cronometroAtivo = false;
const unsigned long periodoInterrupcao = 100000;  // Período da interrupção em microssegundos
volatile unsigned long periodoCronometro = 30;
unsigned long tempoDecorrido;


void IRAM_ATTR onTimer() {
  if (cronometroAtivo) {  
    portENTER_CRITICAL_ISR(&timerMux);
    totalInterruptCounter++;
    portEXIT_CRITICAL_ISR(&timerMux);

    if (totalInterruptCounter >= 10) {
      digitalWrite(LED, !digitalRead(LED));
      unsigned long incremento = periodoCronometro;
      incremento--;
      periodoCronometro = incremento;
      totalInterruptCounter = 0;
      
      Serial.print("segundos: ");
      Serial.println(incremento);  // Converte para segundos
    }
  }  
}





void setup() {
  Serial.begin(115200);
  pinMode(LED, OUTPUT);
  My_timer = timerBegin(0, 80, true);
  timerAttachInterrupt(My_timer, &onTimer, true);
  timerAlarmWrite(My_timer, periodoInterrupcao, true);
  timerAlarmEnable(My_timer);
}

void loop() {
  if (ReadcorrentEnabled) {
    correnteRms = calculaCorrente(filtroDaMedia());  // Calcula a corrente RMS
   Serial.print("Corrente: ");
   Serial.println(correnteRms);
  }


  if (Serial.available() > 0) {
    char command = Serial.read();
    if (command == '1') {
      ReadcorrentEnabled = true;  // Habilita a interrupção
      cronometroAtivo = true;
    } else if (command == '0') {
      ReadcorrentEnabled = false;  // Desabilita a interrupção
      cronometroAtivo = false;
    }
  }
}

float calculaCorrente(int sinalSensor) {
  return (float)(sinalSensor) * (5.000) / (4095.000);
}

int filtroDaMedia() {
  long somaDasCorrentes = 0, mediaDasCorrentes;
  for (int i = 0; i < 1000; i++) {
    somaDasCorrentes += pow((analogRead(A_input) - 1750), 2);
  }
  mediaDasCorrentes = sqrt(somaDasCorrentes / 1000);
  //Serial.println("Leitura corrente");
  if (mediaDasCorrentes <= 10)
    return 0;

  return mediaDasCorrentes;
}