PCCar.ru - Ваш автомобильный компьютер

Вернуться   PCCar.ru - Ваш автомобильный компьютер > MP3Car ТехИнфа > Разработка программ

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2016, 23:18   #1
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
Lightbulb фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие и т.д.

В ардуино понадобилось мне иметь шаблон для обработки кучи кнопок.
Начал было писать сам, но нашел на просторах код, который подстроил под себя. Может кому пригодиться.
Просто подключаете кнопки к массе и пинам ( X + n) количеством сколько хотите правите код и пользуете.

PHP код:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>

class BUTTON {
public:
//============================================================================================
// константы настроек класса.
static const byte bounce_            =   50// длительность отслеживания дребезга.
static const byte doubleclick_       =  250// длительность отслеживания двойного нажатия.
static const unsigned long timer_    5000// длительность отслеживания неактивности.
static const unsigned int retention_ 2000// длительность отслеживания нажатия и удержания.
//============================================================================================
unsigned long start// старт отсчёта времени.
boolean p;           // состояние пина кнопки.
boolean s;           // программное состояние кнопки.
boolean b;           // состояние таймера фильтра дребезга.
byte    c;           // переменная счётчика двойного нажатия.
boolean t;           // состояние таймера неактивности.
boolean r;           // состояние таймера нажатия и удержания.
//============================================================
boolean click_down;  // событие нажатия.
boolean click_up;    // событие отпускания.
boolean doubleclick// событие двойного нажатия.
boolean timer;       // событие неактивности.
boolean retention;   // событие нажатия и удержания.
//============================================================
byte _pb;
//============================================================
BUTTON(byte pb) {
_pb pb;
pinMode(_pbINPUT);
digitalWrite(_pb1);
//===================
start millis();
p     digitalRead(_pb);
// p     = !digitalRead(_pb); // отключить тихий старт.
s     p;
b     0;
c     0;
t     0;
r     0;
//==============
click_down  0;
click_up    0;
doubleclick 0;
timer       0;
retention   0;
//==============
}

void read() {
//==============================================================================
boolean np digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop millis(); // стоп отсчёта времени.
//==============================================================================
click_down  0;
click_up    0;
doubleclick 0;
timer       0;
retention   0;
//==============================================================================
if (np != p) {npclick(); start stop111;} // состояние цифрового пина изменилось.
//==============================================================================
if (!= 0          ) {if (stop start bounce_     ) {0click();      }} // фильтр дребезга.
if (!= 0          ) {if (stop start doubleclick_) {0;               }} // обнуление счётчика двойного клика.
if (!= && == 1) {if (stop start timer_      ) {0timer     1;}} // неактивность.
if (!= && == 0) {if (stop start retention_  ) {0retention 1;}} // нажатие и удержание.
//==============================================================================
}

void click() { // нажатие, отпускание, двойное нажатие.
if (== && != p) {p;
if (
== 0) {click_down 1; ++c; if (== 2) {0doubleclick 1;}}
if (
== 1) {click_up   1;                                           }
}
}

};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//конец кода для чтения состояний кнопок
//Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм

// __________ТУТ НАЗНАЧАЕМ ИМЕНА НАШИХ КНОПОК И К КАКИМ ПИНАМ ОНИ ПОДКЛЮЧЕНЫ__________
BUTTON REDbutton(52); //назначаем красной кнопке ножку 52. То есть один конец конпки подключён на пин 52 ардуины меги, а второй  конец конпки подключён на массу (GND)     Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм
BUTTON BLACKbutton (53);//назначаем красной кнопке ножку 53. То есть один конец конпки подключён на пин 52 ардуины меги, а второй  конец конпки подключён на массу (GND)    Подтяжку на +5В делать не надо,  код для чтения состояний кнопок включает внутренний подтягивающий резистор на 20кОм

 
void setup()    
 { 
        
     
pinMode(13OUTPUT);         
     
Serial.begin(9600); // ком порт
    
         
 


 
void loop() 

 { 
  
 
// Serial.println("___________________start__________________________________ ");
REDbutton.read();
 if (
REDbutton.click_down) {Serial.println("REDbutton = najata"); }             //нажатие кнопки 
 
if (REDbutton.click_up) {Serial.println("REDbutton = otpustily"); }            //отпускание кнопки
 
if (REDbutton.doubleclick) {Serial.println("REDbutton = doubleclick"); }       //двойной клик
 
if (REDbutton.timer) {Serial.println("REDbutton = neaktivnost knopki"); }      //неактивность
 
if (REDbutton.retention) {Serial.println("REDbutton = uderjanie");}            // нажатие и удержание 
 

BLACKbutton.read();
 if (
BLACKbutton.click_down) {Serial.println("BLACKbutton = click_down"); }
 if (
BLACKbutton.click_up) {Serial.println("BLACKbutton = click_up"); }
 if (
BLACKbutton.doubleclick) {Serial.println("BLACKbutton = doubleclick"); }
 if (
BLACKbutton.timer) {Serial.println("BLACKbutton = timer"); }
 if (
BLACKbutton.retention) {Serial.println("BLACKbutton = retention"); }

 
// Serial.println("___________________end______________________________ ");
  
  
  
  
  
   
     
if(REDbutton.click_down==1)//если кнопка REDbutton нажата ... (статус нажатой кнопки == 1)
           

            
digitalWrite(13,1); //включили диодик
           

      if (
REDbutton.click_up==)//если кнопка REDbutton отпущена .. (статус отпущенной кнопки == 1)
      
           

            
digitalWrite(13,0); //выключили диодик
           
}
        



oleg707 вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Часовой пояс GMT +4, время: 09:00.


Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot