У меня небольшая ошибка с моим последним кодом проекта Arduino, который использует библиотеку TimerOne для отображения чисел на 4-значном 7-сегментном дисплее. Я использую прерывание, чтобы микропроцессор постоянно переключался между каждой цифрой, поскольку они, по сути, связаны друг с другом.
У меня есть код, работающий отлично, если я сохраню все это в основном файле PDE, но я подумал, что было бы лучше изолировать отображение в отдельном классе.
У моего компилятора проблемы со второй строкой следующего кода в PDE:
Timer1.initialize(500);
Timer1.attachInterrupt(digitDisplay.flashDigit,500);
Второй аргумент в attachInterrupt должен быть необязательным, Я пробовал с этим и без него! Как бы то ни было, я получаю следующую ошибку:
DigitDisplayTest.cpp: In function 'void setup()':
DigitDisplayTest:29: error: no matching function for call to 'TimerOne::attachInterrupt()'
C:\Program Files (x86)\arduino-0022\arduino-0022\libraries\Timer1/TimerOne.h:62: note: candidates are: void TimerOne::attachInterrupt(void (*)(), long int)
В DigitDisplay (экземпляром которой является digitDisplay) я определяю flashDigit следующим образом:
class DigitDisplay
{
private:
/*...*/
public:
/*...*/
void flashDigit();
}
void DigitDisplay::flashDigit()
{
wipeDisplay();
for (int i = 0; i < _digitCount ; i++)
{
if ( i == _digit ) digitalWrite( _digitPins[i], HIGH );
else digitalWrite( _digitPins[i], LOW );
}
displayNumber(_digits[_digit]);
_digit++ ;
_digit %= _digitCount;
}
Если вам требуется больше кода, дайте мне знать, но я почти уверен, что нет ничего плохого в gubbings метода flashDigit () - он определенно работал до того, как я поместил его в отдельный класс.
Очевидно, я могу обойти эту ошибку, добавив
void Interrupt()
{
digitDisplay.flashDigit();
}
к основному PDE и прикрепив эту функцию, но это всего лишь работа, было бы неплохо, если бы я мог вызвать ее напрямую.
Я вижу, что ошибка связана с созданием указателя на функцию (которого не существует, отсюда и ошибка), но указатели не являются моей сильной стороной, поэтому я мог бы справиться с ручной сортировкой.