error: ld returned 1 exit status

Hi,

I am new about Arduino programming and i getting the following error while trying to create a program to my Arduino Uno:

"C:...Temp\ccl3xWxN.ltrans0.ltrans.o: In function `loop':

D:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:111: undefined reference to `TensionControl(double, double)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Erro compilando para a placa Arduino/Genuino Uno"

Could someone, please, appoint my error?

Here is My Code:

#define BaudRate 9600

#include "Classes.h"
#include "Functions.h"
#include "PinConfig.c"


Object Gas1;
Object Gas2;
Object Gas3;
Object Gas4;
Object Temperature;
Object Pressure;

int 
  nPoints;

int
  StartTime=0,
  OperationTime=0,
  FinishTime=0;

const int
  PointsPool=31,
  Elements=3,
  DataPoints=2;
   
bool 
  ConnectionStatus=false;

void setup() 
{
  // put your setup code here, to run once:
  /*PinConfig*/
  PinConfig();
  
  /*Open Comunication channel*/
  Serial.begin(BaudRate);
}

void loop() 
{
  /*Establishing Connection*/
  while(Serial.readStringUntil('\n')!="Trying to Connect"){}
  Serial.println("Connected");

  /*Dimensioning Matrixws*/
  while (Serial.readStringUntil('\n')!="N Points") {}
  nPoints=Serial.readStringUntil('\n').toInt();
  Serial.println("N Points recieved");
  
  Gas1.MatrixSize(nPoints,2);
  Gas2.MatrixSize(nPoints,2);
  Gas3.MatrixSize(nPoints,2);
  Gas4.MatrixSize(nPoints,2);
  Temperature.MatrixSize(nPoints,2);
  Pressure.MatrixSize(nPoints,2);

  /*Data Matrix*/
  for (int i=0;i<nPoints;i++)
  {
    Gas1.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas1.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Gas2.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas2.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Gas3.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas3.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Gas4.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas4.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Temperature.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Temperature.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Pressure.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Pressure.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
  }
  
  /*Starting Operation*/
  //Defining StartTime
  StartTime=millis();
  //Defining FinsihTime
  FinishTime=Gas1.DataMatrix[nPoints-1][0];
  
  while(OperationTime<=FinishTime)
  {
    //Defining OperationTime
    OperationTime=StartTime-millis();
    
    TensionControl(OperationTime, **Gas1.DataMatrix);
    
    
  }
}

here are the library the I created to use with my code:

Classes.h:

#include    "Arduino.h"

#ifndef Classes_H
#define Classes_H

#define nRows 100
#define nColumns 2



class Object
{
  public:
    Object();
    void MatrixSize(int _nRows, int _nColumns);
    int
      nPoints;
    double
      DataMatrix[nRows][nColumns];
      
      
  private:
};


Object::Object()
{
  
}
;

void Object::MatrixSize(int _nRows, int _nColumns)
{
  nPoints=_nRows;
};


#endif

Functions.h:

/*Functions Library*/
#include    "Arduino.h"

#ifndef Functions_H
#define Functions_H

double LinearInterpolation( double, double);
int TensionControl(double, double);


int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix
{
  /*PWM Variable*/
  int PWM=-10;
  
  /*reading number of control points*/
  int n=sizeof(**_Matrix);
  
  /*Interval array*/
  double k[2][2];
  
  /*Select interval*/
  for (int i=0; i<n; i++)
  {
    if (_Matrix[i][0]<_DesiredPoint)
    {
      /*x_Axays*/
      k[0][0]=_Matrix[i][0];
      k[1][0]=_Matrix[i+1][0];
      
      /*y_axis*/
      k[0][1]=_Matrix[i][1];
      k[1][1]=_Matrix[i+1][1];
      
    }
  }
  
  PWM=LinearInterpolation(_DesiredPoint,**k);
  
  return PWM;
}

double LinearInterpolation(double _DesiredPoint, double** _Matrix) //linear interpolation 
{
  double y=-1;
  if (_Matrix[0][0]<= _DesiredPoint <=_Matrix[1][0])
  {
        y=(_DesiredPoint-_Matrix[0][0])/(_Matrix[1][0]-_Matrix[0][0])*(_Matrix[1][1]-_Matrix[0][1])+_Matrix[0][1];
  }
  return y;
}





#endif

and PinConfig.c:

/*Pins Configurations*/
#include    "Arduino.h"

#ifndef PinConfig_H
#define PinConfig_H



void PinConfig()
{
    
}


#endif

I am also attaching some Screenshots of my program

undefined reference to `TensionControl(double, double)'
int TensionControl(double _DesiredPoint, double** _Matrix)

See the problem now?

Thanks AWOL,

it indeed worked to one Object. But when i tried to expand the solution to more objects i recieved the following error mensage:
"C:...\Temp\ccMVHn2V.ltrans0.ltrans.o: In function `loop':

:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:111: undefined reference to `TensionControl(double, double)'

D:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:112: undefined reference to `TensionControl(double, double)'

D:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:113: undefined reference to `TensionControl(double, double)'

D:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:114: undefined reference to `TensionControl(double, double)'

D:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:115: undefined reference to `TensionControl(double, double)'

C:\Users\leona\AppData\Local\Temp\cc8u2vK8.ltrans0.ltrans.o:D:\This PC\Documents\Arduino\TCC2\sketch_oct16a/sketch_oct16a.ino:116: more undefined references to `TensionControl(double, double)' follow

collect2.exe: error: ld returned 1 exit status

exit status 1
Erro compilando para a placa Arduino/Genuino Uno"

Here it is the new Main code:

#define BaudRate 9600

#include "Classes.h"
#include "Functions.h"
#include "PinConfig.c"


Object Gas1;
Object Gas2;
Object Gas3;
Object Gas4;
Object Temperature;
Object Pressure;

int 
  nPoints;

int
  StartTime=0,
  OperationTime=0,
  FinishTime=0;

const int
  PointsPool=31,
  Elements=3,
  DataPoints=2;
   
bool 
  ConnectionStatus=false;

void setup() 
{
  // put your setup code here, to run once:
  /*PinConfig*/
  PinConfig();
  
  /*Open Comunication channel*/
  Serial.begin(BaudRate);
}

void loop() 
{
  /*Establishing Connection*/
  while(Serial.readStringUntil('\n')!="Trying to Connect"){}
  Serial.println("Connected");

  /*Dimensioning Matrixws*/
  while (Serial.readStringUntil('\n')!="N Points") {}
  nPoints=Serial.readStringUntil('\n').toInt();
  Serial.println("N Points recieved");
  
  Gas1.MatrixSize(nPoints,2);
  Gas2.MatrixSize(nPoints,2);
  Gas3.MatrixSize(nPoints,2);
  Gas4.MatrixSize(nPoints,2);
  Temperature.MatrixSize(nPoints,2);
  Pressure.MatrixSize(nPoints,2);

  /*Data Matrix*/
  for (int i=0;i<nPoints;i++)
  {
    Gas1.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas1.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Gas2.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas2.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Gas3.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas3.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Gas4.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Gas4.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Temperature.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Temperature.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
    
    Pressure.DataMatrix[i][0]=Serial.readStringUntil('\n').toDouble();
    Pressure.DataMatrix[i][1]=Serial.readStringUntil('\n').toDouble();
  }
  
  /*Starting Operation*/
  //Defining StartTime
  StartTime=millis();
  //Defining FinsihTime
  FinishTime=Gas1.DataMatrix[nPoints-1][0];
  
  while(OperationTime<=FinishTime)
  {
    //Defining OperationTime
    OperationTime=StartTime-millis();
    
    int y1=TensionControl(OperationTime, **Gas1.DataMatrix);
    int y2=TensionControl(OperationTime, **Gas2.DataMatrix);
    int y3=TensionControl(OperationTime, **Gas3.DataMatrix);
    int y4=TensionControl(OperationTime, **Gas4.DataMatrix);
    int y5=TensionControl(OperationTime, **Temperature.DataMatrix);
    int y6=TensionControl(OperationTime, **Pressure.DataMatrix);
    
  }
}
int y1=TensionControl(OperationTime, Gas1.DataMatrix);
    int y2=TensionControl(OperationTime, Gas2.DataMatrix);
    int y3=TensionControl(OperationTime, Gas3.DataMatrix);
    int y4=TensionControl(OperationTime, Gas4.DataMatrix);
    int y5=TensionControl(OperationTime, Temperature.DataMatrix);
    int y6=TensionControl(OperationTime, Pressure.DataMatrix);

Thanks for your time AWOL ??? ??? ,

AWOL:

int y1=TensionControl(OperationTime, Gas1.DataMatrix);

int y2=TensionControl(OperationTime, Gas2.DataMatrix);
   int y3=TensionControl(OperationTime, Gas3.DataMatrix);
   int y4=TensionControl(OperationTime, Gas4.DataMatrix);
   int y5=TensionControl(OperationTime, Temperature.DataMatrix);
   int y6=TensionControl(OperationTime, Pressure.DataMatrix);

i made the changes, and this is what happened:
Arduino: 1.8.7 (Windows Store 1.8.15.0) (Windows 10), Placa:"Arduino/Genuino Uno"

D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino: In function 'void loop()':

sketch_oct16a:109:57: error: no matching function for call to 'TensionControl(int&, double [100][2])'

int y1=TensionControl(OperationTime, Gas1.DataMatrix);

^

In file included from D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino:23:0:

sketch\Functions.h:8:5: note: candidate: int TensionControl(double, double)

int TensionControl(double, double);

^

sketch\Functions.h:8:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double'

sketch\Functions.h:11:5: note: candidate: int TensionControl(double, double**)

int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix

^

sketch\Functions.h:11:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double**'

sketch_oct16a:110:57: error: no matching function for call to 'TensionControl(int&, double [100][2])'

int y2=TensionControl(OperationTime, Gas2.DataMatrix);

^

In file included from D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino:23:0:

sketch\Functions.h:8:5: note: candidate: int TensionControl(double, double)

int TensionControl(double, double);

^

sketch\Functions.h:8:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double'

sketch\Functions.h:11:5: note: candidate: int TensionControl(double, double**)

int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix

^

sketch\Functions.h:11:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double**'

sketch_oct16a:111:57: error: no matching function for call to 'TensionControl(int&, double [100][2])'

int y3=TensionControl(OperationTime, Gas3.DataMatrix);

^

In file included from D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino:23:0:

sketch\Functions.h:8:5: note: candidate: int TensionControl(double, double)

int TensionControl(double, double);

^

sketch\Functions.h:8:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double'

sketch\Functions.h:11:5: note: candidate: int TensionControl(double, double**)

int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix

^

sketch\Functions.h:11:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double**'

sketch_oct16a:112:57: error: no matching function for call to 'TensionControl(int&, double [100][2])'

int y4=TensionControl(OperationTime, Gas4.DataMatrix);

^

In file included from D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino:23:0:

sketch\Functions.h:8:5: note: candidate: int TensionControl(double, double)

int TensionControl(double, double);

^

sketch\Functions.h:8:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double'

sketch\Functions.h:11:5: note: candidate: int TensionControl(double, double**)

int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix

^

sketch\Functions.h:11:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double**'

sketch_oct16a:113:64: error: no matching function for call to 'TensionControl(int&, double [100][2])'

int y5=TensionControl(OperationTime, Temperature.DataMatrix);

^

In file included from D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino:23:0:

sketch\Functions.h:8:5: note: candidate: int TensionControl(double, double)

int TensionControl(double, double);

^

sketch\Functions.h:8:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double'

sketch\Functions.h:11:5: note: candidate: int TensionControl(double, double**)

int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix

^

sketch\Functions.h:11:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double**'

sketch_oct16a:114:61: error: no matching function for call to 'TensionControl(int&, double [100][2])'

int y6=TensionControl(OperationTime, Pressure.DataMatrix);

^

In file included from D:\This PC\Documents\Arduino\TCC3\sketch_oct16a\sketch_oct16a.ino:23:0:

sketch\Functions.h:8:5: note: candidate: int TensionControl(double, double)

int TensionControl(double, double);

^

sketch\Functions.h:8:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double'

sketch\Functions.h:11:5: note: candidate: int TensionControl(double, double**)

int TensionControl(double _DesiredPoint, double** _Matrix) //Control Tension throught time matrix

^

sketch\Functions.h:11:5: note: no known conversion for argument 2 from 'double [100][2]' to 'double**'

exit status 1
no matching function for call to 'TensionControl(int&, double [100][2])'"

I'm struggling to see what you're trying to achieve.

Can you explain this?

int TensionControl(double, double);


int TensionControl(double _DesiredPoint, double** _Matrix)

AWOL:
I'm struggling to see what you're trying to achieve.

Can you explain this?

int TensionControl(double, double);

int TensionControl(double _DesiredPoint, double** _Matrix)

I'm trying to control the voltage over time.
This function receives a matrix (time, voltage (PWM)) and performs a linear interpolation.
The two parameters are the time counted from the moment you begin to control the voltage and control points entered by the user. It should return a value 0~255 to be used later with digitalWrite

/*reading number of control points*/
  int n=sizeof(**_Matrix);

The size of a pointer is a constant, irrespective of what the pointer points to, even if, as here, it points to a pointer.

How did you get this far without testing the components?

AWOL:

/*reading number of control points*/

int n=sizeof(**_Matrix);


The size of a pointer is a constant, irrespective of what the pointer points to, even if, as here, it points to a pointer.

How did you get this far without testing the components?

I sorry, I dont follow you.

I tried to do it using dynamic memory allocation, but i read in some place else that it isnt good to do so. so i created a Pool to handle it.
About the components, i am using their datasheet as reference. I will start to test it once the program is finished.

if (_Matrix[0][0]<= _DesiredPoint <=_Matrix[1][0])And that?

Please, stop and do some basic C tutorials.

AWOL:
if (_Matrix[0][0]<= _DesiredPoint <=_Matrix[1][0])And that?

That is to check if the specified values is between the interval.

Dylantrevor:
That is to check if the specified values is between the interval.

That's what it looks like it does.
But it doesn't.

AWOL:
That's what it looks like it does.
But it doesn't.

about the main problem, any suggestions ?

Dylantrevor:
about the main problem, any suggestions ?

Reply #9

I don't see a "main problem", I see a number of problems.

HI,

I follow o advice and i redo my code. Everything seems work fine.

I am have trouble at Sensor reading. This Sensor should read values 0~5V to be used on a feedback system (not complete).

Main Code:

#define BaudRate 9600

#include "Classes.h"

Object Gas1(3,A0);
Object Gas2(5,A1);
Object Gas3(6,A2);
Object Gas4(9,A3);
Object Temperature(10,A4);
Object Pressure(11,A5);

int
nPoints;

unsigned long
StartTime = 0,
OperationTime = 0,
FinishTime = 0;

void setup()
{
  /*Open Communication channel*/
  Serial.begin(BaudRate);
}


void loop()
{
  /*Establishing Connection*/
  while (Serial.readStringUntil('\n') != "Trying to Connect") {}
  Serial.println("Connected");

  /*Dimensioning Matrices*/
  while (Serial.readStringUntil('\n') != "N Points") {}
  while(!Serial.available()){}
  nPoints = Serial.readStringUntil('\n').toInt();
  Serial.println("N Points recieved");

Serial.println(nPoints);

  Gas1.nPoints = nPoints;
  Gas2.nPoints = nPoints;
  Gas3.nPoints = nPoints;
  Gas4.nPoints = nPoints;
  Temperature.nPoints = nPoints;
  Pressure.nPoints = nPoints;

  /*Data Matrix*/
Serial.println("Gas 1:\t\t\t\t Gas 2:\t\t\t\t Gas 3:\t\t\t\t Gas 4:\t\t\t\t Temperature:\t\t\t Pressure:"); 
Serial.println("Time\tx\tTension\t\t Time\tx\tTension\t\t Time\tx\tTension\t\t Time\tx\tTension\t\t Time\tx\tTension\t\t Time\tx\tTension"); 
  for (int i = 0; i < nPoints; i++)
  {
    while(!Serial.available()){}
    Gas1.DataMatrix[i][0]         = Serial.readStringUntil('\n').toDouble();
    while(!Serial.available()){}
    Gas1.DataMatrix[i][1]         = Serial.readStringUntil('\n').toDouble();

//    while(!Serial.available()){}
//    Gas2.DataMatrix[i][0]         = Serial.readStringUntil('\n').toDouble();
//    while(!Serial.available()){}
//    Gas2.DataMatrix[i][1]         = Serial.readStringUntil('\n').toDouble();
//
//    while(!Serial.available()){}
//    Gas3.DataMatrix[i][0]         = Serial.readStringUntil('\n').toDouble();
//    while(!Serial.available()){}
//    Gas3.DataMatrix[i][1]         = Serial.readStringUntil('\n').toDouble();

//    while(!Serial.available()){}
//    Gas4.DataMatrix[i][0]         = Serial.readStringUntil('\n').toDouble();
//    while(!Serial.available()){}
//    Gas4.DataMatrix[i][1]         = Serial.readStringUntil('\n').toDouble();
//
//    while(!Serial.available()){}
//    Temperature.DataMatrix[i][0]  = Serial.readStringUntil('\n').toDouble();
//    while(!Serial.available()){}
//    Temperature.DataMatrix[i][1]  = Serial.readStringUntil('\n').toDouble();
//
//    while(!Serial.available()){}
//    Pressure.DataMatrix[i][0]     = Serial.readStringUntil('\n').toDouble();
//    while(!Serial.available()){}
//    Pressure.DataMatrix[i][1]     = Serial.readStringUntil('\n').toDouble();

Serial.print(Gas1.DataMatrix[i][0]);
Serial.print("\t\t");
Serial.print(Gas1.DataMatrix[i][1]);
Serial.print("\t\t");

//Serial.print(Gas2.DataMatrix[i][0]);
//Serial.print("\t\t");
//Serial.print(Gas2.DataMatrix[i][1]);
//Serial.print("\t\t");
//
//Serial.print(Gas3.DataMatrix[i][0]);
//Serial.print("\t\t");
//Serial.print(Gas3.DataMatrix[i][1]);
//Serial.print("\t\t");

//Serial.print(Gas4.DataMatrix[i][0]);
//Serial.print("\t\t");
//Serial.print(Gas4.DataMatrix[i][1]);
//Serial.print("\t\t");
//
//Serial.print(Temperature.DataMatrix[i][0]);
//Serial.print("\t\t");
//Serial.print(Temperature.DataMatrix[i][1]);
//Serial.print("\t\t");
//
//Serial.print(Pressure.DataMatrix[i][0]);
//Serial.print("\t\t");
//Serial.print(Pressure.DataMatrix[i][1]);
//Serial.print("\t\t");

Serial.println();
  }
  
Serial.println("Finished Matrices");

  /*Starting Operation*/
  //Defining StartTime
  StartTime = millis()/1000;
Serial.print("Starting time:");
Serial.println(StartTime);
  
  //Defining FinsihTime
  FinishTime = Gas1.DataMatrix[nPoints - 1][0];
  if (FinishTime < Gas2.DataMatrix[nPoints - 1][0])         {    FinishTime = Gas2.DataMatrix[nPoints - 1][0];  }
  if (FinishTime < Gas3.DataMatrix[nPoints - 1][0])         {    FinishTime = Gas3.DataMatrix[nPoints - 1][0];  }
  if (FinishTime < Gas4.DataMatrix[nPoints - 1][0])         {    FinishTime = Gas4.DataMatrix[nPoints - 1][0];  }
  if (FinishTime < Temperature.DataMatrix[nPoints - 1][0])  {    FinishTime = Temperature.DataMatrix[nPoints - 1][0];  }
  if (FinishTime < Pressure.DataMatrix[nPoints - 1][0])     {    FinishTime = Pressure.DataMatrix[nPoints - 1][0];  }
Serial.print("Finish time:");
Serial.println(FinishTime);

  while (OperationTime <= FinishTime)
  {
    //Defining OperationTime
    OperationTime = (millis()/1000) - StartTime;
Serial.print("Operation time:\t");
    Serial.println(OperationTime);

    Gas1.TensionWrite(OperationTime);

   delay(500);
   
  }
  StartTime=0;
  OperationTime=0;
  FinishTime=0;
  

}

Classe Code:

#include    "Arduino.h"

#ifndef Classes_H
#define Classes_H

#define MatrixPool 13
class Object
{
  public:
    Object(int _pPWM,int _pAnalog);
    int
      nPoints;
    double
      DataMatrix[MatrixPool][2];
    double 
      SourceTension=5;
    double
      kp=0.1,
      ki=0,
      kd=0;    
      
    double Tension(double _Time);
    double TensionRead();
    void TensionWrite(double _Time);
      
  private:
    int
      MaxPWM=255,
      MaxTension=5;
    int
      PWMPin,
      AnalogPin;
    
    double
      Error=0,
      Sensor,
      PID=0,
      TimeN,
      TimeNLessOne,
      DeltaTime,
      PWM;
};


Object::Object(int _pPWM,int _pAnalog)
{
  /*Read pinwire*/
  PWMPin=_pPWM;
  AnalogPin=_pAnalog;
  
  //Pin Mode
  pinMode(PWMPin,OUTPUT);
};

double Object::Tension(double _Time)
{
  /*PWM Variable*/
  double tension=-1;

  /*Interval array*/
  double k[2][2];
  
  /*Select interval*/
  for (int i=0; i<nPoints; i++)
  {
    if (DataMatrix[i][0]<_Time)
    {
      /*x_axays*/
      k[0][0]=DataMatrix[i][0];
      k[1][0]=DataMatrix[i+1][0];
      
      /*y_axis*/
      k[0][1]=DataMatrix[i][1];
      k[1][1]=DataMatrix[i+1][1];      
    }
  }
  
  tension=(_Time-k[0][0])/(k[1][0]-k[0][0])*(k[1][1]-k[0][1])+k[0][1];
  return tension;
};

double Object::TensionRead()
{
  double tension;
  
  tension=analogRead(AnalogPin) * (SourceTension / 1023.0); 
  
  return tension;
};

void Object::TensionWrite(double _Time)
{
  /*Value for Reference*/
  double SetPoint=Tension(_Time);
  
  /*PDI*/
    /*Variables*/
  double 
    P,        //Proportional
    I,        //Integral
    D,        //Derivative
    PID;
    /*Math*/
      //Proportional
  P=kp*Error; 
      //Integral
  I=ki*0;
      //Derivative
  D=kd*0;
      //PID
  PID=P+I+D;
      
  /*PWM*/
  PWM=SetPoint+PID;
  PWM=constrain(PWM,0.0,5.0); //Ensures that the value is among the values accepted by the Arduino
  Serial.print("PWN:\t");
  Serial.print(PWM);
  PWM=51*PWM;  //Convert from Voltage to Pulse Mod
  PWM=(int)PWM; //Convert from double to Int to be used on PWM port
  analogWrite(PWMPin,PWM);
  
  /*Value read at sensor*/
  Sensor=TensionRead();
  Error=SetPoint-Sensor;
  
  Serial.print("\tSensor: ");
  Serial.print(Sensor);
  Serial.print("\tError: ");
  Serial.print(Error);
  Serial.print("\tPID: ");
  Serial.println(PID);

  
};


#endif

Wire diagrams are attached

PS: half of the code is commented to help test it fast.