Nextion Editor 버튼 길게 누르기(Long Press) 기능

Hardware|2024. 6. 5. 14:46
반응형

Nextion 디스플레이를 사용할 때 버튼을 눌러 임의의 값을 증가나 감소 시키는 수행이 필요한 경우가 있습니다. 

그런데 이 값의 변화가 얼마되지 않을때는 버튼을 몇번 클릭하면 되지만 변화가 큰 경우 클릭을 한참 해야 한다는 문제가 발생 합니다. 그런데 Nextion 에디터의 버튼에는 길게 누를때(Long Press)의 이벤트를 생성할 수가 없어서 처음에는 변화되는 수만큼 버튼을 눌러서 값을 변경하였는데 이게 값이 한없이 클때는 정말 힘 들어서 방법을 찾아서 구현을 해 보았습니다.

 

(1) 먼저 에디터에 아래와 같이 버튼 2개의 값을 표시하는 Text를 하나 올려둡니다. 

 

(2) Timer(tm0) 와 Variable(va0) 하나를 추가도 더 올립니다. 

(3) Timer의 속성중에 tim을 100 (msec)로 설정하고 en 은 0으로 설정합니다. 

(4) Timer의 Timer Event에 아래 코드를 추가 합니다. 

  if(va0.val==b0.id)
  {
    Value.val++
  }else
  {
    Value.val--
  }

(5)Up 버튼의 Touch Press Event 에 아래 코드를 추가합니다. 

   va0.val=b0.id
   tm0.en=1

(6)Up 버튼의 Touch Release Event 에 아래 코드를 추가합니다. 

  tm0.en=0

(7)Down 버튼의 Touch Press Event 에 아래 코드를 추가합니다. 

   va0.val=b1.id
   tm0.en=1

(8)Down 버튼의 Touch Release Event 에 아래 코드를 추가합니다. 

   tm0.en=0

 

이제 Uploading 후에 테스트를 해 봅니다. 

Up 버튼을 누르고 있는 동안 값이 증가가 되고 버튼을 떼면 멈추게 됩니다. 

down 버튼도 누르고 있는 동안 값이 감소되고 버튼을 떼면 멈추게 됩니다. 

 

한번씩 누르면 값이 1만큼 증가, 감소됩니다. (최소 100msec 이상은 누르고 있어야 합니다.)

 

만일 아두이노 등에서 디스플레이의 값을 읽어와야 할 경우 각 버튼의 Release 이벤트를 받으면 그때 해당값을 읽어오는 방식으로 

처리하면 됩니다. 

반응형

댓글()

아두이노 비트필드(bit field)를 이용한 버튼입력 처리

Software/Arduino|2023. 1. 17. 11:35
반응형

아두이노에 버튼이 여러개 있을 경우 각각의 버튼에 대한 입력을 체크하여 각각의 버튼에 대한 입력 처리만 하게됩니다. 

예를 들어 버튼이 3개가 있다면 3가지 경우의 입력만 처리하게 됩니다.  

 

하지만 적은 수의 버튼으로 좀더 많은 경우의 처리를 하는 방법이 있습니다. 바로 bit field 기능을 이용하면 됩니다. 

비트 필드를 구성하게 되면 두개 이상의 키가 동시에 눌리는 경우도 하나의 입력값으로 인식하여 처리 루틴을 만드는 것이 가능합니다.

만일 버튼이 3개 있다면 최대 7가지의 경우로 조합하여 입력 처리를 할 수 있습니다. 

 

#define U08  unsigned char 

union BUTTON_STATE   // 버튼입력 상태에 대한 비트필드 공용체
{
  U08 State ;
  struct
  {
    int UP_BUTTON    : 1 ;
    int DOWN_BUTTON  : 1 ;
    int LEFT_BUTTON  : 1 ;
    int RIGHT_BUTTON : 1 ;   
    int EMPTY        : 4 ;
  } ;
} ;

const int upButton    = 2;    
const int downButton  = 3;       
const int leftButton  = 4;
const int rightButton = 5;

BUTTON_STATE btn_state ;

void setup()
{
  // initialize the buttons' inputs:
  pinMode(upButton, INPUT);      
  pinMode(downButton, INPUT);      
  pinMode(leftButton, INPUT);      
  pinMode(rightButton, INPUT);     
}

U08 Read_Button()
{
   btn_state.UP_BUTTON    = digitalRead(upButton); 
   btn_state.DOWN_BUTTON  = digitalRead(downButton);
   btn_state.LEFT_BUTTON  = digitalRead(leftButton);
   btn_state.RIGHT_BUTTON = digitalRead(rightButton);

   return btn_state.State ;
}
 
void loop()
{
    U08 Key_State ;

    Key_State = Read_Button() ;

    switch(Key_State)
    {
        case 0x01 : function1() ; break ;  // UP_BUTTON
        case 0x02 : function2() ; break ;  // DOWN_BUTTON
        case 0x04 : function3() ; break ;  // LEFT_BUTTON
        case 0x08 : function4() ; break ;  // RIGHT_BUTTON
        case 0x03 : function5() ; break ;  // UP_BUTTON & DOWN_BUTTON
    }
}
반응형

댓글()