Опрос цифровых и аналоговых кнопок
- Войдите на сайт для отправки комментариев
Вс, 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...