Tenho uma dúvida sobre programação.
Estou construindo um wrapper para a biblioteca CapacitiveSensor.h, onde a leitura do sensor capacitivo é uma média, definida no momento de instanciação do objeto.
Só que meus conhecimentos de programação não são tão grandes.
Estou recebendo estes erros do compilador:
...\Arduino\arduino-1.0.3\libraries\LevelSensor/LevelSensor.h:19: error: invalid use of non-static data member 'LevelSensor::_numReadings'
...\Arduino\arduino-1.0.3\libraries\LevelSensor/LevelSensor.h:20: error: from this location
...\Arduino\arduino-1.0.3\libraries\LevelSensor/LevelSensor.h:20: error: array bound is not an integer constant
Existe alguma forma de escrever um construtor de classe dinâmico?
Eu tentei usar long *_numReading = new long; mas também ocorrem erros.
Grato pela ajuda.
LevelSensor.h
#ifndef LevelSensor_h
#define LevelSensor_h
#include "Arduino.h"
class LevelSensor
{
public:
LevelSensor(int sendPin, int readPin, int optionalNumReadings = 20);
long read();
private:
int _numReadings;
long _readings[_numReadings];
//long _readings[20];
//long *_numReading = new long;
long _reading;
long _sum;
long _previousAverage;
long _currentAverage;
};
#endif
LevelSensor.cpp
#include "Arduino.h"
#include <LevelSensor.h>
#include <CapacitiveSensor.h>
// Constructor /////////////////////////////////////////////////////////////////
// Function that handles the creation and setup of instances
LevelSensor::LevelSensor(int sendPin, int readPin, int optionalNumReadings)
{
CapacitiveSensor capSensor = CapacitiveSensor(sendPin,readPin);
int counter;
if (optionalNumReadings != 20 )
_numReadings = optionalNumReadings;
//Prevents zero reading
_reading = 0;
while(_reading == 0)
_reading = capSensor.capacitiveSensorRaw(30);
for( counter = 0; counter < _numReadings; counter++)
_readings[counter] = _reading;
_previousAverage = _reading;
_currentAverage = _reading;
_sum = _reading * _numReadings;
}
long LevelSensor::read()
{
int counter;
for( counter = 0; counter < _numReadings; counter ++)
{
do
_reading = capSensor.capacitiveSensorRaw(30);
while(_reading < 0);
_sum = _sum - _readings[counter];
_readings[counter] = _reading;
_sum = _sum + _reading;
}
_previousAverage = _currentAverage;
_currentAverage = _sum/_numReadings;
_currentAverage = (_currentAverage + _previousAverage)/2;
return _currentAverage;
}
Se os teus conhecimentos de programação não são assim tão grandes... e aparentemente os de sistemas embebidos também não, talvez fosse melhor deixares esse projecto de lado até saberes um pouco mais de ambas essas áreas. Não?
Assim de repente, o que podes fazer ou estudar são malloc() e realloc()... mas estás a meter-te num mundo de sarilhos e não vais adicionar muita funcionalidade ao teu wrapper.
Estou um pouco enferrujado na programação, mas pesquisando consegui o que queria.
Tive que utilizar apontadores nas variáveis privadas, para poder instanciar os elementos de tamanho variável no construtor.
Por algum motivo, o compilador do Arduino não permite usar new para variáveis primitivas, somente para objetivos.
Por isso, usei new na classe CapactiveSensor mas precisei usar malloc() para o array de long.
O código ainda não está terminado, ainda vou otimizar a forma como utilizo o array.
Ficou assim:
LevelSensor.h
#ifndef LevelSensor_h
#define LevelSensor_h
#include "Arduino.h"
#include <CapacitiveSensor.h>
class LevelSensor
{
public:
LevelSensor(int sendPin, int readPin, int numReadings);
long read();
private:
CapacitiveSensor *capSensor;
bool _firstRun;
int _numReadings;
long *_readings;
long _reading;
long _sum;
long _previousAverage;
long _currentAverage;
};
#endif