void value not ignored as it ought to be

wildbill:
Normally, when using get and set functions, the setter doesn't return anything - there's no point - you already know what the value is because you're passing it in. You could change the setter to return the value it's passed and then use it to populate aValue in the manner you're trying. However, why bother:

    int calSenseA = cs_a.capacitiveSensor(50);

aValue = letters[0].setCurrentReading(calSenseA);



You already have the value in another variable - calSenseA . Use that in your serial print.

I need to set the variable, not print it. It needs to be stored in the class is all. eventually I will read it, but I am getting the error on this line implying I am doing something wrong here.

Then all you need is:

letters[0].setCurrentReading(calSenseA);

wildbill:
Then all you need is:

letters[0].setCurrentReading(calSenseA);

oh wow...duh. yeah you're right. thanks. that worked :slight_smile:

seem to have a new problem :confused: this one really is stumping me even after reading about how to use these, since its using a library it makes it confusing. Seems like capacitive sensor library makes you set the objects value to a function in the library, so I am not sure how to make this work.

I need to populate an array of objects I would expect it to work how I have it here in the setup function:

   CapacitiveSensor cs_sensor[numberOfSensors];
   
   for(int i = 0; i < numberOfSensors; i++){
     cs_sensor[i] = CapacitiveSensor(capSenseSend,sensorPin[i]);
   }

so I can later set the current reading using this in the loop:

void setSensorValue(){
  for(int i = 0; i < numberOfSensors; i++){
    letters[i].setCurrentReading(cs_sensor[i].capacitiveSensor(50));  
  }
}

but no luck.

but no luck.

Programming is not a matter of luck. It is a matter of skill.

What does "but no luck" mean? Does the code not compile? Does it compile but not do what you want?

PaulS:

but no luck.

Programming is not a matter of luck. It is a matter of skill.

What does "but no luck" mean? Does the code not compile? Does it compile but not do what you want?

haha, fair enough. apparently skill I am lacking :wink: it is giving me the error of "no matching function for call to 'capacitiveSensor::capactiveSensor()"

for the line:

CapacitiveSensor cs_sensor[numberOfSensors];

here is all the updated code if it helps, main ino file:

#include <CapacitiveSensor.h> 
#include "Letter.h"

const byte capSenseSend = 2;

const byte numberOfSensors = 2;
Letter letters[numberOfSensors]; // a-z


const byte sensorPin[] = { 22, 23 };
const byte ledPin[] = { 8 };

int allValues[numberOfSensors];

void setup(){
   Serial.begin(19200);
   delay(100);
   
   CapacitiveSensor cs_sensor[numberOfSensors];
   
   for(int i = 0; i < numberOfSensors; i++){
     cs_sensor[i] = CapacitiveSensor(capSenseSend,sensorPin[i]);
   }
  
   // setup LEDs
   for(int i = 0; i < numberOfSensors; i++){
     pinMode(ledPin[i],OUTPUT);
     digitalWrite(ledPin[i], LOW);  
   }
   //cs_a.set_CS_AutocaL_Millis(0xFFFFFFFF); 

   setSampleSize();   
}

void loop(){  
    setSensorValue();
    checkIfButtonPressed();
    delay(100);
}

void setSampleSize(){
  for(int i = 0; i < numberOfSensors; i++){ 
    letters[i].setSampleAmount(5);
  }
}

void setSensorValue(){
  for(int i = 0; i < numberOfSensors; i++){
    letters[i].setCurrentReading(cs_sensor[i].capacitiveSensor(50));  
  }
}

void checkIfButtonPressed(){
  for(int i = 0; i < numberOfSensors; i++){ 
    letters[i].checkIfIsOn(cs_sensor[i]); 
  }
}

void fadeLedIn(int pinNumber){ 
  for(int j = 0; j <= 255; j+=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
}

void fadeLedOut(int pinNumber){ 
  for(int j = 255; j >= 0; j-=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
  digitalWrite(pinNumber, LOW); 
}

void sendSerialData(int buttonTouched){
  delay(10); Serial.print("Data,");
  delay(10); Serial.print(buttonTouched);
  delay(10); Serial.print(",");
  Serial.print("sensors : ");
  Serial.print(allValues[0]); Serial.print(" , "); Serial.print(allValues[1]); delay(10);
  Serial.print("\n");
  delay(10);
}

Letter.h

#ifndef LETTER_H
#define LETTER_H

class Letter {
  public:
    Letter();
    double getAverage(int sample);
    void setSampleAmount(int changeSampleTo);
    void setLastReading(int theLastReading);
    void setCurrentReading(int theCurrentReading);
    void checkIfisOn(int curentSensorValue[]);
    int getCurrentReading();
    int getLastReading();
    int aValue;
    int lastReading;
    int currentReading;
  private:
    
    int _sampleAmount;
    double _tempAverage,
           _capacitiveAverage;
    double _runningAverage[100];
};

#endif

Letter.ino

#include "Letter.h" // "" for files within same folder as sketch...?

Letter::Letter() {
  _sampleAmount = 5;
  _tempAverage = 0;
  _capacitiveAverage = 0;  
  lastReading = 0;
  currentReading = 0;
  //long _runningAverage[_sampleAmount];
};

void Letter::setSampleAmount(int changeSampleTo){
  _sampleAmount = changeSampleTo;
}; 

void Letter::setLastReading(int theLastReading){
  lastReading = theLastReading;
}

void Letter::setCurrentReading(int theCurrentReading){
  currentReading = theCurrentReading;
}

int Letter::getLastReading(){
  return lastReading;
}

int Letter::getCurrentReading(){
  return currentReading;
}

double Letter::getAverage(int sample) {
  for(int i = 0; i < _sampleAmount; i++){
    _runningAverage[i] = sample;
  } 
  // reset _tempAverage
  _tempAverage = 0;
  // add all the samples up
  for(int i = 0; i < _sampleAmount; i++){
    _tempAverage += _runningAverage[i];
  } 
  // divide by number of samples to get average
  _capacitiveAverage =  _tempAverage/_sampleAmount;
  return _capacitiveAverage;
}


void Letter::checkIfisOn(){
  boolean firstTime = true;
  int firstRelease = 0;
  const int threshold = 55;
  int differenceReading = curentSensorValue-lastReading;
  if(differenceReading > threshold && firstTime == true){
    sendSerialData(i);
    fadeLedIn(ledPin[i]);
  if((currentReading-lastReading) < threshold){
    digitalWrite(ledPin[i], LOW); 
    fadeLedOut(ledPin[i]);}
    lastReading[i] = currentReading[i];
    firstTime = false;
  }
}

it is giving me the error of "no matching function for call to 'capacitiveSensor::capactiveSensor()"

Which means that there is no no-argument constructor, which is what is required to create an array of objects the way that you are trying to.

You could create an array of objects using the appropriate constructor:

CapacitiveSensor cs_sensor[] =
{
   CapacitiveSensor(capSenseSend,sensorPin[0]);
   CapacitiveSensor(capSenseSend,sensorPin[1]);
   CapacitiveSensor(capSenseSend,sensorPin[2]);
   CapacitiveSensor(capSenseSend,sensorPin[3]);
   CapacitiveSensor(capSenseSend,sensorPin[4]);
}

I don't know how many cap sensors you are trying to create, so you need to make sure that the number of entries is correct.

Or, you can use pointers and the new operator.

PaulS:

it is giving me the error of "no matching function for call to 'capacitiveSensor::capactiveSensor()"

Which means that there is no no-argument constructor, which is what is required to create an array of objects the way that you are trying to.

You could create an array of objects using the appropriate constructor:

CapacitiveSensor cs_sensor[] =

{
  CapacitiveSensor(capSenseSend,sensorPin[0]);
  CapacitiveSensor(capSenseSend,sensorPin[1]);
  CapacitiveSensor(capSenseSend,sensorPin[2]);
  CapacitiveSensor(capSenseSend,sensorPin[3]);
  CapacitiveSensor(capSenseSend,sensorPin[4]);
}



I don't know how many cap sensors you are trying to create, so you need to make sure that the number of entries is correct.

Or, you can use pointers and the new operator.

ah, ok. I would prefer to use pointers since speed is an issue and it has been on to do list. I have never used pointers before though. Is there anything in particular in this context that I should try to look up to read more on it? I am not even sure what to search. "using pointers to populate objects...?"

number of sensors is set by variable: numberOfSensors
I would prefer to use a loop so I can change this as I go, I need to prototype it as I go, so I will start with 4 sensors then 8 then 20, etc.

I would prefer to use pointers since speed is an issue

Pointers are not necessarily faster than other means of data access.

In this case, you would make some minor changes:
CapacitiveSensor *cs_sensor[numberOfSensors];

for(int i = 0; i < numberOfSensors; i++)
{ // Down here where it belongs!
cs_sensor = new CapacitiveSensor(capSenseSend,sensorPin*);*
* }*
void setSensorValue()
{ // Down here where it belongs!
* for(int i = 0; i < numberOfSensors; i++)*
* { // Down here where it belongs!*
letters.setCurrentReading(cs_sensor*->capacitiveSensor(50));
_ }
}*_

PaulS:

I would prefer to use pointers since speed is an issue

Pointers are not necessarily faster than other means of data access.

In this case, you would make some minor changes:
CapacitiveSensor *cs_sensor[numberOfSensors];

for(int i = 0; i < numberOfSensors; i++)
{ // Down here where it belongs!
cs_sensor = new CapacitiveSensor(capSenseSend,sensorPin*);*
* }*
void setSensorValue()
{ // Down here where it belongs!
* for(int i = 0; i < numberOfSensors; i++)*
* { // Down here where it belongs!*
letters.setCurrentReading(cs_sensor*->capacitiveSensor(50));
_ }
}
[/quote]_

hmm this seems to throw an error that I can't find much info on: invalid conversion from 'const byte' to 'uint8_t'

for the line cs_sensor = new CapacitiveSensor(capSenseSend,sensorPin);

If Paul had that in code tags you'd see that there is a couple of array indexes there that aren't showing up. Should look like:

 for(int i = 0; i < numberOfSensors; i++)
   { // Down here where it belongs!
     cs_sensor[i] = new CapacitiveSensor(capSenseSend,sensorPin[i]);
   }

Delta_G:
If Paul had that in code tags you'd see that there is a couple of array indexes there that aren't showing up. Should look like:

 for(int i = 0; i < numberOfSensors; i++)

{ // Down here where it belongs!
    cs_sensor[i] = new CapacitiveSensor(capSenseSend,sensorPin[i]);
  }

Yes, tried this too. same error.

also tried:

 cs_sensor[i] = new CapacitiveSensor(capSenseSend,sensorPin[i]);

but this gave error: request for member 'setCurrentReading' in 'letters', which is of non-class type 'Letter [2]'

You need to post your current code, so that we can see that you made all the required changes, correctly. And so we can replicate (and solve) the problem more easily.

PaulS:
You need to post your current code, so that we can see that you made all the required changes, correctly. And so we can replicate (and solve) the problem more easily.

I did, its on the last page might have missed it, other than the changes you suggested. here it is again though just in case:

#include <CapacitiveSensor.h> 
#include "Letter.h"

const byte capSenseSend = 2;

const byte numberOfSensors = 2;
Letter letters[numberOfSensors]; // a-z

const byte sensorPin[] = { 22, 23 };
const byte ledPin[] = { 8, 9 };

//int allValues[numberOfSensors];

void setup(){
   Serial.begin(19200);
   delay(100);
   
   CapacitiveSensor *cs_sensor[numberOfSensors];
   
   for(int i = 0; i < numberOfSensors; i++){
     cs_sensor[i] = new CapacitiveSensor(capSenseSend,sensorPin);
   }
  
   // setup LEDs
   for(int i = 0; i < numberOfSensors; i++){
     pinMode(ledPin[i],OUTPUT);
     digitalWrite(ledPin[i], LOW);  
   }
   //cs_a.set_CS_AutocaL_Millis(0xFFFFFFFF); 

   setSampleSize();   
}

void loop(){  
    setSensorValue();
    checkIfButtonPressed();
    delay(100);
}

void setSampleSize(){
  for(int i = 0; i < numberOfSensors; i++){ 
    letters[i].setSampleAmount(5);
  }
}

void setSensorValue(){
  for(int i = 0; i < numberOfSensors; i++){
    letters.setCurrentReading(cs_sensor->capacitiveSensor(50));  
  }
}

void checkIfButtonPressed(){
  for(int i = 0; i < numberOfSensors; i++){ 
    letters[i].checkIfIsOn(cs_sensor[i]); 
  }
}

void fadeLedIn(int pinNumber){ 
  for(int j = 0; j <= 255; j+=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
}

void fadeLedOut(int pinNumber){ 
  for(int j = 255; j >= 0; j-=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
  digitalWrite(pinNumber, LOW); 
}

void sendSerialData(int buttonTouched){
  delay(10); Serial.print("Data,");
  delay(10); Serial.print(buttonTouched);
  delay(10); Serial.print(",");
  Serial.print("sensors : ");
  Serial.print(allValues[0]); Serial.print(" , "); Serial.print(allValues[1]); delay(10);
  Serial.print("\n");
  delay(10);
}

Letters.h:

#ifndef LETTER_H
#define LETTER_H

class Letter {
  public:
    Letter();
    double getAverage(int sample);
    void setSampleAmount(int changeSampleTo);
    void setLastReading(int theLastReading);
    void setCurrentReading(int theCurrentReading);
    void checkIfisOn(int curentSensorValue[]);
    int getCurrentReading();
    int getLastReading();
    int aValue;
    int lastReading;
    int currentReading;
  private:
    int _sampleAmount;
    double _tempAverage,
           _capacitiveAverage;
    double _runningAverage[100];
};

#endif

Letter.ino:

#include "Letter.h" // "" for files within same folder as sketch...?

Letter::Letter() {
  _sampleAmount = 5;
  _tempAverage = 0;
  _capacitiveAverage = 0;  
  lastReading = 0;
  currentReading = 0;
  //long _runningAverage[_sampleAmount];
};

void Letter::setSampleAmount(int changeSampleTo){
  _sampleAmount = changeSampleTo;
}; 

void Letter::setLastReading(int theLastReading){
  lastReading = theLastReading;
}

void Letter::setCurrentReading(int theCurrentReading){
  currentReading = theCurrentReading;
}

int Letter::getLastReading(){
  return lastReading;
}

int Letter::getCurrentReading(){
  return currentReading;
}

double Letter::getAverage(int sample) {
  for(int i = 0; i < _sampleAmount; i++){
    _runningAverage[i] = sample;
  } 
  // reset _tempAverage
  _tempAverage = 0;
  // add all the samples up
  for(int i = 0; i < _sampleAmount; i++){
    _tempAverage += _runningAverage[i];
  } 
  // divide by number of samples to get average
  _capacitiveAverage =  _tempAverage/_sampleAmount;
  return _capacitiveAverage;
}


void Letter::checkIfisOn(){
  boolean firstTime = true;
  int firstRelease = 0;
  const int threshold = 55;
  int differenceReading = curentSensorValue-lastReading;
  if(differenceReading > threshold && firstTime == true){
    sendSerialData(i);
    fadeLedIn(ledPin[i]);
  if((currentReading-lastReading) < threshold){
    digitalWrite(ledPin[i], LOW); 
    fadeLedOut(ledPin[i]);}
    lastReading[i] = currentReading[i];
    firstTime = false;
  }
}

Just follow exactly what the compiler told you. The setSensorValue is missing an array index there.

Delta_G:
Just follow exactly what the compiler told you. The setSensorValue is missing an array index there.

seems to stop way before that on: cs_sensor = new CapacitiveSensor(capSenseSend,sensorPin); with error: error: invalid conversion from 'const byte*' to 'uint8_t'
I gave it an array index like so just now:
* *void setSensorValue(){  for(int i = 0; i < numberOfSensors; i++){    letters.setCurrentReading(cs_sensor[i]->capacitiveSensor(50));    } }* *
same error. thats is the problem, no idea what the error means, and can't seem to find anything on google for it :confused:

The array of pointers is local to setup(). Pretty useless there.

PaulS:
The array of pointers is local to setup(). Pretty useless there.

oh oops, seems moving the pointer outside the setup function doesn't seem to help either, same error:

#include <CapacitiveSensor.h> 
#include "Letter.h"

const byte capSenseSend = 2;

const byte numberOfSensors = 2;
Letter letters[numberOfSensors]; // a-z

const byte sensorPin[] = { 22, 23 };
const byte ledPin[] = { 8, 9 };

CapacitiveSensor *cs_sensor[numberOfSensors];
   
void setup(){
   Serial.begin(19200);
   delay(100);

   for(int i = 0; i < numberOfSensors; i++){
     cs_sensor[i] = new CapacitiveSensor(capSenseSend,sensorPin);
   }
  
   // setup LEDs
   for(int i = 0; i < numberOfSensors; i++){
     pinMode(ledPin[i],OUTPUT);
     digitalWrite(ledPin[i], LOW);  
   }

   setSampleSize();   
}

void loop(){  
    setSensorValue();
    checkIfButtonPressed();
    delay(100);
}

void setSampleSize(){
  for(int i = 0; i < numberOfSensors; i++){ 
    letters[i].setSampleAmount(5);
  }
}

void setSensorValue(){
  for(int i = 0; i < numberOfSensors; i++){
    letters.setCurrentReading(cs_sensor[i]->capacitiveSensor(50));  
  }
}

void checkIfButtonPressed(){
  for(int i = 0; i < numberOfSensors; i++){ 
    letters[i].checkIfIsOn(cs_sensor[i]); 
  }
}

void fadeLedIn(int pinNumber){ 
  for(int j = 0; j <= 255; j+=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
}

void fadeLedOut(int pinNumber){ 
  for(int j = 255; j >= 0; j-=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
  digitalWrite(pinNumber, LOW); 
}

void sendSerialData(int buttonTouched){
  delay(10); Serial.print("Data,");
  delay(10); Serial.print(buttonTouched);
  delay(10); Serial.print(",");
  Serial.print("sensors : ");
  Serial.print(allValues[0]); Serial.print(" , "); Serial.print(allValues[1]); delay(10);
  Serial.print("\n");
  delay(10);
}

earlier I mentioned I set that line with the error to: cs_sensor = new CapacitiveSensor(capSenseSend,sensorPin*);*
which seems like what it is suppose to be, however farther down I get:
error: request for member 'setCurrentReading' in 'letters', which is of non-class type 'Letter [2]'
for:
*_ <em>*letters.setCurrentReading(cs_sensor[i]->capacitiveSensor(50));*</em> _*
so I am not sure if this is correct thing to do.

Here are two more illegal conversions from byte pointer to uint8_t

void fadeLedIn(int pinNumber){ 
  for(int j = 0; j <= 255; j+=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
}

void fadeLedOut(int pinNumber){ 
  for(int j = 255; j >= 0; j-=10){
    analogWrite(pinNumber,j);
    delay(10);
  }  
  digitalWrite(pinNumber, LOW); 
}

Go through your code and fix all these. If you are going to use the array you'll need to put the index with it. Get all that fixed, and post us new code to look at.