아두이노 터치 센서

터치 센서(터치 버튼이나 터치 스위치라고도 함)는 장치를 제어하는 데 널리 사용됩니다(예: 터치 가능한 램프). 버튼과 같은 기능을 합니다. 많은 새로운 장치에서 버튼 대신 사용되며, 이는 제품을 깔끔하게 보이게 합니다.

이 튜토리얼에서는 아두이노와 터치 센서를 사용하는 방법을 배워볼 것입니다.

준비물

1×아두이노 우노 R3 쿠팡 | 아마존
1×USB 2.0 타입 A-to-B 케이블 (USB-A PC용) 쿠팡 | 아마존
1×USB 2.0 타입 C-to-B 케이블 (USB-C PC용) 아마존
1×터치 센서 (Touch Sensor) 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

터치 센서에 대하여

핀 배치

터치 센서는 3개의 핀이 있습니다:

  • GND 핀: GND(0V)에 연결해야 합니다.
  • VCC 핀: VCC(5V 또는 3.3V)에 연결해야 합니다.
  • SIGNAL 핀: 출력 핀입니다: 터치하지 않을 때는 LOW, 터치할 때는 HIGH입니다. 이 핀은 Arduino의 입력 핀에 연결해야 합니다.
터치 센서 사용법 핀아웃

작동 원리

  • 센서가 만져지지 않을 때, 센서의 신호 핀은 저레벨입니다.
  • 센서가 만져질 때, 센서의 신호 핀은 고레벨입니다.

아두이노 - 터치 센서

터치 센서의 신호핀이 아두이노의 입력 핀에 연결되어 있습니다.

아두이노의 핀(입력 핀으로 설정된) 상태를 읽음으로써 터치 센서가 터치되었는지 여부를 감지할 수 있습니다.

선연결

아두이노 터치 센서 연결 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

터치 센서 프로그래밍 방법

pinMode() 함수를 사용하여 아두이노 핀을 디지털 입력 모드로 초기화합니다. 예를 들어, 핀 7

pinMode(7, INPUT_PULLUP);

digitalRead() 함수를 사용하여 아두이노 핀의 상태를 읽습니다.

int inputState = digitalRead(7);

※ 주의:

널리 사용되는 두 가지 사용 사례가 있습니다:

  • 첫 번째: 입력 상태가 HIGH일 경우, 어떤 것을 수행합니다. 입력 상태가 LOW일 경우, 반대로 다른 것을 수행합니다.
  • 두 번째: 입력 상태가 LOW에서 HIGH로 (또는 HIGH에서 LOW로) 변경될 경우, 어떤 것을 수행합니다.

응용 프로그램에 따라, 우리는 이 중 하나를 선택합니다. 예를 들어, 터치 센서를 사용하여 LED를 제어하는 경우:

  • 센서에 접촉했을 때 LED가 켜지고 접촉하지 않았을 때 LED가 꺼지길 원한다면, 첫 번째 사용 사례를 사용해야 합니다.
  • 센서에 접촉할 때마다 LED가 켜지고 꺼지게 하고 싶다면, 두 번째 사용 사례를 사용해야 합니다.

LOW에서 HIGH로 상태 변경 감지 방법

// 상수는 변경되지 않습니다. 여기서는 핀 번호를 설정하는 데 사용됩니다: const int SENSOR_PIN = 7; // 센서의 SIGNAL 핀에 연결되는 Arduino의 입력 핀 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀에서의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 값 void setup() { // 초당 9600비트로 시리얼 통신 시작 Serial.begin(9600); // Arduino의 핀을 입력으로 초기화 pinMode(SENSOR_PIN, INPUT); } void loop() { // 입력 핀의 상태 읽기: currentState = digitalRead(SENSOR_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("센서가 만져졌습니다"); // 마지막 상태 저장 lastState = currentState; }

터치 센서 - 아두이노 코드

우리는 네 개의 예제 코드를 실행할 것입니다:

  • 터치 센서에서 값을 읽고 시리얼 모니터에 출력합니다.
  • 센서의 상태에 따라 LED를 제어합니다.
  • 센서가 터치되었는지 또는 릴리즈되었는지 감지합니다.
  • 센서가 터치될 때 LED를 토글합니다 (이것은 가장 일반적으로 사용됩니다).

터치 센서에서 값을 읽고 시리얼 모니터에 출력합니다.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-touch-sensor */ // 상수는 변하지 않습니다. 여기서는 핀 번호를 설정하는데 사용됩니다: const int SENSOR_PIN = 7; // 센서의 SIGNAL 핀에 연결되는 Arduino의 입력 핀 void setup() { // 초당 9600비트로 직렬 통신을 초기화합니다: Serial.begin(9600); // Arduino의 핀을 입력으로 초기화합니다 pinMode(SENSOR_PIN, INPUT); } void loop() { // 입력 핀의 상태를 읽습니다: int state = digitalRead(SENSOR_PIN); // 상태를 직렬 모니터로 출력합니다 Serial.println(state); }

사용 방법

  • 위의 코드를 복사하고 Arduino IDE로 열기
  • 코드를 Arduino에 업로드하기 위해 Arduino IDE에서 Upload 버튼을 클릭하세요.
  • 센서에 손가락을 대고 떼세요.
  • 시리얼 모니터에서 결과를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
0 0 0 1 1 1 1 1 1 0 0
Ln 11, Col 1
Arduino Uno on COM15
2

센서 상태에 따라 LED를 제어합니다.

센서가 만져지면 LED를 켜세요. 센서가 만져지지 않으면 LED를 끄세요.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-touch-sensor */ // 상수는 변하지 않습니다. 여기서는 핀 번호를 설정하는 데 사용됩니다: const int SENSOR_PIN = 7; // 센서의 SIGNAL 핀에 연결되는 Arduino의 입력 핀 void setup() { // 초당 9600비트로 시리얼 통신을 초기화합니다: Serial.begin(9600); // Arduino의 핀을 입력으로 초기화합니다 pinMode(SENSOR_PIN, INPUT); // 디지털 핀 LED_BUILTIN을 출력으로 초기화합니다. pinMode(LED_BUILTIN, OUTPUT); } void loop() { // 입력 핀의 상태를 읽습니다: int state = digitalRead(SENSOR_PIN); // 센서의 상태에 따라 LED를 제어합니다 digitalWrite(LED_BUILTIN, state); }

사용 방법

  • 위의 코드를 복사하고 아두이노 IDE로 열기
  • 아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 아두이노에 업로드
  • 센서에 손가락을 대고 계속 대고 있기
  • LED 상태 보기 ⇒ LED가 켜져 있어야 함.
  • 센서에서 손가락을 떼기
  • LED 상태 보기 ⇒ LED가 꺼져 있어야 함.

센서가 만져지거나 놓아졌는지 감지합니다

// 상수는 변경되지 않습니다. 여기서는 핀 번호를 설정하는 데 사용됩니다: const int SENSOR_PIN = 7; // 센서의 SIGNAL 핀에 연결되는 Arduino의 입력 핀 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀에서의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 void setup() { // 초당 9600비트의 속도로 시리얼 통신을 초기화합니다: Serial.begin(9600); // Arduino의 핀을 입력으로 초기화합니다 pinMode(SENSOR_PIN, INPUT); } void loop() { // 입력 핀의 상태를 읽습니다: currentState = digitalRead(SENSOR_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("센서가 접촉되었습니다"); else if(lastState == HIGH && currentState == LOW) Serial.println("센서가 놓여졌습니다"); // 마지막 상태를 저장합니다 lastState = currentState; }

사용 방법

  • 위의 코드를 복사하여 아두이노 IDE로 열기
  • 아두이노 IDE에서 Upload 버튼을 클릭하여 아두이노에 코드를 업로드
  • 센서에 손가락을 대고 계속 접촉하십시오.
  • 시리얼 모니터에서 결과를 확인하십시오.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The sensor is touched
Ln 11, Col 1
Arduino Uno on COM15
2
  • 센서에서 손가락을 떼세요.
  • 시리얼 모니터에서 결과를 확인하세요.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The sensor is touched The sensor is is released
Ln 11, Col 1
Arduino Uno on COM15
2

센서가 닿으면 LED를 전환합니다.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-touch-sensor */ // 상수는 변경되지 않습니다. 여기서는 핀 번호를 설정하는 데 사용됩니다: const int SENSOR_PIN = 7; // 센서의 SIGNAL 핀에 연결하는 아두이노의 입력 핀 // 변수는 변경될 것입니다: int lastState = LOW; // 입력 핀에서의 이전 상태 int currentState; // 입력 핀에서의 현재 읽기 int ledState = LOW; // 현재 LED 상태 void setup() { // 초당 9600비트의 속도로 시리얼 통신을 초기화합니다: Serial.begin(9600); // 아두이노의 핀을 입력으로 초기화합니다 pinMode(SENSOR_PIN, INPUT); // 디지털 핀 LED_BUILTIN을 출력으로 초기화합니다. pinMode(LED_BUILTIN, OUTPUT); } void loop() { // 입력 핀의 상태를 읽습니다: currentState = digitalRead(SENSOR_PIN); if(lastState == LOW && currentState == HIGH){ // LED 상태 토글 if(ledState == LOW) ledState = HIGH; else if(ledState == HIGH) ledState = LOW; // LED 제어 digitalWrite(LED_BUILTIN, ledState); } // 마지막 상태를 저장합니다 lastState = currentState; }

사용 방법

  • 위의 코드를 복사하고 Arduino IDE로 열기
  • Arduino IDE에서 Upload 버튼을 클릭하여 아두이노에 코드 업로드
  • 센서에 손가락을 대고 떼기.
  • LED 상태 확인 ⇒ LED가 켜져야 합니다.
  • 센서에 손가락을 대고 떼기.
  • LED 상태 확인 ⇒ LED가 꺼져야 합니다.
  • 센서에 손가락을 대고 떼기.
  • LED 상태 확인 ⇒ LED가 켜져야 합니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

아래 동영상 데모는 아래 코드를 사용합니다. 동영상은 Arduino Uno R4를 보여주지만 Arduino Uno R3에서도 동일하게 작동합니다:

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-touch-sensor */ // --- Hardware Pin Definitions --- #define BUZZER_PIN 8 #define TOUCH_1_PIN 2 // Happy Birthday trigger #define TOUCH_2_PIN 3 // Jingle Bells trigger #define LED_A_PIN 4 // First indicator LED (Active-Low) #define LED_B_PIN 5 // Second indicator LED (Active-Low) // --- Musical Note Frequencies (Hz) --- #define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 #define NOTE_A4 440 #define NOTE_A5 880 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_D5 587 #define NOTE_E5 659 // --- Melody 1: Happy Birthday --- const int happyBirthdayMelody[] = { NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4, NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4, NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_B4, NOTE_B4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4 }; const int happyBirthdayDurations[] = { 8, 8, 4, 4, 4, 2, 8, 8, 4, 4, 4, 2, 8, 8, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4, 2 }; const int happyBirthdayLength = sizeof(happyBirthdayMelody) / sizeof(happyBirthdayMelody[0]); // --- Melody 2: Jingle Bells --- const int jingleBellsMelody[] = { NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_E4, NOTE_D4, NOTE_G4 }; const int jingleBellsDurations[] = { 4, 4, 2, 4, 4, 2, 4, 4, 4, 4, 1, 4, 4, 4, 4, 4, 4, 4, 8, 8, 4, 4, 4, 4, 2 }; const int jingleBellsLength = sizeof(jingleBellsMelody) / sizeof(jingleBellsMelody[0]); // --- Function Prototypes --- void playSong(const int melody[], const int durations[], int songLength); void updateLeds(int noteIndex, bool isQuietNote); void turnOffBothLeds(); /** * @brief Initializes peripheral pins and system communication. */ void setup() { Serial.begin(115200); pinMode(TOUCH_1_PIN, INPUT); pinMode(TOUCH_2_PIN, INPUT); pinMode(BUZZER_PIN, OUTPUT); pinMode(LED_A_PIN, OUTPUT); pinMode(LED_B_PIN, OUTPUT); // For Active-Low LEDs, setting pins HIGH turns them OFF on startup turnOffBothLeds(); Serial.println(F("Active-Low LED Music Box Jukebox Ready.")); } /** * @brief Main execution loop checking for touch sensor triggers. */ void loop() { if (digitalRead(TOUCH_1_PIN) == HIGH) { Serial.println(F("Touch 1 detected: Playing Happy Birthday...")); playSong(happyBirthdayMelody, happyBirthdayDurations, happyBirthdayLength); } else if (digitalRead(TOUCH_2_PIN) == HIGH) { Serial.println(F("Touch 2 detected: Playing Jingle Bells...")); playSong(jingleBellsMelody, jingleBellsDurations, jingleBellsLength); } } /** * @brief Iterates through the provided melody arrays to play the full song with LED sync. * @param melody Array containing note frequencies. * @param durations Array containing corresponding note lengths. * @param songLength Total number of notes in the song. */ void playSong(const int melody[], const int durations[], int songLength) { for (int thisNote = 0; thisNote < songLength; thisNote++) { bool isQuietNote = (melody[thisNote] == 0); int noteDuration = 1000 / durations[thisNote]; // Trigger Active-Low LED effect updateLeds(thisNote, isQuietNote); tone(BUZZER_PIN, melody[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); noTone(BUZZER_PIN); turnOffBothLeds(); // Drive both pins HIGH to turn off the LEDs } Serial.println(F("Song finished. LEDs reset to standby (HIGH).")); } /** * @brief Logic switch designed for Active-Low configurations (LOW = ON, HIGH = OFF). * @param noteIndex Current position in the melody array. * @param isQuietNote Evaluation flag determining if the note produces no sound. */ void updateLeds(int noteIndex, bool isQuietNote) { if (isQuietNote) { turnOffBothLeds(); return; } // Alternating Active-Low pattern if (noteIndex % 2 == 0) { digitalWrite(LED_A_PIN, LOW); // LED A turns ON digitalWrite(LED_B_PIN, HIGH); // LED B turns OFF } else { digitalWrite(LED_A_PIN, HIGH); // LED A turns OFF digitalWrite(LED_B_PIN, LOW); // LED B turns ON } } /** * @brief Forces both LED control pins to HIGH, turning them OFF in Active-Low logic. */ void turnOffBothLeds() { digitalWrite(LED_A_PIN, HIGH); digitalWrite(LED_B_PIN, HIGH); }