/*
* SensorDeVazao.h - Biblioteca de leitura de vazao.
* @Author: Bruno Peixoto;
* @Date: 26/12/2016
*/
#include "SensorDeVazao.h"
#include "Arduino.h"
// Funcao para conversao de pino digital para pino de interrupt
#define digitalPinToInterrupt(p) ( (p) == 2 ? 0 : ((p) == 3 ? 1 : -1) )
// Construtor - Padrao
SensorDeVazao::SensorDeVazao(){
PinoDeEntrada = 2;
pinMode(PinoDeEntrada, INPUT);
IntervaloDeAmostragem = 0;
SensorHandle = this;
MillisAnterior = 0;
VazaoDeLeitura = 0;
}
// Construtor - cria um Sensor de vazao
// e inicializa os atributos "variável" e "estado"
SensorDeVazao::SensorDeVazao(int pino, long amostragem)
{
PinoDeEntrada = pino;
pinMode(PinoDeEntrada, INPUT);
IntervaloDeAmostragem = amostragem;
MillisAnterior = 0;
VazaoDeLeitura = 0;
ContadorDePulsos = 0;
SensorHandle = this;
// O sensor de efeito Hall est conectado ao pino "PinoDeEntrada, a qual
// usa interrupt 0. Configurado para ser ativado no estado FALLING (Borda de descida)
attachInterrupt(digitalPinToInterrupt(PinoDeEntrada) , ContaPulsosStatic, FALLING);
}
// Destrutor - destroe a instancia do objeto criado
SensorDeVazao::~SensorDeVazao() {
delete SensorHandle;
}
// Set atributos:
void SensorDeVazao::SetPinoDeEntrada(int pino){
PinoDeEntrada = pino;
}
void SensorDeVazao::SetIntervaloDeAmostragem(long amostragem){
IntervaloDeAmostragem = amostragem;
}
void SensorDeVazao::SetMillisAnterior(long tempo){
MillisAnterior = tempo;
}
void SensorDeVazao::SetTensaoDeVazao(double vazao){
VazaoDeLeitura = vazao;
}
int SensorDeVazao::GetPinoDeEntrada(){
return PinoDeEntrada;
}
long SensorDeVazao::GetIntervaloDeAmostragem(){
return IntervaloDeAmostragem;
}
long SensorDeVazao::GetMillisAnterior(){
return MillisAnterior;
}
double SensorDeVazao::GetVazaoDeLeitura(){
return VazaoDeLeitura;
}
double SensorDeVazao::GetFuncaoDeTransferencia(){
return FuncaoDeTransferencia;
}
void SensorDeVazao::ContaPulsos(){
// Funcao chamada pelo interrupt: mede quando a porta selecionada quando apresenta borda de descida
ContadorDePulsos++;
}
void SensorDeVazao::ContaPulsosStatic(){
if (SensorHandle != NULL){
SensorHandle -> ContaPulsos();
}
}
void SensorDeVazao::Imprimir(){
// Formalidades de apresentacao para o "usuario"
Serial.print(" Instante: ");
Serial.print(MillisAnterior);
Serial.print(" ms, Q =");
Serial.print(VazaoDeLeitura);
Serial.println(" L/min");
}
void SensorDeVazao::Ler(){
// Desativa o interrupt enquanto calcula a vazao
detachInterrupt(digitalPinToInterrupt(PinoDeEntrada));
// O loop nao e' executado exatamente no intervalo estipulado, mas varia alguns a dezenas de
// ms. Desta forma, usa-se a diferenca do instante anterior e atual para re-escalonar a vazao.
// Ademais, aplica a funcao de transferencia para calculo da vazao.
VazaoDeLeitura = (((millis() - MillisAnterior)/IntervaloDeAmostragem) * ContadorDePulsos) * FuncaoDeTransferencia;
// Reseta o contador de pulsos para reiniciar a contagem
ContadorDePulsos = 0;
// Instante anterior de leitura
MillisAnterior = millis();
// Ativa o interrupt novamente apos envio de saida
attachInterrupt(digitalPinToInterrupt(PinoDeEntrada), ContaPulsosStatic, FALLING);
}
boolean SensorDeVazao::Atualizar()
{
// GUARD: Caso tenha-se passado o intervalo "IntervalodeAmostragem",
// realiza-se a leitura do valor da tensão
if ((millis() - MillisAnterior) > IntervaloDeAmostragem) {
Ler();
return true;
}
return false;
}
void SensorDeVazao::Resetar() {
VazaoDeLeitura = 0;
}