#c #oop #arduino
#c #ооп #arduino
Вопрос:
Я написал класс удаления для удаления входных данных.
Идея заключалась в том, что состояние определенного ввода может быть включено, выключено, ПАДАТЬ или ПОВЫШАТЬСЯ. object.debounceInputs() должен вызываться с фиксированным интервалом
С помощью функции object.readInput() можно считывать правильное состояние объекта. Состояние ПАДЕНИЯ или ПОВЫШЕНИЯ длится всего 1 интервал времени (обычно устанавливается равным 20 мс), и эти состояния могут быть прочитаны только один раз.
Конечно, я протестировал программное обеспечение, и оно работало без сбоев, теперь я начал использовать программное обеспечение в других проектах, и обнаружилась своеобразная ошибка.
Программное обеспечение работает отлично… если у вас есть только один входной объект. Если вы удаляете более 1 объекта, входные данные влияют друг на друга, что не должно быть возможным, поскольку каждый объект использует частные переменные.
Исходный код:
#include "debounceClass.h"
Debounce::Debounce(unsigned char _pin) {
pinMode(_pin, INPUT_PULLUP); // take note I use a pull-up resistor by default
pin = _pin;
}
unsigned char Debounce::readInput() {
byte retValue = state;
if(state == RISING) state = ON; // take note I use a pull-up resistor
if(state == FALLING) state = OFF; // rising or falling may be returned only once
return retValue;
}
void Debounce::debounceInputs() {
static bool oldSample = false, statePrev = false;
bool newSample = digitalRead(pin);
if(newSample == oldSample) { // if the same state is detected atleast twice in 20ms...
if(newSample != statePrev) { // if a flank change occured return RISING or FALLING
statePrev = newSample ;
if(newSample) state = RISING;
else state = FALLING;
}
else { // or if there is no flank change return PRESSED or RELEASED
if(newSample) state = ON;
else state = OFF;
}
}
oldSample = newSample;
return 255;
}
Соответствующий файл заголовка:
#include <Arduino.h>
#ifndef button_h
#define button_h
//#define
#define ON 9 // random numbers, RISING and FALLING are already defined in Arduino.h
#define OFF 10
class Debounce {
public:
Debounce(unsigned char _pin);
unsigned char readInput();
void debounceInputs();
private:
unsigned char state;
unsigned char pin;
};
#endif
У меня была эта ошибка с 2 отдельными проектами, так что ошибка определенно заключается в моем классе Debounce.
Пример программы для иллюстрации программы:
#include "debounceClass.h"
const int pin3 = 3 ;
const int pin4 = 4 ;
Debounce obj1( pin3 ) ;
Debounce obj2( pin4 ) ;
byte previousState1, previousState2;
unsigned long prevTime = 0, prevTime1 = 0, prevTime2 = 0;
void setup()
{
Serial.begin( 115200 ) ;
// CONSTRUCTOR OF OBJECTS SETS THE PINMODE TO INPUT_PULLUP
pinMode( pin3, OUTPUT ) ;
pinMode( pin4, OUTPUT ) ;
}
const int interval = 20, interval1 = 1000, interval2 = 2000;
void loop() {
unsigned long currTime = millis() ;
if( currTime > prevTime interval ) {
prevTime = currTime ;
obj1.debounceInputs(); // comment one of these 2 out, and the other debounces perfectly
obj2.debounceInputs();
#define printState(x) case x: Serial.print(#x); break
byte state = obj1.readInput() ;
if( state != previousState1 ) {
previousState1 = state ;
Serial.print("state of obj1 = ") ;
switch ( state ) {
printState( ON ) ;
printState( OFF ) ;
printState( RISING ) ;
printState( FALLING ) ;
}
Serial.println();
}
state = obj2.readInput() ;
if( state != previousState2 ) {
previousState2 = state ;
Serial.print("state of obj2 = ") ;
switch ( state ) {
printState( ON ) ;
printState( OFF ) ;
printState( RISING ) ;
printState( FALLING ) ;
}
Serial.println();
}
}
if( currTime > prevTime1 interval1 ) {
prevTime1 = currTime ;
digitalWrite( pin3, !digitalRead( pin3 ) );
}
if( currTime > prevTime2 interval2 ) {
prevTime2 = currTime ;
digitalWrite( pin4, !digitalRead( pin4 ) );
}
}
Эта программа автоматически переключает оба вывода, поэтому вам не нужны физические входные данные. Если вы закомментируете одну из указанных строк, вы увидите, что другой вывод удален просто отлично. Но когда удаляются оба вывода, результат катастрофический. Между двумя объектами существует странная связь, которую я не могу объяснить. Я достиг точки, в которой я начинаю сомневаться в компиляторе, так что это был момент, когда я понял, что мне нужно спросить других.
Почему это происходит и что я здесь сделал не так?
Ответ №1:
Я нашел проблему.
Я не могу использовать статическую переменную в методе класса. Эти статические переменные видны всем объектам, которые вызвали проблему.
Я переместил статические переменные в раздел private variable