//definicao do pino do sensor e de interrupcao
#include <Wire.h>
//const int INTERRUPCAO_SENSOR = 0;
const int PINO_SENSOR = 25;
//definicao da variavel de contagem de voltas
static unsigned long contador = 0;
//definicao do fator de calibracao para conversao do valor lido
const float FATOR_CALIBRACAO = 4.5;
//definicao das variaveis de fluxo e volume
float fluxo = 0;
float volume = 0;
float volume_total = 0;
//definicao da variavel de intervalo de tempo
unsigned long tempo_antes = 0;
//static bool flag = false;

//funcao chamada pela interrupcao para contagem de pulsos
void IRAM_ATTR contador_pulso() {
  contador++;
  //flag = true;
}

void setup() {
  //inicializacao do monitor serial
  Serial.begin(115200);
  //mensagem de inicializacao
  Serial.println("Medidor de Fluxo e Volume de Liquidos\n");
  //configuracao do pino do sensor como entrada em nivel logico alto
  pinMode(PINO_SENSOR, INPUT_PULLUP);
  attachInterrupt(PINO_SENSOR, contador_pulso, FALLING);
}

void loop() {
 // if (flag == true)
 // {
 //   Serial.println(contador);
 //   flag = false;
 // }
  //executa a contagem de pulsos uma vez por segundo
  if ((millis() - tempo_antes) > 1000) {
    //desabilita a interrupcao para realizar a conversao do valor de pulsos
    detachInterrupt(PINO_SENSOR);
    //conversao do valor de pulsos para L/min
    fluxo = ((1000.0 / (millis() - tempo_antes)) * contador) / FATOR_CALIBRACAO;
    //exibicao do valor de fluxo
    Serial.print("Fluxo de: ");
    Serial.print(fluxo);
    Serial.println(" L/min");
    //calculo do volume em L passado pelo sensor
    volume = fluxo / 60;
    //armazenamento do volume
    volume_total += volume;
    //exibicao do valor de volume
    Serial.print("Volume: ");
    Serial.print(volume_total);
    Serial.println(" L");
    Serial.println();
    //reinicializacao do contador de pulsos
    contador = 0;
    //atualizacao da variavel tempo_antes
    tempo_antes = millis();
    //contagem de pulsos do sensor
    attachInterrupt(PINO_SENSOR, contador_pulso, FALLING);
  }
}