Skip to main content
2 of 4
added 992 characters in body

Arduino declaring class in h and cpp file Undefined Reference

I am trying to compile my project, but unfortunately get errors.

I created class and separated implementation and declaration (cpp file and h file)

Here they are

sensor.h

#ifndef SENSOR_H
#define SENSOR_H
#include <stdint.h>
#include "Arduino.h"
// Sensor types
enum SensorType {
  ANY_SENSOR,
  UNKNOWN_SENSOR,
  WATER_SENSOR,
  TEMPERATURE_SENSOR,
  VIBRATION_SENSOR,
  INTERCOM_SENSOR,
  HUMIDITY_SENSOR,
  PIR_SENSOR,
  SOUND_SENSOR,
  LIGHT_SENSOR
};
class Sensor {
  public:
  // Variables declaration
    uint32_t sensorId;
    SensorType sensorType;
    float currentValue;
    bool isEnabled;
    float criticalLowerLevel;
    float criticalUpperLevel;
   // Methods declaration
    Sensor();
    Sensor(uint32_t id,SensorType type,long currentValue,bool isEnabled,long lower,long upper);
    String toString();
    bool isCriticalLevelRised() {
      return (this->currentValue >= this->criticalUpperLevel || this->currentValue <= this->criticalLowerLevel);
    };
    void enable(bool enable);
    void toggle();
    static String convertSensorTypeToString(SensorType sensorType);
};


#endif

And cpp file

#include "sensor.h"
Sensor::Sensor()
{
  this->sensorId = 0;
  this->sensorType = UNKNOWN_SENSOR;
  this->currentValue = 0;
  this->isEnabled = false;
  this->criticalLowerLevel = 0;
  this->criticalUpperLevel = 0;
}
Sensor::Sensor(uint32_t id,SensorType type,long currentValue,bool isEnabled,long lower,long upper) {
  this->sensorId = id;
  this->sensorType = type;
  this->currentValue = currentValue;
  this->isEnabled = isEnabled;
  this->criticalLowerLevel = lower;
  this->criticalUpperLevel = upper;
}
void Sensor::enable(bool enable) { 
   this->isEnabled = enable;
}
void Sensor::toggle() {
  this->enable(!this->isEnabled);
}
String Sensor::toString()
{
  String response = "";
  response += F("Sensor id is ");
  response += this->sensorId;
  response += '\n';
  response += F("Sensor type is ");
  response += convertSensorTypeToString(this->sensorType);
  response += '\n';
  response += F("Sensor current value is ");
  response += this->currentValue;
  response += '\n';
  response += F("Sensor isEnabled is ");
  response += this->isEnabled;
  response += '\n';
  response += F("Sensor criticalLowerLevel is ");
  response += this->criticalLowerLevel;
  response += '\n';
  response += F("Sensor criticalLowerLevel is ");
  response += this->criticalUpperLevel;
  response += '\n';
  return response;
}
String Sensor::convertSensorTypeToString(SensorType sensorType) {
  switch (sensorType) {
    case UNKNOWN_SENSOR:
      return F("UNKNOWN SENSOR");
    case ANY_SENSOR:
      return F("ANY_SENSOR");
    case WATER_SENSOR:
      return F("WATER_SENSOR");
    case TEMPERATURE_SENSOR:
      return F("TEMPERATURE_SENSOR");
    case VIBRATION_SENSOR:
      return F("VIBRATION_SENSOR");
    case HUMIDITY_SENSOR:
      return F("HUMIDITY_SENSOR");
    case PIR_SENSOR:
      return F("PIR_SENSOR");
    case SOUND_SENSOR:
      return F("SOUND_SENSOR");
    case LIGHT_SENSOR:
      return F("LIGHT_SENSOR");
    default:
      return F("UNKNOWN TYPE");
  }
}

And I got following errors

ketch/NodeIntercom.ino.cpp.o: In function `sendSensorMessageToMaster(RF24Mesh*, SensorDataMessage*, char, unsigned int, bool)':
/home/iron/Arduino/What'sHappening/NetworkMaster/additional_functions.h:48: undefined reference to `Sensor::toString()'
sketch/NodeIntercom.ino.cpp.o: In function `handleSetSensorDataRequest(RF24NetworkHeader*)':
/home/iron/Arduino/What'sHappening/NodeIntercom/NodeIntercom.ino:97: undefined reference to `Sensor::toggle()'
/home/iron/Arduino/What'sHappening/NodeIntercom/NodeIntercom.ino:89: undefined reference to `Sensor::enable(bool)'
sketch/NodeIntercom.ino.cpp.o: In function `SensorDataMessage':
/home/iron/Arduino/What'sHappening/NetworkMaster/common.h:40: undefined reference to `Sensor::Sensor()'
sketch/NodeIntercom.ino.cpp.o: In function `__static_initialization_and_destruction_0':
/home/iron/Arduino/What'sHappening/NodeIntercom/NodeIntercom.ino:35: undefined reference to `Sensor::Sensor(unsigned long, SensorType, long, bool, long, long)'
collect2: error: ld returned 1 exit status

What I am doing wrong ? Please help.

EDIT

Yes main sketch compiles perfectly where this files are located.

But I don't want to duplicate common files in my all my arduino sketches withing the project, they are the same for whole project. Here my files location

--ArduinoProjects
---NodeIntercom
----NodeIntercom.ino
---MasterNode
----MasterNode.ino
----sensor.h
----sensor.cpp
----common.h

So this files are only located in MasterNode directory

And I tried to include them like this

#include "/home/iron/Arduino/What'sHappening/NetworkMaster/common.h"
#include "/home/iron/Arduino/What'sHappening/NetworkMaster/additional_functions.h"

And in common.h I include sensor.h Also tried to include directly, but still the same

But headers files included as above works perfectly.

What is the right way to solve this problem, I don't want to duplicate this class in each folder whenever I change it.

If there is no way, maybe create symbolic link (I am using linux) ?