산구루|국토종주 자전거길 가이드
  • 홈
  • 종주 공통
    • 자전거길 종주 인증에 대하여
    • 국토종주 거리 계산기
    • 자전거길 종주 데이터
    • 인사 말씀
    • 처음 오신 분
    • 블로그 이용법
    • 닫기
  • 국토종주
    • 한강 구간
      • 아라
      • 한강(서울)
      • 남한강
    • 새재
    • 낙동강 구간
      • 낙동강 중류
      • 낙동강 하류
    • 닫기
  • 4대강종주
    • 한강종주
      • 한강(서울)
      • 남한강종주
    • 낙동강종주
      • 낙동강 상류(안동)
      • 낙동강 중류
      • 낙동강 하류
    • 금강종주
    • 영산강종주
    • 닫기
  • 나머지 종주
    • 동해안종주
    • 제주환상종주
    • 섬진강종주
    • 북한강종주
    • 오천종주
    • 닫기
  • 지리산
    • 지리산둘레길3(인월-금계)
    • 지리산둘레길11(하동호-삼화실)
    • 닫기
  • 로그인
  • 내정보
    • 등록(블로그 가입)
    • 프로필 보기/수정
    • 비밀번호 찾기
    • 닫기
  • 검색
    • 닫기

[아두이노006] 아두이노 버튼 사용법

2018년 1월 18일 | {산구루}작성 | Leave a Comment |

이글은 2018.1.18에 있었던 오프라인 강의 노트입니다.

아두이노 다기능 쉴드에 대하여 아두이노 다기능 쉴드에 대하여

아두이노 다기능 쉴드는 4자리 7세그먼트 튜브, 세 개의 버튼, 4 개의 LED, 액티브 부저, 포텐시오미터와 연결 단자를 가지고 있습니다.

다기능쉴드

▲모두 닫기  |  {끝:아두이노 다기능 쉴드에 대하여}
PULL_UP 저항에 대하여 PULL_UP 저항에 대하여
스위치를 연결할 때 핀과 5V 사이에 10K 정도의 저항을 연결하는 경우가 많습니다.

풀업저항

이처럼 핀에 5V를 연결하여 풀업하면 스위치가 접속되지 않을 때(=open될 때) 핀에는 전압이 HIGH(5V)가 걸리게 됩니다. 반대로 스위치가 접속되면(=close될 때) LOW(0V)가 걸리게 됩니다.

풀업하지 않으면 스위치가 접속이 되지 않을 때 핀에 0V가 나타나는 것이 아니라 전압이 불안정하게 플로팅(floating)하기 때문입니다.

별도로 풀업 저항 회로를 구성하지 않고 핀과 GND(0V) 사이에 스위치를 연결하기만 하고 pinMode 선언시에 INPUT_PULLUP을 지정하기만 하면 풀업 저항 모드가 됩니다. 왜냐하면 아두이노의 프로세서에는 풀업저항이 내장되어 있으므로 선언만 하면 깨워서 사용할 수 있기 때문입니다.

1
pinMode(buttonPin,INPUT_PULLUP);

다른 방식으로 핀과 5V 사이에 스위치를 연결하고 핀과 GND 사이에는 10K 정도의 풀다운(pull down) 저항을 달아 둘 수도 있습니다. 이때는 스위치 접속시 핀에 HIGH(5V)가 걸리게 됩니다. 실제로는 풀업저항 방식이 선호됩니다.

▲모두 닫기  |  {끝:PULL_UP 저항에 대하여}
버튼 테스트용 스케치 버튼 테스트용 스케치
버튼을 누를 때 상태를 알려주는 스케치입니다. Timer1의 ISR에서 주기적으로 버튼의 변화를 갱신해줍니다.

메쏘드
기능
getButton()버튼의 상태를 알려 줍니다.
setRepeat(false/true)계속 누를 때 반복 상태를 알려줄지를 지정합니다. 초기값은 false.
setLongPress(false/true)길게 누를 때 상태를 알려줄지를 지정합니다. 초기값은 false.
setRepeat()와 setLongPress()는 한 쪽이 true로 지정되면 다른 한 쪽은 false로 지정됩니다.

버튼 상태 값은 다음과 같습니다.

1
2
3
4
5
6
7
#define BUTTON_NONE 0
#define ON_RELEASED 1
#define ON_PRESSED 2
#define RELEASED 4
#define PRESSED 8
#define REPEAT 16
#define LONG_PRESSED 32

SanguruButton.h ▼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <TimerOne.h>
#include <SanguruButton.h>
SanguruButton btn1(A1);
byte prevButtonVal;
byte buttonVal;
void setup() {
  // put your setup code here, to run once:
  Timer1.initialize(1000);
  Timer1.attachInterrupt(ISRupdate);
  Serial.begin(9600);
  printHelp();
}
void loop() {
  // put your main code here, to run repeatedly:
  buttonVal = btn1.getButton();
  if (prevButtonVal != buttonVal) {  
    switch(buttonVal) {
      case BUTTON_NONE : Serial.println("buttonNone");break;
      case ON_RELEASED : Serial.println("onReleased");break;
      case ON_PRESSED  : Serial.println("onPressed");break;
      case RELEASED    : Serial.println("released");break;
      case PRESSED     : Serial.println("pressed");break;
      case REPEAT      : Serial.println("repeat");break;
      case LONG_PRESSED: Serial.println("longPressed");break;
      defualt: Serial.println("button error");break;
    }
    prevButtonVal = buttonVal;
  }
  if (Serial.available()) {
    serialReadAndSetOption();    
  }
 
}
void ISRupdate() {
  btn1.update();
}
void printHelp() {
  Serial.println("***commad list");
  Serial.println("r 1/0 setRepeat(true/false)");
  Serial.println("l 1/0 longPress(true/false)");
  Serial.println();
  Serial.println("*** button operations");
  Serial.println("onReleased");
  Serial.println("onPressed");
  Serial.println("released");
  Serial.println("pressed");
  Serial.println("repeat");
  Serial.println("longPressed");
  Serial.println();
}
 
void serialReadAndSetOption() {
 
  char c = Serial.read();
  if (c == 'r') {
    int val = Serial.parseInt();
    if (val == 1){
      btn1.setRepeat(true);
      Serial.println("*** setRepeat(true)");
    }
    else {
      btn1.setRepeat(false);
      Serial.println("*** setRepeat(false)");
    }
  }
  else if (c == 'l') {
    int val = Serial.parseInt();
    if (val == 1){
      btn1.setLongPress(true);
      Serial.println("*** setLongPress(true)");
    }
    else {
      btn1.setLongPress(false);
      Serial.println("*** setLongPress(false)");
    }
  }
  else if (c == 'h') {
    printHelp();
  }
 
}
▲모두 닫기  |  {끝:버튼 테스트용 스케치}

관련

Filed Under: 사물인터넷, 아두이노, 아두이노강좌, 정보기술

댓글 남기기 응답 취소

Copyright © 2025 · Waytips Theme ·