Классы Arduino, не могут получить значение свойства
Я изо всех сил пытался заставить шаговый двигатель работать с классом, но не могу получить свойство, возвращающее его значение в методе. Я получаю 0 (ноль) вместо 26 (ожидаемых) от _stepPin.
Я пробовал это->_stepPin безуспешно.
Вот код. Смотрите комментарии внутри.
class MKSStepperMotors {
public:
int _dirPin;
int _stepPin;
int _enablePin;
MKSStepperMotors(int dirPin, int stepPin, int enablePin) {
int _dirPin = dirPin;
int _stepPin = stepPin;
int _enablePin = enablePin;
//Habilitamos el motor
pinMode(_enablePin, OUTPUT);
digitalWrite(_enablePin, LOW);
//Cambiamos la direccion y aumentamos la velocidad
pinMode(_dirPin, OUTPUT);
digitalWrite(_dirPin, LOW);
// Le indicamos el pin de señal
pinMode(_stepPin, OUTPUT);
}
void move(int steps, int stepDelay)
{
for (int x = 0; x < steps; x++) {
Serial.println(_stepPin); // <-- _stepPin равен нулю, а не 26, как должно быть
digitalWrite(_stepPin, HIGH); <-- _stepPin is zero and not 26 as it should
delayMicroseconds(stepDelay);
digitalWrite(_stepPin, LOW); <-- _stepPin is zero and not 26 as it should
delayMicroseconds(stepDelay);
}
}
};
MKSStepperMotors pedo(28, 26, 24);
void setup() {
Serial.begin(250000);
}
void loop() {
pedo.move(3200,100);
}
@FedeKrum, 👍0
2 ответа
Лучший ответ:
Помещая туда тип, вы создаете новые переменные. ТАК в вашем конструкторе:
MKSStepperMotors(int dirPin, int stepPin, int enablePin) {
int _dirPin = dirPin;
int _stepPin = stepPin;
int _enablePin = enablePin;
Вы начинаете с создания трех новых переменных с теми же именами, что и переменные-члены, определенные в классе. В остальной части конструктора они используются вместо тех, которые являются переменными-членами.
Вы должны убрать здесь "int".
У вас также есть еще одна ошибка. Конструктор может запускаться перед функцией инициализации, если один из этих объектов объявлен в глобальной области видимости. В этом случае такие вещи, как digitalWite и pinMode, пока не будут работать. Конструктор должен иметь только код для инициализации переменных, он никогда не должен касаться оборудования. Материал, который использует аппаратное обеспечение, должен находиться в другой функции-члене (обычно называемой begin или init), которую вы можете вызвать из установки.
Вы повторно объявили поля-члены класса в своем конструкторе:
class MKSStepperMotors {
public:
int _dirPin;
int _stepPin;
int _enablePin;
MKSStepperMotors(int dirPin, int stepPin, int enablePin) {
int _dirPin = dirPin;
int _stepPin = stepPin;
int _enablePin = enablePin;
...
}
int _dirPin = dirPin;
объявляет локальную переменную с тем же именем, что и член вашего класса _dirPin
, и затеняет ее, следовательно, ваши 3 члены класса никогда не инициализируются!
Вы должны изменить свой конструктор следующим образом:
MKSStepperMotors(int dirPin, int stepPin, int enablePin) {
_dirPin = dirPin;
_stepPin = stepPin;
_enablePin = enablePin;
...
}
Или лучше использовать стандартную инициализацию конструктора C++:
MKSStepperMotors(int dirPin, int stepPin, int enablePin)
:_dirPin(dirPin),_stepPin(stepPin),_enablePin(enablePin) {
...
}
В этом последнем примере вам не нужно инициализировать члены вашего класса в теле конструктора, поскольку они уже инициализированы до того, как тело будет выполнено (это идиоматическое использование C++).
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Проблема с датчиком температуры и влажности DHT11
- Получение ошибки ets 8 января 2013,rst cause:4,boot mode(1,6) wdt reset
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Массив динамического размера в качестве члена класса
Сработало!!!!! И я принял предложение метода «init». СПАСИБО., @FedeKrum