/*
Luís Felipe de Macedo e Castro - Equipe 1
Sensor de vazão com finalidade de detecção de vazamentos
08/05/2025
*/
//Inclue as bibliotecas utilizadas
#include <Wire.h> //biblioteca para envio de informações no protocolo I2C
#include <Adafruit_GFX.h> //biblioteca de gráficos
#include <Adafruit_SSD1306.h> //biblioteca para os displays monocromáticos de 128x64 e 128x32
//definicao do pino do sensor e de interrupcao
const int INTERRUPCAO_SENSOR = 0; //interrupt = 0 equivale ao pino digital 2
const int PINO_SENSOR = 2;
unsigned long contador = 0; //definicao da variavel de contagem de voltas
const float FATOR_CALIBRACAO = 4.5; //definicao do fator de calibracao para conversao do valor lido
float fluxo = 0; //definicao das variaveis de fluxo e volume
float volume = 0;
float volume_total = 0;
unsigned long tempo_antes = 0; //definicao da variavel de intervalo de tempo
#define SCREEN_WIDTH 128 //definição das proporções do display e do LED
#define SCREEN_HEIGHT 64
#define LED 3
// Iniciação do display segundo o SSD1306 ligado ao protocolo I2C (pinos do SDA e SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup(){
//inicializacao do monitor serial e escrita da inicialização
Serial.begin(9600);
Serial.println("Medidor de Fluxo e Volume de Liquidos\n");
//configuracao do pino do sensor como entrada em nivel logico alto e do LED como saída
pinMode(PINO_SENSOR, INPUT_PULLUP);
pinMode(LED,OUTPUT);
//Mensagem para ser escrita caso não haja a conexão
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(500);
inicializacao(); //Escrita das informações iniciais
}
void loop() {
//executa a contagem de pulsos uma vez por segundo
if((millis() - tempo_antes) > 1000){
detachInterrupt(INTERRUPCAO_SENSOR);//desabilita a interrupcao para realizar a conversao do valor de pulsos
fluxo = ((1000.0 / (millis() - tempo_antes)) * contador) / FATOR_CALIBRACAO; //conversao do valor de pulsos para L/min
//exibicao do valor de fluxo
printfluxo();
contador = 0; //reinicializacao do contador de pulsos
tempo_antes = millis(); //atualizacao da variavel tempo_antes
attachInterrupt(INTERRUPCAO_SENSOR, contador_pulso, FALLING); //contagem de pulsos do sensor
}
//LÓGICA DO LED
if(fluxo>10 && fluxo<50){
digitalWrite(LED, LOW);
}
else{
digitalWrite(LED, HIGH);
}
}
//funcao chamada pela interrupcao para contagem de pulsos
void contador_pulso() {
contador++;
digitalWrite(3,HIGH);
}
void inicializacao(){
display.clearDisplay(); //"limpa" o display
display.setTextSize(2); //seta o tamanho da fonte
display.setTextColor(WHITE); //seta a cor da fonte
display.setCursor(0, 0); //seta o lugar que vai começar a escrever
display.print("U"); //escreve o valor do potenciômetro
display.display(); //faz aparecer na tela
delay(50);
display.print("P"); //escreve o valor do potenciômetro
display.display(); //faz aparecer na tela
delay(50);
display.print("X"); //escreve o valor do potenciômetro
display.display(); //faz aparecer na tela
delay(50);
display.print("-"); //escreve o valor do potenciômetro
display.display(); //faz aparecer na tela
delay(50);
display.print("1"); //escreve o valor do potenciômetro
display.display(); //faz aparecer na tela
delay(1000);
display.setCursor(0, 20); //seta o lugar que vai começar a escrever
display.print("E");
display.display(); //faz aparecer na tela
delay(50);
display.print("Q");
display.display(); //faz aparecer na tela
delay(50);
display.print("U");
display.display(); //faz aparecer na tela
delay(50);
display.print("I");
display.display(); //faz aparecer na tela
delay(50);
display.print("P");
display.display(); //faz aparecer na tela
delay(50);
display.print("E");
display.display(); //faz aparecer na tela
delay(50);
display.print("-");
display.display(); //faz aparecer na tela
delay(50);
display.print("1");
display.display(); //faz aparecer na tela
delay(1000);
display.setTextSize(2); //seta o tamanho da fonte
display.setCursor(40, 50); //seta o lugar que vai começar a escrever
display.print("2025");
display.display(); //faz aparecer na tela
delay(1000);
display.clearDisplay(); //"limpa" o display
}
void printfluxo(){
Serial.print("Fluxo de: ");
Serial.print(fluxo);
Serial.println(" L/min");
display.clearDisplay(); //"limpa" o display
display.setTextSize(3); //seta o tamanho da fonte
display.setTextColor(WHITE); //seta a cor da fonte
display.setCursor(15, 20); //seta o lugar que vai começar a escrever
display.print(fluxo); //escreve o valor do potenciômetro
display.display(); //faz aparecer na tela
}