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