Светодиод и кнопка в классах.
- Войдите на сайт для отправки комментариев
Ср, 06/07/2016 - 03:09
Задача простая. Светодиод кнопка .
Кнопку нажали- светодиод горит. Отпустили, разумеется погасла. Задачу можно решить без Ардуины и тем более без содание классов. Но все же если попробовать. Что из этого выйдет.
Моя версия кода.
// программа класс светодиод, класс кнопка
#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();
}
1. Для светодиода может понадобиться запрос текущего состояния.
2. А вот для кнопки переменная, хранящая считанное значение, явно лишняя.
3. Зачем писать (SB1.input() == 1), это чем-то лучше, чем просто SB1.input()?
Я такое уже делал (с помощью ЕвгенияП) http://arduino.ru/forum/programmirovanie/biblioteka-dlya-tsifrovogo-vykhoda Только для кнопки антидребезг организован, а для выходов медленный шим, инвертирование, приравнивание одного выхода к другому.
Для того что бы гнуть ложку, надо поверить что ложки нет. Из Матрицы. Вот так и с дребезгом. Правильно организованая программа дребезг не чувствует.
Ладно продолжу. Теперь возьмем 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(); }Правильно организованая программа дребезг не чувствует.
delay(100);//пауза 0.1 сек потому что нечего бегать процессоружги дальше - все внимательно жрут попкорн.
boolean _data; // номер вывода int _pin; // состояние светодиодаА не наоборот? :)
// --- класс кнопка ---- class qw_bottom { public: qw_bottom(int pin); // конструктор ..... .....qw_button, тогда уж - bottom это что-то совсем другое.
Для того что бы гнуть ложку, надо поверить что ложки нет. Из Матрицы. Вот так и с дребезгом. Правильно организованая программа дребезг не чувствует.
Да. Это так. О нем просто не задумываешся и он не проявляется.
Для того что бы гнуть ложку, надо поверить что ложки нет. Из Матрицы. Вот так и с дребезгом. Правильно организованая программа дребезг не чувствует.
Да. Это так. О нем просто не задумываешся и он не проявляется.
дребезга нед!(с)delay(100)
Почти. Гиря лежит неподвижно, хотя все её атомы в движении, но это не мешает нам считать гирю неподвижной. делей - моветон, нада делом заниматся, а не делеится или дребезг кнопки опрашивать.
qwone, а почему у Вас "on" - 1, а "off" - 0? Обычно активный уровень низкий. Тут, конечно, у каждого свои заморочки, но все равно, стоило бы в конструкторе указать, какой именно уровень считается активным. И не включать сразу светодиод. По умолчанию он должен быть выключен.
Это по желанию. Вы видете , что я не создал из класса библиотеку и не отправил их в .h и .срр файлы. Позже я дам продолжение. А библиотеку я не делаю, что бы не создавалось много лишнего кода компилятором.
Да и еще классы я создал qw_bottom и qw_led. Только из -за того что бы они не мешались с привычными.Много разных классов и библиотек с одними и теми же названиями банально сбивают людей. Вы можете городить свои классы с нужной вам логикой 0 или 1. Называть к примеру an_bottom и an_led. Тогда вы точно не будете мешать их с моими.
qwone, я не собираюсь пользоваться Вашими классами. От слова совсем. Мне проще написать свои под мои конкретные задачи, чем разбираться с Вашими.
Но коль скоро Вы создали тему, значит, Вы предлагаете обсуждение. Вот в рамках обсуждения я и предупредил Вас, что отождествление активного уровня с 1 в корне неверно. А также порекомендовал режим "выключено" по умолчанию. Первое - принципиально, второе - по вкусу.