//MIX dos codigos...
//https://www.robocore.net/tutoriais/usando-sensor-fluxo-de-agua
//https://www.filipeflop.com/blog/uso-de-interrupcoes-externas-com-esp32/
//https://autocorerobotica.blog.br/aprenda-utilizar-o-sensor-vazao-de-agua-com-arduino/ 

#define GPIO_SENSOR_VAZAO 5
#define TEMPO_DEBOUNCE 2 //ms
volatile unsigned long contador_acionamentos = 0;
unsigned long timestamp_ultimo_acionamento = 0;
//const int INTERRUPCAO_SENSOR = 5; //interrupt = 0 equivale ao pino digital 2

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

//simulacao de vazao
unsigned long tempo_simulacao = 0;
int GPIO_SimulaVazao = 4;

void IRAM_ATTR funcao_ISR() {
/* Conta pulsos do sensor considerando debounce */
if ( (millis() - timestamp_ultimo_acionamento) >= TEMPO_DEBOUNCE ) {
  contador_acionamentos++;
  timestamp_ultimo_acionamento = millis();
  }
}
 
void setup() {
Serial.begin(115200);
pinMode(GPIO_SENSOR_VAZAO, INPUT_PULLUP);
//attachInterrupt(INTERRUPCAO_SENSOR, funcao_ISR, RISING);
attachInterrupt(GPIO_SENSOR_VAZAO, funcao_ISR, RISING);
pinMode(GPIO_SimulaVazao,OUTPUT); //simula vazao
}
 
void loop() {
//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(INTERRUPCAO_SENSOR);
    detachInterrupt(GPIO_SENSOR_VAZAO);

    //conversao do valor de pulsos para L/min
    fluxo = ((1000.0 / (millis() - tempo_antes)) * contador_acionamentos) / 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_acionamentos = 0;

    //atualizacao da variavel tempo_antes
    tempo_antes = millis();

    //contagem de pulsos do sensor
    //attachInterrupt(INTERRUPCAO_SENSOR, funcao_ISR, FALLING);
    attachInterrupt(GPIO_SENSOR_VAZAO, funcao_ISR, FALLING);
    
  }
  if((millis() - tempo_simulacao) > 10){
      digitalWrite(GPIO_SimulaVazao,!digitalRead(GPIO_SimulaVazao));
      tempo_simulacao = millis();
  } 
}