Как создавать объекты со своими переменными?
Итак, я создал класс, и когда я создавал объекты и использовал их, кажется, что они разделяют свои переменные друг с другом (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: я уже знаю, как это сделать без использования классов, но выполнение этого с классами делает код намного чище, поэтому я пытаюсь добиться этого
@Lucas Alexandre, 👍0
Обсуждение1 ответ
Лучший ответ:
У меня возникло искушение переписать ваш код (я довольно хорошо разбираюсь в 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;
в свой класс в качестве частных переменных.
- Как преобразовать код Arduino во встроенный код C/C++
- Использование switch case с 5-позиционным переключателем и последовательным выходом
- Как заставить ЖК-экран прокручивать текст , позволяя вводить кнопки?
- Проблема с кнопкой
- Две кнопки, один ЖК-дисплей
- Заставьте одну кнопку печатать разные предложения на ЖК-дисплее
- Как заставить кнопку Arduino забыть о своем прошлом назначении?
- Закодируйте и подключите ЖК-дисплей и кнопку
вы можете протестировать код в 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