Опрос цифровых и аналоговых кнопок
- Войдите на сайт для отправки комментариев
Вс, 22/04/2018 - 01:15
Оживим темку :)
мой вариант опроса клавиш. Цифровые, аналоговые.
#ifndef KEY_H
#define KEY_H
#define POSITIVE 1
#define NEGATIVE 0
struct flags_struct{
unsigned reading : 1;
unsigned buttonStatePush : 1;
unsigned lastButtonStatePush : 1;
unsigned buttonStatePop : 1;
unsigned lastButtonStatePop : 1;
};
class key
{
private:
flags_struct flags;
byte debounceDelay;
unsigned long lastDebounceTime;
virtual byte readPin();
public:
key(byte _debounceDelay = 50)
{
debounceDelay = _debounceDelay;
}
byte readPush(unsigned long = 0);
byte readPop(unsigned long = 0);
void reset();
};
void key::reset()
{
flags.buttonStatePush = flags.lastButtonStatePush = flags.buttonStatePop = flags.lastButtonStatePop = readPin();
}
byte key::readPush(unsigned long _delay)
{
flags.lastButtonStatePush = flags.reading;
flags.reading = readPin();
if (flags.reading != flags.lastButtonStatePush) lastDebounceTime = millis();
if ((millis() - lastDebounceTime) > debounceDelay + (flags.reading ^ HIGH ? 0 : _delay)) {
if (flags.reading != flags.buttonStatePush) {
flags.buttonStatePush = flags.reading;
if (flags.buttonStatePush == HIGH) return 1;
}
}
return 0;
}
byte key::readPop(unsigned long _delay)
{
flags.lastButtonStatePop = flags.reading;
flags.reading = readPin();
if (flags.reading != flags.lastButtonStatePop) lastDebounceTime = millis();
if ((millis() - lastDebounceTime) > debounceDelay + (flags.reading ^ LOW ? 0 : _delay)) {
if (flags.reading != flags.buttonStatePop) {
flags.buttonStatePop = flags.reading;
if (flags.buttonStatePop == LOW) return 1;
}
}
return 0;
}
class digitalKey : public key
{
private:
byte k;
byte p;
byte readPin();
public:
digitalKey(byte _k, byte _p = NEGATIVE, byte mode = INPUT_PULLUP, byte _debounceDelay = 50) : key(_debounceDelay)
{
k = _k;
p = _p;
pinMode(k, mode);
reset();
}
};
byte digitalKey::readPin()
{
if (p) return digitalRead(k);
else return !digitalRead(k);
}
class analogKey : public key
{
private:
byte k;
int value_min;
int value_max;
byte readPin();
public:
analogKey(byte _k, int _value, byte _range = 50, byte _debounceDelay = 50): key(_debounceDelay)
{
k = _k;
value_min = _value-_range;
value_max = _value+_range;
pinMode(k, INPUT);
reset();
}
};
byte analogKey::readPin()
{
int temp = analogRead(k);
if (value_min < temp && temp < value_max) return true;
else return false;
}
#endif
пример использования
#include <key.h>
digitalKey key1(2);
void setup()
{
Serial.begin(9600);
Serial.println("START");
}
void loop()
{
if(key1.readPop(0) == 1) Serial.println("TestPop");
if(key1.readPush(1000) == 1) Serial.println("TestPush");
}
Предложения ? Замечания ? Критика ?
А чем она лучше да хотя бы вот этой?
Она не лучше, не хуже, это вариант к обсуждению.
и у меня не работа с клавиатурой...
Она не лучше, не хуже, это вариант к обсуждению.
и у меня не работа с клавиатурой...
Так обсуждать-то пока нечего.
Любой проект начинается с декларирования целей - зачем это нужно.
Если нечто "не хуже и не лучше", оно, конечно, имеет право на существование в локальном проекте, но вряд ли целесообразно для использования и распространения, а также обсуждения в широких кругах, т.к. увеличивает энтропию.
В двух словах, клас опроса цифровых и аналоговых кнопок (+антидребезг) с простым интерфесом.
Есть 3 метода:
readPush(time) - событие нажатия кнопки (time = 0) или удержание кнопки в течении времени time
readPop(time) - отпускание кнопки (time = 0) или кнопк отпушена time время назад
readPin() - чтение состояние кнопки (нажата\отжата).
Простая инициализция digitalKey keyD(<PIN>) или analogKey keyA(<PIN>, <value>);
Цели: Предложения ? Замечания ? Критика ?
Цитата:Цели: Предложения ? Замечания ? Критика ?
Ответьте на фундаментальный вопрос? Зачем нужна кнопка в программе. И когда получите вменяемый ответ, то поймете и все остальное.
ПС: Если вам неймется написать библиотеку для кнопок. То напишите под rage quit
https://www.youtube.com/watch?v=Yt_iUyRxIR4
Архитектура хромает.
DetSimen, а не могли бы Вы более подробно рассказать свое мнение ?
Любой проект начинается с декларирования целей - зачем это нужно.
Если нечто "не хуже и не лучше", оно, конечно, имеет право на существование в локальном проекте, но вряд ли целесообразно для использования и распространения, а также обсуждения в широких кругах, т.к. увеличивает энтропию.
"Когда ...отсутствует цветовая дифференциация штанов, то нет цели...", а вот об энтропии там не было ни слова )))
PS но мысль интересная
Здравствуйте товарищи взываю к помощи, не могу разобраться помогите нужен пример программы подключения к аналоговому входу обычной кнопки и включение светодиода на любом другом пине. Нужно именно к аналоговому пину. Заранее огромное спасибо.
Здравствуйте товарищи взываю к помощи, не могу разобраться помогите нужен пример программы подключения к аналоговому входу обычной кнопки и включение светодиода на любом другом пине. Нужно именно к аналоговому пину. Заранее огромное спасибо.
это не поможет??? )))
Все спасибо разобрался! Видимо что то с самим контроллером, прописываю в программе А0, контроллер реагирует если подать сигнал на А2, также пишу на А1, реагирует если подать на А2, дальше все четко А2-А2, А3-А3, А4-А4, А5-А5...