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

Picture of Arduino Tutorial - Alarm - Flow Sensor - Monitor Serial

Este é um tutorial onde é explicado o funcionamento de um Flow Sensor ou Sensor de Fluxo, permitindo por exemplo, medir a quantidade de líquido, que está a passar numa tubagem num determinado momento, ou seja, permite medir o fluxo desse líquido. O sensor desta montagem utiliza as entradas digitais do Arduino, sendo muito diferente dos utilizados em tutoriais anteriores, pois este não é um sensor resistivo, mas sim um sensor que é activado magneticamente, conhecido por Hall Switch Effect (Ver imagens acima).

O objectivo desta montagem será utilizar um sensor de fluxo de formas a medir a quantidade de água que passa num determinado momento, representando o valor em Litros por minuto. Caso esse valor esteja acima ou abaixo de uma determinada gama pré-estabelecida, será activado um sistema de avisos luminoso e sonoro através de um LED e um pequeno Buzzer.

Para saberem mais sobre o sensor Hall Switch Effect e o Flow Sensor, vejam as suas datasheet nos ficheiros abaixo, como também em "https://store.arduino.cc/arduino-uno-rev3" para ver as especificações detalhadas do Arduino UNO na página oficial do Arduino.

Step 1: Montagem

Nesta montagem utilizamos uma Breadboard onde colocamos os componentes e onde são distribuídas as suas alimentações positivas e negativas, entre esses componentes estão o Buzzer, que produzirá o sinal sonoro, e o LED com a sua respectiva resistência eléctrica, que será o nosso aviso luminoso. Por ultimo mas não menos importante, o nosso Sensor de Fluxo ou Flow Sensor, este sensor medirá a quantidade de agua ou outro líquido que passa num determinado espaço de tempo. (Ver montagem 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 sensor é constituído por í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 Effect Switch, com a passagem dos ímanes perto do sensor, este produz um sinal de pulsos de onda quadrada.

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

Sendo um sinal de onda quadrada com cerca de 5V de amplitude, utilizamos os pinos digitais do Arduino UNO como entrada, neste caso o pino seleccionado é o pino digital numero 11.

Step 2: Código

Picture of Código

Para esta montagem existem varias formas de programar o Arduino, sendo a função "Attach Interrupt" a forma mais utilizada ou vulgarmente encontrada na Internet. No entanto esta função tem uma contrariedade durante a sua utilização, interrompendo a função "Loop" durante um determinado tempo para realizar a contagem de pulsos gerados pelo sensor de fluxo, neste caso está convencionado durante um 1 segundo para essa contagem.

Essa interrupção no código pode criar alguns conflitos em códigos mais complexos que tenham outras funções, por exemplo, se tivermos funções de relógios ou de monitorização constante, durante a interrupção criada pela função "Attach Interrupt" as outras deixarão de funcionar (Ver ficheiro abaixo).

Alem desta contrariedade, no Arduino UNO, apenas é possível realizar a contagem de pulsos com esta função através dos pinos 2 e 3, limitando muito as montagens mais complexas (Ver tudo sobre a função "AttachInterrupt" em "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++;
}

De forma a que seja possível utilizar este tipo de sensor em simultâneo com outras funções, ou seja, sem a função "Attach Interrupt", e consequentemente sem as desvantagens descritas anteriormente, utilizamos um código idêntico a frequencímetro, onde em vez de contar os pulsos gerados por segundo, calculamos qual a frequência desse pulso, ou seja, o tempo que demora cada ciclo completo dos pulsos.

Para calcular o tempo de cada ciclo completo, utilizamos a função "PulseIn", que conta o tempo em que o sinal está em nível alto, colocando a palavra "High" e o tempo em que o sinal está em nível baixo com a palavra "Low", no final a soma destes 2 tempos será o tempo total de cada ciclo, no entanto, o valor deste tempo é dado em micro-Segundo, ou seja, 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);<br>
	pinMode(Pino_LED, OUTPUT);<br>	pinMode(Pino_Buzzer, OUTPUT);<br>  
	//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));<br>	//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 quantos pulsos existem num segundo, dividimos um segundo (1000000µSeg) pelo tempo total de cada ciclo (Soma dos valores de "PulseIn" em High e Low). Tendo o numero de ciclos, multiplicamos este pelo o valor 2,38mL, calculado através de "Pulse Caracteristics", descrito na datasheet do Flow Sensor (Ver cálculos acima), sendo este o valor da quantidade de agua que passa por cada pulso gerado pelo sensor de fluxo, no entanto este valor será em mL/Seg.

Para visualizar os valor do fluxo medido aconselho a utilizaçã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 os avisos luminosos e sonoros, neste caso apenas activa os avisos se o valor de fluxo estiver acima de 56,5 L/min ou abaixo de 10,10 L/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 e outras referências do código, vejam a sua explicação detalhada no site oficial do Arduino, através deste Link "https://www.arduino.cc/en/Reference/HomePage".

Procurem os nossos tutoriais acerca do Arduino, onde explicamos diversas montagens e o funcionamento dos seus componentes, já agora visitem o nosso canal no Youtube, Facebook ou Twitter.

Abraço e bons projectos.

Comments

About This Instructable

98views

1favorite

License:

Bio: Este é um canal para homemakers e DIY onde vai encontrar tutoriais úteis acerca de Electrónica, Arduíno, Robótica e Impressão 3D. Estes têm explicações simples ... More »
More by Crazy Taz Projects:Arduino Tutorial - LDC - MenuArduino Tutorial - Clock - LCDArduino Tutorial - Alarm - Flow Sensor - Monitor Serial
Add instructable to: