[ create a new paste ] login | about

Link: http://codepad.org/5KJmraCC    [ raw code | output | fork ]

C++, pasted on Feb 7:
/*  
 *   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;
}


Output:
1
2
3
4
Line 26: error: SensorDeVazao.h: No such file or directory
Line 20: error: Arduino.h: No such file or directory
Line 14: error: 'SensorDeVazao' has not been declared
compilation terminated due to -Wfatal-errors.


Create a new paste based on this one


Comments: