Introduction: Arduino Tutorial - Alarm - Flow Sensor - Monitor Serial

About: This is a channel for Homemakers and DIY where you will find useful tutorials about Arduino and IOT systems, some Gardening techniques and Woodworking projects.

Neste tutorial será explicado o funcionamento de um sensor de fluxo ou "flow sensor", que tem como objectivo de determinar a quantidade de um líquido que está a passar numa tubagem durante um determinado espaço de tempo.

O sensor utilizado nesta montagem será ligado aos pinos de sinal digital de um Arduino UNO, sendo assim diferente dos sensores utilizados em tutoriais anteriores, pois como este não é um sensor resistivo, mas sim um sensor activado magneticamente ou mais vulgarmente chamada de "hall switch effect" (Ver imagens acima).

Esta montagem irá então medir a quantidade de água que passa por numa tubagem, sendo depois representada por um valor em litros por minuto (L/min), no entanto, se esse o valor medido estiver acima ou abaixo de uma determinada gama pré-estabelecida será activado um sistema de avisos luminosos e sonoro, que utiliza apenas um pequeno "buzzer" e um LED com a sua resistência eléctrica.

Para saberem mais sobre o sensor "hall switch effect" ou o "flow sensor", vejam as suas respectivas "datasheet" que se encontram nos ficheiros abaixo,alem disso também ver as especificações detalhadas do Arduino UNO na página oficial do Arduino em https://store.arduino.cc/arduino-uno-rev3.

Step 1: Montagem

Nesta montagem é também utilizada uma "Breadboard" onde são colocados os seus componentes electrónicos e onde são distribuídas as suas alimentações. Entre esses componentes electrónicos está o "buzzer" que produzirá o aviso sonoro e o LEDcom a sua respectiva resistência eléctrica que será o nosso aviso luminoso. Por ultimo mas não menos importante vem o nosso sensor de fluxo, sendo a explicação do funcionamento deste sensor o propósito deste tutorial. (Ver imagem acima).

Material necessário:

  • 1x Arduino UNO;
  • 1x Cabo USB;
  • 1x Breadboard;
  • 1x Resistência 1KΩ;
  • 1x LED Vermelho;
  • 1x Buzzer;
  • 1x Flow Sensor.

Instalação do sensor de fluxo:

Este tipo de sensor normalmente contem pequenos ímanes ao longo do seu rotor, que ao rodar durante a passagem de um líquido, activa magneticamente um pequeno sensor magnético, designado por "hall Switch effect", com a passagem destes ímanes perto do sensor magnético, este produz irá produzir um sinal de pulsos de onda quadrada.

Assim quanto mais rapidamente ou mais lentamente rodar o rotor, a quantidade de pulsos de onda quadrada num determinado tempo irá alterar, ou seja, irá aumentar ou diminui a frequência do sinal consoante a velocidade de rotação do rotor do sensor de fluxo (Ver imagem acima).

Sendo o sinal produzido de onda quadrada com uma amplitude de cerca de 5V, vamos utilizamos os pinos de sinal digital do Arduino sendo estes definidos como entradas, neste caso o pino escolhido foi o pino 11.

Step 2: Código

Para esta montagem existem 2 códigos possíveis para programar o Arduino, sendo uma através da função Attach Interrupt que é forma mais utilizada ou vulgarmente encontrada na Internet. No entanto, esta função tem uma grande desvantagem, pois exerce uma interrupção da função Loop durante o tempo que esta está realizar a contagem de pulsos gerados pelo sensor de fluxo, neste caso está convencionada uma duração de um 1seg.

Essa interrupção durante a execução do código pode criar alguns conflitos principalmente em códigos mais complexos que contenham outros tipos de funções, nomeadamente se estas forem funções de relógios ou de monitorização constante, assim durante a interrupção criada pela função Attach Interrupt as outras deixam de funcionar (Ver ficheiro abaixo).

Alem desta contrariedade, no Arduino UNO apenas é possível realizar a contagem de pulsos através desta função nos pinos 2 e 3 limitando as montagens mais complexas, caso queiram saber mais sobre esta função vejam a ligação https://www.arduino.cc/en/Reference/AttachInterrupt.

int Pino_Sensor = 2;	//Pino de entrada do sensor;
float Calculo_Fluxo;	//Variável para o calculo de Fluxo. 
volatile int Contagem_Total;	//Variável configurada como volátil para uma correta
				//actualização do valor durante o processo de AttachInterrupt.

void setup(){
	//Definição do tipo de pino (Saída ou Entrada):
	pinMode(Pino_Sensor, INPUT);

	//Configuração da função AttachInterrupt.
	attachInterrupt (0, Contagem_Pulsos, RISING);
		
		//0 = Pino 2 do Arduino UNO;
		//1 = Pino 3 do Arduino UNO.

		//Contagem_Pulsos = Função criada contagem de pulsos.
		//RISING = Pulso a subir;
		//FALLING = Pulso a descer.
}
void loop(){
	//Coloca a variável a "0" no fim de cada contagem:
	Contagem_Total = 0;
	
	//Ativa a função AttachInterrupt;
	interrupts();
		//Tempo de contagem de pulsos (1 Segundo):
		delay (1000);
	//Desativa a função AttachInterrupt:
	noInterrupts();

	//Cálculo do valor de fluxo:
		//Multiplicação de (Num. Total de pulsos/Seg)x(Pulse Caracteristics),
		//(Ver na Datasheet Flow Sensor e cálculos acima):
		Calculo_Fluxo = (Contagem_Total * 2.38);
		//Converte mL/Seg em mL/Min:
		Calculo_Fluxo = Calculo_Fluxo * 60;
		//Converte mL/Min em L/Min:
		Calculo_Fluxo = Calculo_Fluxo / 1000;
}

void Contagem_Pulsos(){
	//Incrementa +1 ao valor da variável sempre que se confirma
	//a condição da função AttachInterrupt
	Contagem_Total++;
}

Para que seja possível utilizar este tipo de sensor em simultâneo com outros tipos funções, ou seja, sem a utilização da função Attach Interrupt e consequentemente sem as desvantagens descritas anteriormente, vamos utilizar um código idêntico a frequencímetro, onde em vez de contar os pulsos gerados num segundo, calculamos qual a frequência desse pulso, ou seja, o tempo que demora a realizar cada ciclo completo de pulsos de onda quadrada.

Para calcular o tempo de cada ciclo completo é utilizada a função PulseIn, que conta o tempo em que o sinal está em nível alto colocando assim na função a palavra "HIGH" e o tempo em que o sinal está em nível baixo colocando a palavra "LOW", no final é realizada a soma destes 2 tempos resultando no tempo total de cada ciclo, no entanto, o valor deste tempo é dado em micro-segundos (µSeg), ou seja, 1Seg é igual a 1000000µSeg (Ver ficheiro abaixo).

int Pino_Sensor = 11;	//Variável de entrada do sensor de fluxo;
int Pino_LED = 7;	//Variável do pino digital para o LED;
int Pino_Buzzer = 6;	//Variável do pino digital para o Buzzer;
float Calculo_Fluxo;	//Variável para o calculo do valor de fluxo
int Contagem_Total = 0;	//variável para a contagem de pulsos;

//Correr a função SETUP apenas uma vez após ser pressionado Reset:
void setup() {
	//Definição do tipo de pino digital (Saída ou entrada):
	pinMode(Pino_Sensor, INPUT);
	pinMode(Pino_LED, OUTPUT);
	pinMode(Pino_Buzzer, OUTPUT);
	//Iniciar a Comunicação Serie a 9600b/s:
	Serial.begin(9600);
}

//A rotina de LOOP e executada repetidamente:
void loop() {
	//Contagem do tempo de duração de cada pulso em nível Alto e nível baixo.
	Contagem_Total = (pulseIn(Pino_Sensor, HIGH) + pulseIn(Pino_Sensor, LOW));
	//Contagem de numero de pulsos por segundo (1Seg = 1000000µSeg).
	Calculo_Fluxo = 1000000/Contagem_Total;
	//Multiplicação de (Num. Total de pulsos/Seg)x(Pulse Caracteristics),
	//(Ver na Datasheet Flow Sensor e cálculos acima):
	Calculo_Fluxo = (Calculo_Fluxo * 2.38);
	//Converte mL/s em mL/min:
	Calculo_Fluxo = Calculo_Fluxo * 60;
	//Converte mL/min em L/min
	Calculo_Fluxo = Calculo_Fluxo / 1000;
	
	if (Calculo_Fluxo < 0){
		Calculo_Fluxo = 0;
	}
	else{
		Calculo_Fluxo = Calculo_Fluxo;
	}

	//Escreve no monitor serial:
	Serial.print(Calculo_Fluxo);
	//Escreve no monitor serial:
	Serial.println(" L/min");
	
	//Se Calculo_Fluxo maior 56,5:
	if (Calculo_Fluxo > 56.50 || Calculo_Fluxo < 10.10 ){
		//Liga o LED (HIGH é nível alto):
		digitalWrite(Pino_LED, HIGH);
		//Liga o Buzzer (HIGH é nível alto):
		digitalWrite(Pino_Buzzer, HIGH);
	}
	else{
		//Desliga o LED (LOW é nível baixo):
		digitalWrite(Pino_LED, LOW);
		//Desliga o Buzzer (LOW é nível baixo):
		digitalWrite(Pino_Buzzer, LOW);
	}
}

Para calcular então quantos pulsos existem num segundo, dividimos 1Seg ou 1000000µSeg pelo tempo total de cada ciclo, ou seja, a soma dos valores resultantes da função PulseIn em "HIGH" e em "LOW".

Portanto, tendo o numero de ciclos por segundo, multiplicamos esse valor pelo o valor 2,38mL, calculado através do parâmetro "Pulse Caracteristics" descrito na "datasheet" do sensor de fluxo, sendo o seu resultado o valor da quantidade de agua que passa por cada pulso gerado pelo sensor de fluxo, ou seja o valor da quantidade que passa por segundo (mL/Seg) (Ver cálculos acima).

Para visualizar os valor do fluxo medido aconselho também a utilização da função da função Communication Serial, sendo assim possível verificar se os valores medidos correspondem à realidade.

Por fim, utilizamos uma condição para activar o aviso luminoso e sonoro, neste caso apenas serão activados os avisos se o valor de fluxo estiver acima de 56,5L/min ou abaixo de 10,10L/min, ou seja, se o valor se mantiver dentro da gama seleccionada estes não serão activados.

Caso queiram saber mais ou tenham dúvidas sobre estas ou outras referências no código, vejam a sua explicação detalhada no site oficial do Arduino, através da ligação https://www.arduino.cc/en/Reference/HomePage.

Procurem também os nossos tutoriais acerca do Arduino, onde são explicadas diversas montagens e o funcionamento dos seus componentes, já agora visitem o nosso canal no Youtube, Instagram, Facebook ou Twitter.

Abraço e bons projectos.