Как создавать объекты со своими переменными?

lcd button object-oriented

Итак, я создал класс, и когда я создавал объекты и использовал их, кажется, что они разделяют свои переменные друг с другом (currentReading, previousReading и переменная времени). как я могу создавать объекты, которые имеют свои собственные переменные, чтобы не возникало конфликтов?

код: (прочитайте кнопки и распечатайте их на ЖК-экране)

#include <LiquidCrystal.h>

LiquidCrystal lcd(6, 5, 3, 2, 1, 0);


class button {
  public:
    void SetupButton(int pino);
    int Read();

  private:
    int _pin;
};

void button::SetupButton(int pin) {
  pinMode(pin, INPUT_PULLUP);
  _pin = pin;

}


int button::Read() {
  static boolean currentReading, previousReading = 1;
  static unsigned long time;




  currentReading = digitalRead(_pin);// чтение
  if (previousReading - currentReading  == 1) { // при чтении переходит от 1 к 0
    time = millis();
  }

  if (currentReading - previousReading == 1 && (50 < (millis() - time) < 500)) {     // когда чтение возвращается к 1 до 500 мс
    previousReading = currentReading;
    return 1;
  }

  if (3000 > (millis() - time) && (millis() - time) > 500 && !currentReading) { // при чтении сохраняется 0 после 500 мс
    previousReading = currentReading;
    return 2;
  }

  if ((millis() - time) > 3000 && !currentReading) { // // при чтении сохраняется 0 после 3000 мс
    previousReading = currentReading;
    return  3;
  }

  previousReading = currentReading; // текущее чтение становится предыдущим

  return 0;
}


button up;
button down;


void setup() {
  lcd.begin(16, 2);
  up.SetupButton(A0);
  down.SetupButton(A1);

}
void loop() {


  lcd.setCursor(0, 0);
  lcd.print(up.Read());
  lcd.print(down.Read());


}

ps: я уже знаю, как это сделать без использования классов, но выполнение этого с классами делает код намного чище, поэтому я пытаюсь добиться этого

, 👍0

Обсуждение

вы можете протестировать код в https://www.tinkercad.com/things/8oXS6FQNK6A-dazzling-jaban., @Lucas Alexandre

В вашем классе есть только один атрибут _pin, который является частным. Если вы хотите иметь переменные для каждого экземпляра, они должны быть в вашем классе. Кажется, ваш код не создает экземпляры классов., @Milliways

Итак, если я создам еще один атрибут для каждой переменной (например, _currentReading,_previousReading, _time) и использую их в функциях, решит ли это мою проблему?, @Lucas Alexandre

Это будет первый шаг, но вам необходимо создать экземпляры вашего класса, например up = button(4); Передача важных атрибутов в конструктор является нормальным явлением., @Milliways

большое спасибо! Я только что создал новые атрибуты и изменил все переменные с помощью их аналога атрибута, и это сработало безупречно, опубликуйте это как ответ, чтобы я мог проголосовать за него., @Lucas Alexandre

этот вопрос не об Arduino. речь идет о С++, @Juraj


1 ответ


Лучший ответ:

0

У меня возникло искушение переписать ваш код (я довольно хорошо разбираюсь в C++), но, возможно, вам лучше начать с существующего класса.

На сайте Arduino есть класс Button. См. https://playground.arduino.cc/Code/Button

Вы можете использовать это или изучить, чтобы увидеть более обычную реализацию C++ и адаптировать свой код.

Практически ВСЕ классы C++ содержат конструктор. Я бы использовал вместо SetupButton

void button::button(int pin) {
  this->_pin=pin;
  pinMode(pin, INPUT_PULLUP);
}

и добавьте uint8_t previousReading; и unsigned long time; в свой класс в качестве частных переменных.

,