Обработка кнопок Arduino

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 16 января 2018, 18:33

Встретился в сети код обработки действий нажатия кнопок Arduino. Для моих целей этого было более чем достаточно. Хотя и существует множество библиотек для кнопок, я решил использовать его. Вообщем то в коде всё понятно и прокомментировано.

Код: Выделить всё

#define PIN_BUTTON 2

bool     button_state      false;
bool     button_auto_state false;
uint32_t ms_button         0;
uint32_t ms_auto_click     0;

void setup()
{
   
Serial.begin(115200);
   
Serial.println("Test button ...");
   
pinMode(PIN_BUTTONINPUT_PULLUP);    
}

void loop(){
   
uint32_t ms    millis();
   
bool pin_state digitalRead(PIN_BUTTON);
// Фиксируем нажатие кнопки   
   
if( pin_state  == LOW && !button_state && ( ms ms_button ) > 50 ){
      
button_state      true;
      
button_auto_state false;  
      
ms_button         ms;
      
Serial.println("Press key");
   }
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
   
if( pin_state  == LOW && ( ms ms_button ) > 2000 && ( ms ms_auto_click )>500 ){
      
button_auto_state true;
      
ms_auto_click     ms;
      
Serial.println("Auto press key");    
   }
// Фиксируем отпускание кнопки   
   
if( pin_state == HIGH && button_state && ( ms ms_button ) > 50  ){
      
button_state      false;   
      
ms_button         ms;
      if( !
button_auto_state )Serial.println("No press key");
   }


На этой основе я наваял обработку кнопок так как мне было нужно. А именно - почти всё осталось по прежнему :grin: за исключением одного. Мне нужно было, что бы после того как мы длительно подержали кнопку, и отпустили её, срабатывал код "отпускание кнопки" Получился вот такой скетч, в который я добавил ещё одну кнопку. Возможно это коряво и не правильно, по крайне мере работает должным образом - как мне и было нужно.

Код: Выделить всё

#define PIN_BUTTON1 8   // пин кнопки 1
#define PIN_BUTTON2 12 // пин кнопки 2

bool     button_state1      = false; // статус кнопки 1
bool     button_state2      = false; // статус кнопки 2
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;

void setup()
{
   Serial.begin(9600);
   Serial.println("Test button ...");
   pinMode(PIN_BUTTON1, INPUT_PULLUP);  
   pinMode
(PIN_BUTTON2, INPUT_PULLUP);  
}

void loop(){
  uint32_t ms    = millis();
  bool pin_state1 = digitalRead(PIN_BUTTON1); // 1 кнопка
  bool pin_state2 = digitalRead(PIN_BUTTON2); // 2 кнопка
  
// Фиксируем нажатие кнопки   
  if( pin_state1  == LOW && !button_state1 && ( ms - ms_button ) > 50 ){
    button_state1      = true;
    ms_button         = ms;
    Serial.println("Press key"); //короткое нажатие
   }
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
   if( pin_state1  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
      ms_auto_click     = ms;
      Serial.println("Auto press key");   //длительное нажатие
   }
// Фиксируем отпускание кнопки   
   if( pin_state1 == HIGH && button_state1 && ( ms - ms_button ) > 50  ){
      button_state1      = false;   
      ms_button         
= ms;
      Serial.println("No Press"); //действие после отпуска длительного нажатия
   }

// Фиксируем нажатие кнопки   
   if( pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 ){
      button_state2      = true;
      ms_button         = ms;
      Serial.println("Press key 2"); //короткое нажатие
   }
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
   if( pin_state2  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
      ms_auto_click     = ms;
      Serial.println("Auto press key 2");   //длительное нажатие
   }
// Фиксируем отпускание кнопки   
   if( pin_state2 == HIGH && button_state2 && ( ms - ms_button ) > 50  ){
      button_state2      = false;   
      ms_button         
= ms;
      Serial.println("No Press 2"); //действие после отпуска длительного нажатия
   }
}
[center]i love you [s]mxIni[/s] Mysql[/center]


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#2 Дим » 28 января 2018, 19:51

При разработке часов потребовалось что бы при удержании кнопки 1 (длительное нажатие) код выполнялся циклично, пока не отпустим кнопку. А при удержании кнопки 2, код выполнялся один раз. Для этого немного отредактируем вышеприведённый код.
Итог этого:

Код: Выделить всё

#define PIN_BUTTON1 8   // пин кнопки 1
#define PIN_BUTTON2 12 // пин кнопки 2

bool     button_state1      = false; // статус кнопки 1
bool     button_state2      = false; // статус кнопки 2
bool     button_long_state  = false; // удержание кнопки (код выполнится один раз)
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;

void setup()
{
   Serial.begin(9600);
   Serial.println("Test button ...");
   pinMode(PIN_BUTTON1, INPUT_PULLUP);  
   pinMode
(PIN_BUTTON2, INPUT_PULLUP);  
}

void loop(){
  uint32_t ms    = millis();
  bool pin_state1 = digitalRead(PIN_BUTTON1); // 1 кнопка
  bool pin_state2 = digitalRead(PIN_BUTTON2); // 2 кнопка

// ===================== копка 1 ================
  
// Фиксируем нажатие кнопки   
  if( pin_state1  == LOW && !button_state1 && ( ms - ms_button ) > 50 ){
    button_state1      = true;
    ms_button         = ms;
    Serial.println("Press key"); //короткое нажатие
   }
// После 2000 мс нажатия кнопки каждые 500 мс фиксируем событие нажатия  
   if( pin_state1  == LOW && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
      ms_auto_click     = ms;
      Serial.println("Auto press key");   //длительное нажатие
   }
// Фиксируем отпускание кнопки   
   if( pin_state1 == HIGH && button_state1 && ( ms - ms_button ) > 50  ){
      button_state1      = false;   
      ms_button         
= ms;
      Serial.println("No Press"); //действие после отпуска длительного нажатия
   }

// ===================== копка 2 ================

// Фиксируем нажатие кнопки   
   if( pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 ){
      button_state2      = true;
      button_long_state = false;
      ms_button         = ms;
      Serial.println("Press key 2"); //короткое нажатие
   }

// После 2000 мс нажатия кнопки единоразово выполним код
   if( pin_state2  == LOW && !button_long_state && ( ms - ms_button ) > 2000 ){
      button_long_state = true;
      Serial.println("Long press key 2");    
   
}

// Фиксируем отпускание кнопки   
   if( pin_state2 == HIGH && button_state2 && ( ms - ms_button ) > 50  ){
      button_state2      = false;   
      ms_button         
= ms;
      Serial.println("No Press 2"); //действие после отпуска длительного нажатия
   }
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 2 гостя
Боты: Yandex [Bot]