Библиотека SimpleTimer в собственном классе. Как использовать?

conceptroot
Offline
Зарегистрирован: 25.10.2015

Добрый вечер, форумчане.

Наверное многие знакомы с библиотекой SimpleTimer. Позволяет не заморачиваться на использование millis() и очень удобна. Использовать ее очень просто в проектах.

НО, как ее использовать в своем классе? Опыта в програмировании не много, поэтому буду очень благодарен за все возможные варианты решения проблемы. Компилятор начинает ругаться - в cpp файле помечена ошибка.

Это .h файл библиотеки

#ifndef ConceptSmartHome_h
#define ConceptSmartHome_h
#include "SimpleTimer.h"
class ConceptPIR {
  private:
   int pir_pin; //Пин куда подключен PIR сенсор
   int time_till_off; // Время, через которые вырубается свет
   SimpleTimer pir_timer;
 public:
    ConceptPIR(int _pir_pin, int _time_till_off);
    bool begin(); //Функция для использования в Setup, инициализирует инпуты и другое
    bool run(); //Функция для использования в loop, Она то все и делает.
    void callback_function(); // Функция, которая вызывается когда срабатывает таймер
};
#endif

Это .cpp файл библиотеки

#include "ConceptSmartHome.h"
#include "SimpleTimer.h"
ConceptPIR::ConceptPIR(int _pir_pin, int _time_till_off){
  pir_pin=_pir_pin;
  time_till_off= _time_till_off;
  SimpleTimer pir_timer;
}
void ConceptPIR::callback_function(){
}
bool ConceptPIR::begin(){
  pinMode(pir_pin, INPUT);
  //pir_timer.setInterval(time_till_off, callback_function); //Если убрать комментирование, компилятор выдает ошибку
  return true;
}

bool ConceptPIR::run(){
  pir_timer.run();
  return true;
}

Компилятор выдает: 


C:\Users\HOME\Dropbox\Arduino\arduino-1.6.3\libraries\ConceptSmartHome\ConceptSmartHome.cpp: In member function 'bool ConceptPIR::begin()':
C:\Users\HOME\Dropbox\Arduino\arduino-1.6.3\libraries\ConceptSmartHome\ConceptSmartHome.cpp:23:57: error: no matching function for call to 'SimpleTimer::setInterval(int&, <unresolved overloaded function type>)'
   pir_timer.setInterval(time_till_off, callback_function);

Прошу сильно не ругаться. Програмированние - хобби.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уберите строку 6 в cpp для начала, т.к. переменная уже объявлена в классе.

А что касается ошибки - нельзя вторым параметром передавать адрес метода. Обзовите свою callback_function, например static (просто добавьте слово static перед объявлением функции).  Ошибка исчезнет.

Только тогда и работать с нею надо как со static (надеюсь, Вы знаете что такое статические члены класса), т.е. адрес экземпляра ей надо где-то брать. К сожалению SimpleTimer писали любители и потому у setInterval нет стандартоного для callback'ов параметра UserData (обычно через него просто this передаётся). Но можно либо передавать через внештние данные, либо модифицировать SimpleTimer.