아두이노 토글스위치 제어 - adu-ino togeulseuwichi jeeo

배우기

03 3 강 - 버튼 스위치 사용하기

스위치로 LED 제어하기

조건문을 사용하여 buttonPin의 값을 digital 방식으로 읽어 LOW 상태일 때 LED를 켜고, HIGH (기본상태) 일 때 LED를 끄는 동작을 하도록 만들었습니다.

아두이노 토글스위치 제어 - adu-ino togeulseuwichi jeeo

이번에는 스위치 두 개로 회로를 구성해보세요.

아두이노 토글스위치 제어 - adu-ino togeulseuwichi jeeo

실습 내용

스위치 하나를 연결하여 스위치를 누르는 동안 LED를 켜는 코드입니다.

스위치 두 개를 연결하여 하나는 LED를 켜는 기능, 다른 하나는 LED를 끄는 기능을 만들어 보세요!

아두이노 시뮬레이터 01장 - 아두이노 시뮬레이터 서킷(Circuits) 01-1 아두이노 시뮬레이터의 필요성 01-2 아두이노 시뮬레이터가 필요한 사람 01-3 아두이노 시뮬레이터의 동작환경 02장 - 서킷(Circuits) 개요 02-1 팅커캐드(TinkerCAD) 회원가입 02-2 새로운 디자인 생성하기 02-3 회로 배선하기 02-4 키보드 단축키 사용방법 03장 - 신호와 회로의 기본 원리 03-1 디지털과 아날로그 신호 03-2 회로구성과 기본 원리 04장 - 디지털 출력 04-1 LED(발광다이오드) 04-2 LED 깜박이기 예제 04-3 저항(Resistor) 04-4 브레드보드(Breadboard) 04-5 시리얼(Serial) 모니터 04-6 두 개의 LED 교대로 깜빡이기 05장 - 디지털 입력 05-1 푸시버튼으로 LED 켜고 끄기 05-2 풀업(Pull-up)저항과 풀다운(Pull-down) 저항 05-3 내부 풀업(Pull-up)저항 사용하기 05-4 슬라이드 스위치 사용하기 05-5 푸시버튼을 슬라이드 스위치처럼 사용하기 05-6 PIR 센서로 현관등 만들기 06장 - 아날로그 입력 06-1 가변저항(Potentiometer) 사용하기 06-2 조도센서(Photoresistor) 사용하기 06-3 온도센서(TMP36) 사용하기 07장 - 아날로그 출력 07-1 LED 밝기 제어하기 07-2 삼색(RGB) LED 사용하기 07-3 DC모터 제어하기 08장 - 함수와 라이브러리 08-1 초음파(Ultrasonic) 센서 사용하기 08-2 서보모터(Servo motor) 사용하기 09장 - 액정 디스플레이(LCD) 09-1 액정 디스플레이(LCD) 사용하기 09-2 액정 디스플레이(LCD) 응용하기 10장 - 7세그먼트(Segment) 10-1 7세그먼트 사용하기 10-2 7세그먼트 디코더 사용하기 11장 - 적외선 센서와 리모컨 11-1 적외선 리모컨으로 LED 제어하기 11-2 적외선 리모컨으로 무드등 만들기 12장 - 모터 드라이버 12-1 모터 드라이버로 DC모터 제어하기 12-2 무선조종 2륜 자동차 만들기 13장 - 피에조(Piezo) 스피커 13-1 피에조 스피커 로 음계 표현하기 13-2 피에조 스피커로 전자키보드 만들기

이전 글 에서 택트 스위치(Tact Switch)를 이용해서 LED를 제어해 보았습니다. 스위치의 버튼을 누르고 있을때만 LED가 켜지고 스위치에서 손을 떼면 LED가 꺼졌었는데요. 이번에는 한 번 누르면 LED가 켜지는 것이 유지되고 다시 누르면 LED가 꺼진 상태로 유지되도록 해 보겠습니다. 그런데 이번에는 Debounce 라는 개념이 들어갑니다. 스위치는 기계적인 장치이므로 켜거나 끌 때 기계적인 진동이나 접촉에 의해서 스위치가 짧은 시간에 여러번 ON/OFF 된 것으로 인식할 수 있습니다. 이런 현상을 Bounce 현상이라고 하고 이것을 없애 주는것이 Debounce 입니다. 즉, 소프트웨어 적으로 Debounce 시간을 설정해두고 이 시간보다 짧은 시간에 일어나는 스위치의 ON/OFF 는 무시하도록 하는 것입니다.

택트 스위치 (Tact Switch) -출처 http://grobotronics.com

택트 스위치 입니다. 위와 같은 것을 사용 합니다. 스위치를 누를 시 초록색 또는 주황색 다리(Lead)끼리 대각선으로 전류가 흐르게 됩니다. 이 글에서는 한 쌍의 Lead 만 사용하면 되므로 쓰지 않는 쌍은 브레드보드에 꼽지 않았습니다.

■ 연결

아두이노 토글스위치 제어 - adu-ino togeulseuwichi jeeo

아두이노 토글스위치 제어 - adu-ino togeulseuwichi jeeo
_2xSwitch_2xLED_ON_OFF_2.fzz

위와 같이 연결했습니다. 실제로는 LED 저항은 연결하지 않았지만 LED 보호를 위해서 220Ω 정도의 저항을 연결해 주는 것이 좋습니다.

스위치에도 풀업 10kΩ 정도의 저항을 달아주어야 하나 아두이노의 자체 풀업저장 기능을 사용하면 되므로 소프트웨어적으로 해결 했습니다. (스위치 핀모드 설정에 INPUT_PULLUP 사용)

■ 소스

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

int sw = 10;       // 스위치(SW) 핀 설정

int led = 6;       // LED 핀 설정

int state = LOW;      // LED 상태

int reading;          // SW 상태

int previous = LOW;   // SW 이전 상태

long time = 0;        // LED가 ON/OFF 토글된 마지막 시간

long debounce = 100;  // Debounce 타임 설정

void setup()

{

pinMode(sw, INPUT_PULLUP); // SW 를 설정, 아두이노 풀업저항 사용

pinMode(led, OUTPUT);      // LED 설정

}

void loop()

{

reading = digitalRead(sw);  // SW 상태 읽음

//SW 가 눌려졌고 스위치 토글 눌림 경과시간이 Debounce 시간보다 크면 실행

if (reading == HIGH && previous == LOW && millis() - time > debounce) {

if (state == HIGH)    // LED 가 HIGH 면 LOW 로 바꿔준다.

state = LOW;

else                  // LED 가 LOW 면 HIGH 로 바꿔준다.

state = HIGH;

time = millis();

}

digitalWrite(led, state);

previous = reading;

}

cs

소스를 보면 위에서 설명한 Debounce 시간을 100ms 로 주었습니다. 자신의 사정에 따라 적정 시간을 부여하면 되겠습니다.  그 이외 자세한 설명은 주석에 써 놓았습니다.

동작하는 모습 입니다. 잘 됩니다. Debounce 설정 때문에 100ms 보다 빠르게 스위치를 ON/OFF 하면 LED에는 변화가 없을 것입니다. 손가락 빠른 분들은 도전해 보세요.