Светодиод и кнопка в классах.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Задача простая. Светодиод кнопка .

Кнопку нажали- светодиод горит. Отпустили, разумеется погасла. Задачу можно решить без Ардуины и тем более без содание классов. Но все же если попробовать. Что из этого выйдет.

Моя версия кода.

// программа  класс светодиод, класс кнопка
#define pinLed 13
#define pinBottom 2

// ---класс светодиод---
class qw_led {
  public:
     qw_led(int pin);
     void on();
     void off();
  private:
    int _pin;
};
qw_led::qw_led(int pin){
  _pin=pin;
     pinMode(_pin, OUTPUT); 
}
void qw_led::on(){
       digitalWrite(_pin, HIGH);
}
void qw_led::off(){
      digitalWrite(_pin, LOW);
}
// --- класс кнопка ----
class qw_bottom {
  public:
     qw_bottom(int pin);
     boolean input();
  private:
    int _pin;
    int _data;
};
qw_bottom::qw_bottom(int pin){
  _pin=pin;
   pinMode(_pin, INPUT);
}
boolean qw_bottom::input(){
  _data = digitalRead(_pin);
  return _data;
}

// ----- сама программа ------
qw_led VD1(pinLed);
qw_bottom SB1(pinBottom);
void setup() {
  
}

void loop() {
  delay(100); //пауза 0.1 сек
 if (SB1.input() == 1) VD1.on();
  else VD1.off();
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Для светодиода может понадобиться запрос текущего состояния.

2. А вот для кнопки переменная, хранящая считанное значение, явно лишняя.

3. Зачем писать (SB1.input() == 1), это чем-то лучше, чем просто SB1.input()?

yul-i-an
yul-i-an аватар
Offline
Зарегистрирован: 10.12.2012

Я такое уже делал (с помощью ЕвгенияП) http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda Только для кнопки антидребезг организован, а для выходов медленный шим, инвертирование, приравнивание одного выхода к другому.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Для того что бы гнуть ложку, надо поверить что ложки нет. Из Матрицы.  Вот так и с дребезгом.  Правильно организованая программа дребезг не чувствует.

 Ладно продолжу. Теперь возьмем 6 (кнопок) и 6 светодиодов. Пусть каждая кнопка при нажатии переключает свой светодиод (ВКЛ- ВЫКЛ -ВКЛ).

Мой код.

// программа  класс светодиод, класс кнопка
#define pinVD1 13
#define pinVD2 12
#define pinVD3 11
#define pinVD4 10
#define pinVD5 9
#define pinVD6 8

#define pinSB1 7
#define pinSB2 6
#define pinSB3 5
#define pinSB4 4
#define pinSB5 3
#define pinSB6 2

// ---класс светодиод---
class qw_led {
  public:
     qw_led(int pin); //конструктор класса
     void on();  // включить
     void off(); // выключить
     void invert(); // переключить
  private:
    boolean _data;  // номер вывода
    int _pin;   // состояние светодиода
};
qw_led::qw_led(int pin){
      _pin = pin;
      pinMode(_pin, OUTPUT);
      _data = 1;
      digitalWrite(_pin, _data);
}
void qw_led::on(){
       _data = 1;
       digitalWrite(_pin, _data);
}
void qw_led::off(){
      _data = 0;
      digitalWrite(_pin, _data);
}
void qw_led::invert(){
      _data = ! _data;
      digitalWrite(_pin, _data);
}
// --- класс кнопка ----
class qw_bottom {
  public:
     qw_bottom(int pin); // конструктор
     int input();// 0 не нажата; 1 нажата; 2 передний фронт ; 3 задний фронт
  private:
    int _pin;
    boolean _dataOld;// старое нажатие
    boolean _data;// текущее нажатие
};
qw_bottom::qw_bottom(int pin){
  _pin=pin;
   pinMode(_pin, INPUT);
   _data=digitalRead(_pin);
}
int qw_bottom::input(){
  _dataOld = _data;
  _data = digitalRead(_pin);
  
  if ((_dataOld == 1)&&(_data == 1))return 0;// 0 не нажата
  if ((_dataOld == 0)&&(_data == 0))return 1;// 1 нажата
  if((_dataOld == 1)&&(_data == 0))return 2;//2 передний фронт
  return 3;// 3 задний фронт
}

// ----- сама программа ------
qw_led VD1( pinVD1 );
qw_led VD2(pinVD2);
qw_led VD3(pinVD3);
qw_led VD4(pinVD4);
qw_led VD5(pinVD5);
qw_led VD6(pinVD6);

qw_bottom SB1( pinSB1 );
qw_bottom SB2(pinSB2);
qw_bottom SB3(pinSB3);
qw_bottom SB4(pinSB4);
qw_bottom SB5(pinSB5);
qw_bottom SB6(pinSB6);

void setup() {
  
}

void loop() {
  delay(100); //пауза 0.1 сек потому что нечего бегать процессору

 if (SB1.input() == 2) VD1.invert();
 if (SB2.input() == 2) VD2.invert();
 if (SB3.input() == 2) VD3.invert();
 if (SB4.input() == 2) VD4.invert();
 if (SB5.input() == 2) VD5.invert();
 if (SB6.input() == 2) VD6.invert();

}

 

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

qwone пишет:

Правильно организованая программа дребезг не чувствует.

delay(100); //пауза 0.1 сек потому что нечего бегать процессору

жги дальше - все внимательно жрут попкорн.

Datak
Offline
Зарегистрирован: 09.10.2014

qwone пишет:

    boolean _data;  // номер вывода
    int _pin;   // состояние светодиода

А не наоборот? :)

qwone пишет:

// --- класс кнопка ----
class qw_bottom {
  public:
     qw_bottom(int pin); // конструктор
  .....
  .....

qw_button, тогда уж - bottom это что-то совсем другое.

Logik
Offline
Зарегистрирован: 05.08.2014

qwone пишет:

Для того что бы гнуть ложку, надо поверить что ложки нет. Из Матрицы.  Вот так и с дребезгом.  Правильно организованая программа дребезг не чувствует.

Да. Это так. О нем просто не задумываешся и он не проявляется.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

Logik пишет:

qwone пишет:

Для того что бы гнуть ложку, надо поверить что ложки нет. Из Матрицы.  Вот так и с дребезгом.  Правильно организованая программа дребезг не чувствует.

Да. Это так. О нем просто не задумываешся и он не проявляется.

дребезга нед!(с)delay(100)

Logik
Offline
Зарегистрирован: 05.08.2014

Почти. Гиря лежит неподвижно, хотя все её атомы в движении, но это не мешает нам считать гирю неподвижной. делей - моветон, нада делом заниматся, а не делеится или дребезг кнопки опрашивать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone, а почему у Вас "on" - 1, а "off" - 0? Обычно активный уровень низкий. Тут, конечно, у каждого свои заморочки, но все равно, стоило бы в конструкторе указать, какой именно уровень считается активным. И не включать сразу светодиод. По умолчанию он должен быть выключен.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это по желанию. Вы видете , что я не создал из класса библиотеку и не отправил их в .h и .срр файлы.  Позже я дам продолжение. А библиотеку я не делаю, что бы не создавалось много лишнего кода компилятором.

Да и еще классы я создал qw_bottom и qw_led. Только из -за того что бы они не мешались с привычными.Много разных классов и библиотек с одними и теми же названиями банально сбивают людей.  Вы можете городить свои классы с нужной вам логикой 0 или 1. Называть к примеру  an_bottom и an_led. Тогда вы точно не будете мешать их с моими.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

qwone, я не собираюсь пользоваться Вашими классами. От слова совсем. Мне проще написать свои под мои конкретные задачи, чем разбираться с Вашими.

Но коль скоро Вы создали тему, значит, Вы предлагаете обсуждение. Вот в рамках обсуждения я и предупредил Вас, что отождествление активного уровня с 1 в корне неверно. А также порекомендовал режим "выключено" по умолчанию. Первое - принципиально, второе - по вкусу.