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