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;
}