В этой теме нужно задавать конкретные вопросы ПО КНОПКАМ. Всё остальное: светодиоды, дисплеи, моторчики и т.д. - создавайте отдельную тему и там спрашивайте. Не нужно засирать тему про кнопки всем подряд.
P.S. mag155, у Вас не с кнопками проблема, а с базовыми знаниями по программированию. Начните с раздела "Программирование" в верху сайта. Посмотрите видеоуроки Джереми Блюма, почитайте его книжку. Потом приходите с вопросами.
Да. Ты единственный среди нас, как сказали, кто очень добрый, чуткий и отзывчивый к новичкам. Я аш всплакнул. Жалка будет, када тебя опять на 10 суток за хулиганство закроют.
Да. Ты единственный среди нас, как сказали, кто очень добрый, чуткий и отзывчивый к новичкам. Я аш всплакнул. Жалка будет, када тебя опять на 10 суток за хулиганство закроют.
да, ладно - нафик я вам такой буду нужен. причинно-следственные связи нужно правильно воспринимать.
нажимаю на кнопку реле срабатывает , отжимаю реле выключается.
а нужно при нажатие что бы включалось , при повторном нажатие выключалось
Вот Вам для одной кнопки. Остальные я думаю сделаете по аналогии
#define BUTTON1_PIN 2
#define RELAY1_PIN 3
boolean blStatus1 = false; //логический флаг предыдущего состояния реле включено/выключено. По умолчанию при старте программы выключено
bool temp_kn1;
void setup() {
// инициализируем подключения
pinMode(BUTTON1_PIN, INPUT); //задаем пин 2 как вход кнопки
pinMode(RELAY1_PIN, OUTPUT); //задаем пин 3 как выход на реле
}
void loop() {
// основная программа. Разовое нажатие на кнопку будет включать или отключать реле без удержания кнопки
if (digitalRead(BUTTON1_PIN) == HIGH && !temp_kn1) { //проверяем, нажата ли кнопка (если на 2-м пине есть сигнал)
temp_kn1 = 1;
blStatus1 = !blStatus1; //меняем логический флаг на противоположный от установленного предыдущим нажатием
digitalWrite(RELAY1_PIN, blStatus1); //меняем состояние выхода соответственно логическому флагу
delay (50);
}
else if (digitalRead(BUTTON1_PIN) == 0 && temp_kn1)temp_kn1 = 0;
// Serial.println(blStatus); //выводим состояние реле в серийный порт
}
#define BUTTON2_PIN 2
#define RELAY2_PIN 3
boolean blStatus2 = true; //логический флаг предыдущего состояния реле включено/выключено. По умолчанию при старте программы выключено
void setup() {
// инициализируем подключения
pinMode(BUTTON2_PIN, INPUT); //задаем пин 2 как вход кнопки
pinMode(RELAY2_PIN, OUTPUT); //задаем пин 3 как выход на реле
}
void loop() {
if (digitalRead(BUTTON2_PIN)==HIGH){ //если кнопка нажата
blStatus2 = !blStatus2; // инвертируем значение
digitalWrite(RELAY2_PIN, blStatus2); // пишем инвертированное значение в порт
delay (5000);
}
}
вот , дотрагиваюсь до кнопки реле включается , работает 5 сек и выключается , при этом сенсор приходитсья 0,2 сек подержать
АХТУНГ, прошу всех подписанных и заинтересованных в теме принять участие в опросе и высказать свое мнение по предложениям. Неофитам, не улавливающим разницы между работой с кнопкой и включением реле, просьба не утруждаться.
а почему не рассматривается вариант защиты на RS-тиггере? 1 корпус ла3 или тм2 - и 2 кнопки без дребезга. добавим типа ла2 и можем использовать вход преывания.
то можно легко аппаратно решить вопрос с дребезгом, причём абсолютно, раз и навсегда.
Подключаем кнопку по такой схеме
И всё, забудьте о дребезге навсегда. Если кнопка (SW) не нажата (как на схеме), то на пин подаётся LOW, Если нажата - то HIGH.
Если нужно наоборот (поменять HIGH и LOW местами), то заводим на пин не из этой точки, а из симметричной ей слева (с соединения R1, R2 и коллектора Q1).
Резисторы почти любые от 1k/10k до 1М/10М. Если будете делать высокоомное решение, то старайтесь делать дорожки как можно короче. У меня 1М/10М работало даже не макетке. Больше - не пробовал. Если же наоборот, будете делать низкоомное решение, типа 1k/10k, то можно смело выбросить из схемы конденсаторы (хотя, они там по-любому никому не мешают).
Транзисторы тоже практически любые NPN, даже не обязательно шибко одинаковые - в общем, "что в столе валяется".
В принципе, в природе существуют микросхемы, которые это реализуют (обычно на 4 или 2 кнопки), но для одной кнопки такое решение компактнее (если микросхема в DIP). Да и такое решение как-то "теплее и ламповее" - сразу видно, что и как работает.
примерно такая схемка
количество можно увеличить до 8 (ла3 можно заменить на тм2, ла2 можно заменить на любую с нужным числом входов)
по прерывания ситывается и определяется нажатая кнопка
используя ив1 можно сэкономить входы ардуинки и считывать код нажатой кнопки
примерно такая схемка
количество можно увеличить до 8 (ла3 можно заменить на тм2, ла2 можно заменить на любую с нужным числом входов)
Использование советской дискретной логики - это такой челлендж или просто сундук старого радиогубителя вскрыли? PCF8574 8 выходов имеет, есть свой INT выход и некий антидребезг даже. Да и навесить их можно пачкой на одну шину.
byte key(byte Sb){
static unsigned long start_press=0,pressTime=0;
static boolean pressFlag=0;
static byte num=0,_num=0,button=0;
button=!digitalRead(Sb);//читаем состояние кнопки
if(!button){num=0;}//если кнопка отпущена, выдаем результат 0
if(button&&!pressFlag)//если кнопка нажата и флаг опущен
{pressTime=millis()-start_press;//считаем время нажатия кнопки
if(millis()-start_press>=1500){//если нажатие больше 1,5 сек
pressFlag=1;//поднимаем флаг
num=2;//значение кнопки 2
pressTime=0;//сбрасываем длительность нажатия
}
}
if(!button){//если кнопка отпущена
start_press=millis();//постоянно, при отжатой кнопке, приравниваем начала отсчёта старта нажатия к миллис
pressFlag=0;//опускаем флаг
}
if(!button&&!pressFlag){//если кнопка и флаг отпущены
if(pressTime>50&&pressTime<1500)//а время нажатия больше 50мс, но меньше 2сек
{pressTime=0;//сбрасываем длительность нажатия
num=1;}//значение кнопки 1
}
_num=num;
num=0;
return _num;//возвращаем значение кнопки
}
Вот мой вариант обработчика длинного/короткого нажатия кнопки. Выполнен в виде функции. Работает по факту, то есть одно нажатие один сигнал.
Замечания и критику готов выслушать.
//При одиночном вызове в цикле:
if(key()==1){//что то делаем если короткое нажатие;
}
//Или
if(key()==2){//что то делаем при длинном нажатии;
}
//Обусловлено сбросом флага после каждого опроса
//Если требуется проверить оба сигнала, делаем так:
int myKey=key();
if(key()==1){//что то делаем, если короткое нажатие;
}
if(key()==2){//что то делаем, если длинное нажатие;
}
Или так:
switch (key()){
case 1: //что то делаем по короткому нажатию
break;
case 2://что то делаем по длинному нажатию
}
Можно и так, но тогда менее понятно, как работает код.
Изначально было несколько по другому, а этот участок кода остался без изменений.
Писал с перерывами на пару месяцев, в течении года, по мере надобности.
И только сегодня дошло как сбрасывать флаги внутри функции,до этого переменные были глобальные и сбрасывались в основном цикле, поэтому наверное и выложил.
Двойное нажатие не реализовывал, так как пока нигде не использовал, но добавляется введением ещё двух переменных.
Отсрочкой вывода одинарного и изменением значения, если во время отсрочки было ещё одно короткое.
В целом , думаю 10 байт(10 потому что одна переменная(button) для облегчения записи, можно убрать), на кнопку для такого , дилетанта, как я , вполне нормальный результат.
Код вполне рабочий , использую без малого год, нареканий нет
class btn//создадим класс кнопок
{public://общие функции
int key(int pin);
private://личные переменные и функции класса
unsigned long start_press=0;//переменная времени нажатия кнопки
unsigned long pressTime=0;//переменная длительности нажатия кнопки
boolean pressFlag=0;//переменная флага нажатия
//переменные состояния/временного состояния/нажатия кнопки
byte num=0,_num=0,button=0;
};
//Объекты кнопок создаём так
btn Btn1;
//Вызываем так:
int MyKey=key(int pin);
//Далее в коде используиспользуем переменную MyKey как состояние кнопки.
//Состояние кнопки действительно один цикл программы
//функция класса Btn(обработчик кнопок)
int btn::key(int Sb){
button=!digitalRead(Sb);//читаем состояние кнопки
if(!button){num=0;}//если кнопка отпущена, выдаем результат 0
if(button&&!pressFlag)//если кнопка нажата и флаг опущен
{pressTime=millis()-start_press;//считаем время нажатия кнопки
if(millis()-start_press>=2000){//если нажатие больше 2 сек
pressFlag=1;//поднимаем флаг
num=2;//значение кнопки 2
pressTime=0;//сбрасываем длительность нажатия
}
}
if(!button){//если кнопка отпущена
start_press=millis();//сбрасываем время нажатия
pressFlag=0;//опускаем флаг
}
if(!button&&!pressFlag){//если кнопка и флаг отпущены
if(pressTime>50&&pressTime<2000)//а время нажатия больше 50мс, но меньше 2сек
{pressTime=0;//сбрасываем длительность нажатия
num=1;}//значение кнопки 1
}
_num=num;
num=0;
return _num;//возвращаем значение кнопки
}
enum BtnState{
RELEASE,
SHORT,
DOUBLE,
LONG};
class btn//создадим класс кнопок
{public://общие функции
int key(int pin);
private://личные переменные и функции класса
uint32_t start_press=0;//переменная времени нажатия кнопки
uint32_t pressTime=0;//переменная длительности нажатия кнопки
uint32_t double_press;//переменная времени между нажатиями
boolean pressFlag=0;//переменная флага нажатия
int16_t press_one;//переменная количества нажатий
//переменные состояния/временного состояния/нажатия кнопки
byte num=0,_num=0,button=0;
};
//функция класса Btn(обработчик кнопок)
int btn::key(int Sb){
button=!digitalRead(Sb);//читаем состояние кнопки
if(!button){num=0;}//если кнопка отпущена, выдаем результат 0
if(button&&!pressFlag)//если кнопка нажата и флаг опущен
{pressTime=millis()-start_press;//считаем время нажатия кнопки
if(pressTime>=1500){//если длительность нажатия больше 1,5 сек
pressFlag=1;//поднимаем флаг
num=LONG;//значение кнопки long
pressTime=0;//сбрасываем длительность нажатия
}
}
if(!button){//если кнопка отпущена
start_press=millis();//сбрасываем время нажатия
pressFlag=0;//опускаем флаг
}
if(!button&&!pressFlag){//если кнопка и флаг отпущены
if(pressTime>50&&pressTime<1500)//а время нажатия больше 50мс, но меньше 1,5сек
{press_one++;//увеличиваем счетчик количества нажатий
if(press_one>2)press_one=2;//ограничиваем значение счетчика
pressTime=0;//сбрасываем длительность нажатия
double_press=millis();//запускаем таймер ожидания следующего нажатия
}
}
if(press_one){//если было короткое нажатие
if(millis()-double_press>=300){//ждем 0,3сек
pressTime=0;//сбрасываем длительность нажатия
num=press_one;//значение кнопки приравниваем к количеству нажатий
press_one=0;//сбрасываем количество нажатий
}
}
_num=num;//для одиночного вывода результата, используем временную переменную
num=0;//обнудяем основную переменную значения кнопки
return _num;//возвращаем значение кнопки
}
btn Btn1;//создадим обьекты кнопок
void setup(){
Serial.begin(9600);
pinMode(3,0x2);
}
void loop(){
int myBtn=Btn1.key(3);
switch (myBtn){
case RELEASE :
break;
case SHORT: Serial.println("short press");break;
case DOUBLE: Serial.println("double press");break;
case LONG :Serial.println("long press");
}
}
Гладко было на бумаге в протеусе, да забыли про овраги приколы . А по ним ходить на нем работать.
Там матрица не просто матрица, матрица с приоритетами однако, можно нажимать по две кнопки, верхняя будет в приоритете и, показания с кнопки не убегают )))
Я даже клавиатурку достал из загашника, хочется в железе посмотреть, плёночная с алиэкспресса
Я даже клавиатурку достал из загашника, хочется в железе посмотреть, плёночная с алиэкспресса
Не в этом дело! Вы живьем обычную клавиатуру видели. Присматривались внимательно. Вот когда осмотрите, скажите что есть и чего нет в той матрице.
давненько это было и только настоящие клавиатуры, там строки да столбцы...
надеялся в этой аналогично...
Пока суть да дело дописал пару строк, чтобы все кнопки стали тактовые )))
bwn да я в курсе сейчас для ua6em выложу код, потом чиканешь. Ну нафига городить такой паровоз под аналоговые кнопки . Вот под LCD Key Shield и никагого гемороя. посто масштабируется и все
/*LCD Key Shield*/
//Cl_analog.h--------------------------------
typedef void (*pDo)() ;// тип -функция обработчик
class Cl_analog {
const byte pin;
int data_next, data, data_old;
bool bounce = 0; // антидребезговый флаг
uint32_t past = 0 ;
public:
pDo Do_Right , Do_Up, Do_Down, Do_Left , Do_Select;
Cl_analog()=delete;
Cl_analog(byte _pin);
/**/
void init();
void run();
};
//Cl_analog.cpp--------------------------------
Cl_analog::Cl_analog(byte _pin): pin(_pin) {}
void Cl_analog::init() {
data = analogRead (pin);
Do_Right = Do_Up = Do_Down = Do_Left = Do_Select = [] {};
}
void Cl_analog::run() {
data_next = analogRead (pin);
if (! bounce && data != data_next) { // если прошел фронт изм на выводн
bounce = 1; // выставить флаг
past = millis(); // сделать временую засветку
}
else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время
bounce = 0; // то снять флаг
data_old = data ;
data = data_next ;
if (data_old > 1000) {
Serial.println(data);
if (data < 110) Do_Right();
else if (data < 200) Do_Up();
else if (data < 400) Do_Down();
else if (data < 600) Do_Left();
else if (data < 800) Do_Select() ;
}
}
}
Cl_analog Keys(/*пин*/A0);
//---------------Компоновка----------------------------------------------
#include <LiquidCrystal.h>
LiquidCrystal lcd(/*RS*/8,/*Enable*/9,/*DB4*/4,/*DB5*/5,/*DB6*/6,/*DB7*/7);
void lcd_init() {
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("LCD Key Shield");
lcd.setCursor(0, 1);
lcd.print("Press Key:None ");
}
//----------------------------------------
void setup() {
Serial.begin(9600);
lcd_init();
Keys.init();
Keys.Do_Right = [] {
lcd.setCursor(10, 1);
lcd.print ("Right ");
};
Keys.Do_Up = [] {
lcd.setCursor(10, 1);
lcd.print ("Up ");
};
Keys.Do_Down = [] {
lcd.setCursor(10, 1);
lcd.print ("Down ");
};
Keys.Do_Left = [] {
lcd.setCursor(10, 1);
lcd.print ("Left ");
};
Keys.Do_Select = [] {
lcd.setCursor(10, 1);
lcd.print ("Select");
};
}
void loop() {
Keys.run();
}
Предложенное аппаратное решение (матрица) интересно тем, что реализуется защита от одновременного нажатия нескольких кнопок, да, теоретически там может быть 4096 состояний, но на выходе имеем практически всего 12 опорных сигналов для детектирования их посредством АЦП, в твоем коде защита реализуется за счёт очень большого окна, в приведённом аппаратном решении - красиво )))
ВСЕМ НЕОФИТАМ, ЖАЖДУЩИМ ЗАДАТЬ ВОПРОС!
ДАННАЯ ТЕМА НЕ ПРЕДНАЗНАЧЕНА ДЛЯ ОБУЧЕНИЯ ВАС ОСНОВАМ ЯЗЫКА И ПРИЕМАМ СОВОКУПЛЕНИЯ ДВУХ И БОЛЕЕ СКЕТЧЕЙ. В ТЕМЕ РАССМАТРИВАЮТСЯ СПОСОБЫ ПОДКЛЮЧЕНИЯ КНОПОК, ПОДАВЛЕНИЕ ДРЕБЕЗГА, ФИКСАЦИЯ СОБЫТИЙ.
ВСЕ ВЫХОДЯЩЕЕ ЗА ОЗНАЧЕННЫЕ РАМКИ К РАБОТЕ С КНОПКАМИ НЕ ОТНОСИТСЯ И ОБСУЖДАЕТСЯ ВО ВНОВЬ СОЗДАННЫХ ИЛИ ПОДХОДЯЩИХ ТЕМАХ.
ОТВЕТЫ НА ОСНОВНЫЕ ВОПРОСЫ, ПО КНОПКАМ, МОЖНО НАЙТИ НА ПЕРВЫХ ПЯТИ СТРАНИЦАХ ТЕМЫ, УЧИТЕСЬ ЧИТАТЬ.
выводит счет.Как убрать ноль в таймере и выход сигнала с ардуины (А0)
выводит счет.Как убрать ноль в таймере и выход сигнала с ардуины (А0)
За то,что помогаете величина благодарности - бесконечная!Дошло.Вроде все работает как надо,завтра попробую подцепить к щиту.Огромное Спасибо!
Ну разумеется во внутрь функции обработчика.DoTimeBack() Для этого я и писал
/*здесь отправляем сообщение про проникновение*/
ВСЕМ НОВИЧКАМ
В этой теме нужно задавать конкретные вопросы ПО КНОПКАМ. Всё остальное: светодиоды, дисплеи, моторчики и т.д. - создавайте отдельную тему и там спрашивайте. Не нужно засирать тему про кнопки всем подряд.
P.S. mag155, у Вас не с кнопками проблема, а с базовыми знаниями по программированию. Начните с раздела "Программирование" в верху сайта. Посмотрите видеоуроки Джереми Блюма, почитайте его книжку. Потом приходите с вопросами.
Клапа, не нагнетай.
Клапа, не нагнетай.
с чего бы это?
Клапа, не нагнетай.
с чего бы это?
Опять торпедируют, а ты нам нужен.
Да. Ты единственный среди нас, как сказали, кто очень добрый, чуткий и отзывчивый к новичкам. Я аш всплакнул. Жалка будет, када тебя опять на 10 суток за хулиганство закроют.
Опять торпедируют, а ты нам нужен.
Да. Ты единственный среди нас, как сказали, кто очень добрый, чуткий и отзывчивый к новичкам. Я аш всплакнул. Жалка будет, када тебя опять на 10 суток за хулиганство закроют.
да, ладно - нафик я вам такой буду нужен. причинно-следственные связи нужно правильно воспринимать.
я не адманываю
http://arduino.ru/forum/proekty/knopka-startstop-dvigatelya-v-avtomobile...
А что насчет сенсорной кнопки TTP223b я хочу написать скетч на 4 кнопки что бы работали как выключатели помогите плиз , где ошибка?
нажимаю на кнопку реле срабатывает , отжимаю реле выключается.
а нужно при нажатие что бы включалось , при повторном нажатие выключалось
нажимаю на кнопку реле срабатывает , отжимаю реле выключается.
а нужно при нажатие что бы включалось , при повторном нажатие выключалось
Вот Вам для одной кнопки. Остальные я думаю сделаете по аналогии
вот , дотрагиваюсь до кнопки реле включается , работает 5 сек и выключается , при этом сенсор приходитсья 0,2 сек подержать
А если просто повисеть на форуме. То читайте форум.
АХТУНГ, прошу всех подписанных и заинтересованных в теме принять участие в опросе и высказать свое мнение по предложениям. Неофитам, не улавливающим разницы между работой с кнопкой и включением реле, просьба не утруждаться.
чуть поправлю код квона - и
мигать не будет. По крайней мере 2 месяца :)
qwone спасибо за код,но чего-то не то.У меня с кнопки HIGH, подтяжка к GND 10K
b707 переделал к вы написали.Как переделать с подтяжкой к земле ,на кнопке +5в.Сейчас получается ,что ЛЕД загорается только при загрузке скетча
Кнопка подключена к питанию. Светодиод горит еще 2 сек как кнопку отпустили
Дело в том,что кнопка на удержании,а ЛЕД должен загореться на 2 сек и погаснут при нажатой кнопке.
Не проверял работу
qwone.Огромное спасибо разобрался,два дня сидел с примерами ничего не получалось.Спасибо опять меня выручили.
Из меня очень паршивый учитель-популизатор Так что изчайте как сможете http://arduino.ru/forum/programmirovanie/pomogite-novichku-ochen-prostoi-proekt-muchayus-3-dnya#comment-325365
Или моя тема http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
а почему не рассматривается вариант защиты на RS-тиггере? 1 корпус ла3 или тм2 - и 2 кнопки без дребезга. добавим типа ла2 и можем использовать вход преывания.
Всем привет! Я сделал небольшое видео как решить проблему дребезга кнопок: https://www.youtube.com/watch?v=4KXKQCDh4X4
Если в наличие есть не простая тактовая кнопка (SPST), а кнопка с полной группой контактов (SPDT), например
то можно легко аппаратно решить вопрос с дребезгом, причём абсолютно, раз и навсегда.
Подключаем кнопку по такой схеме
И всё, забудьте о дребезге навсегда. Если кнопка (SW) не нажата (как на схеме), то на пин подаётся LOW, Если нажата - то HIGH.
Если нужно наоборот (поменять HIGH и LOW местами), то заводим на пин не из этой точки, а из симметричной ей слева (с соединения R1, R2 и коллектора Q1).
Резисторы почти любые от 1k/10k до 1М/10М. Если будете делать высокоомное решение, то старайтесь делать дорожки как можно короче. У меня 1М/10М работало даже не макетке. Больше - не пробовал. Если же наоборот, будете делать низкоомное решение, типа 1k/10k, то можно смело выбросить из схемы конденсаторы (хотя, они там по-любому никому не мешают).
Транзисторы тоже практически любые NPN, даже не обязательно шибко одинаковые - в общем, "что в столе валяется".
В принципе, в природе существуют микросхемы, которые это реализуют (обычно на 4 или 2 кнопки), но для одной кнопки такое решение компактнее (если микросхема в DIP). Да и такое решение как-то "теплее и ламповее" - сразу видно, что и как работает.
За идею спасибо dimax!
а почему не рассматривается вариант защиты на RS-тиггере?
Потому, что ты не написал про неё.
Теперь вот, как видишь, рассматривается.
Не понял, а где тёплость и ламповость?
Учитесь, блин! На любимой хифилитиками всего мира 12AX7
Как видите, работает!!!
(НА ВСЯКИЙ СЛУЧАЙ: схема является шуткой, в протеусе работает, но повторять не рекоммендуется!)
примерно такая схемка
количество можно увеличить до 8 (ла3 можно заменить на тм2, ла2 можно заменить на любую с нужным числом входов)
по прерывания ситывается и определяется нажатая кнопка
используя ив1 можно сэкономить входы ардуинки и считывать код нажатой кнопки
примерно такая схемка
количество можно увеличить до 8 (ла3 можно заменить на тм2, ла2 можно заменить на любую с нужным числом входов)
Использование советской дискретной логики - это такой челлендж или просто сундук старого радиогубителя вскрыли? PCF8574 8 выходов имеет, есть свой INT выход и некий антидребезг даже. Да и навесить их можно пачкой на одну шину.
Вот мой вариант обработчика длинного/короткого нажатия кнопки. Выполнен в виде функции. Работает по факту, то есть одно нажатие один сигнал.
Замечания и критику готов выслушать.
Особо не разбирался, но вот это место смутило.
Почему в строке 10 не использовать только что вычисленную переменную pressTime? Зачем дважды вычислять одно и тоже?
Можно и так, но тогда менее понятно, как работает код.
Изначально было несколько по другому, а этот участок кода остался без изменений.
Писал с перерывами на пару месяцев, в течении года, по мере надобности.
И только сегодня дошло как сбрасывать флаги внутри функции,до этого переменные были глобальные и сбрасывались в основном цикле, поэтому наверное и выложил.
Двойное нажатие не реализовывал, так как пока нигде не использовал, но добавляется введением ещё двух переменных.
Отсрочкой вывода одинарного и изменением значения, если во время отсрочки было ещё одно короткое.
В целом , думаю 10 байт(10 потому что одна переменная(button) для облегчения записи, можно убрать), на кнопку для такого , дилетанта, как я , вполне нормальный результат.
Код вполне рабочий , использую без малого год, нареканий нет
Ну, за год можно было бы и подшаманить. Мой вариант.
Выделил кнопки в отдельный класс
Прикрутил к своему обработчику двойное нажатие.
Это всё цифра, представляет интерес обработчик аналоговых кнопок, особенно если подключаем матричную клавиатуру )))
И набросок к ней )))
Гладко было
на бумагев протеусе, да забыли прооврагиприколы . Апо ним ходитьна нем работать.Там матрица не просто матрица, матрица с приоритетами однако, можно нажимать по две кнопки, верхняя будет в приоритете и, показания с кнопки не убегают )))
Я даже клавиатурку достал из загашника, хочется в железе посмотреть, плёночная с алиэкспресса
давненько это было и только настоящие клавиатуры, там строки да столбцы...
надеялся в этой аналогично...
Пока суть да дело дописал пару строк, чтобы все кнопки стали тактовые )))
bwn да я в курсе сейчас для ua6em выложу код, потом чиканешь. Ну нафига городить такой паровоз под аналоговые кнопки . Вот под LCD Key Shield и никагого гемороя. посто масштабируется и все
Предложенное аппаратное решение (матрица) интересно тем, что реализуется защита от одновременного нажатия нескольких кнопок, да, теоретически там может быть 4096 состояний, но на выходе имеем практически всего 12 опорных сигналов для детектирования их посредством АЦП, в твоем коде защита реализуется за счёт очень большого окна, в приведённом аппаратном решении - красиво )))
PS аппаратное решение нагуглил, понравилось ;-)
один аналоговый выход. 250р
https://aliexpress.ru/item/32635207928.html
один аналоговый выход. 250р
https://aliexpress.ru/item/32635207928.html
Отличные кнопки, а если использовать библиотеку Павла, то теоретически можно подключить 21 кнопку )))
ВСЕМ НЕОФИТАМ, ЖАЖДУЩИМ ЗАДАТЬ ВОПРОС!
ДАННАЯ ТЕМА НЕ ПРЕДНАЗНАЧЕНА ДЛЯ ОБУЧЕНИЯ ВАС ОСНОВАМ ЯЗЫКА И ПРИЕМАМ СОВОКУПЛЕНИЯ ДВУХ И БОЛЕЕ СКЕТЧЕЙ. В ТЕМЕ РАССМАТРИВАЮТСЯ СПОСОБЫ ПОДКЛЮЧЕНИЯ КНОПОК, ПОДАВЛЕНИЕ ДРЕБЕЗГА, ФИКСАЦИЯ СОБЫТИЙ.
ВСЕ ВЫХОДЯЩЕЕ ЗА ОЗНАЧЕННЫЕ РАМКИ К РАБОТЕ С КНОПКАМИ НЕ ОТНОСИТСЯ И ОБСУЖДАЕТСЯ ВО ВНОВЬ СОЗДАННЫХ ИЛИ ПОДХОДЯЩИХ ТЕМАХ.
ОТВЕТЫ НА ОСНОВНЫЕ ВОПРОСЫ, ПО КНОПКАМ, МОЖНО НАЙТИ НА ПЕРВЫХ ПЯТИ СТРАНИЦАХ ТЕМЫ, УЧИТЕСЬ ЧИТАТЬ.
Можете так же ознакомится с "Сагой окнопках".
Для желающих "быстрого" результата "Титановый велосипед".
Если кто то желает добавить свои способы, варианты, описание библиотек, вэлком.
Обзор от Dimax по аппаратному подавлению дребезга.
ЕЩЕ РАЗ ВОПРОШАЮЩИМ: ВСЕ БАНАЛЬНЫЕ ВОПРОСЫ УДАЛЯЮТСЯ БЕЗ ОБСУЖДЕНИЯ.
P/S если кто то считает, что его права нарушены, вэлком в пост.
P/P/S ЕЩЕ РАЗ, КТО ЖЕЛАЕТ ЗАЩИТИТЬ СВОИ ПРАВА И СВОБОДЫ, ССЫЛКА В ПОСТЕ. ТАМ КРОМЕ ХАМСТВА И ПОЛИТОТЫ НИЧЕГО НЕ УБИРАЮ.
Модератор: Крайнее предупреждение.
Хотим задать вопрос - создаем тему в "Песочнице", задаем свои вопросы.
Почему? Смотрим пост выше.