codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
/* * 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; }
Private
[
?
]
Run code
Submit