아두이노 라이브러리 덕분에 멜로디를 연주하는 것이 쉽습니다. 우리는 사각파를 생성하는 방법을 알 필요가 없습니다. 우리가 해야 할 일은 라이브러리의 두 함수인 tone()과 noTone()을 사용하는 것뿐입니다.
아두이노 코드
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-piezo-buzzer */#include"pitches.h"#define BUZZER_PIN 8 // 부저가 연결된 아두이노 핀// 멜로디 속의 음표들:int melody[] = {NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4};// 음표 지속 시간: 4 = 4분 음표, 8 = 8분 음표 등:int noteDurations[] = { 4, 8, 8, 4, 4, 4, 4, 4};voidsetup() {// 멜로디의 음표를 반복합니다:for (int thisNote = 0; thisNote < 8; thisNote++) {// 음표 지속 시간을 계산하려면, 1초를 음표 유형으로 나눕니다.// 예: 4분 음표 = 1000 / 4, 8분 음표 = 1000/8 등.int noteDuration = 1000 / noteDurations[thisNote];tone(BUZZER_PIN, melody[thisNote], noteDuration);// 음표를 구분하기 위해, 그들 사이의 최소 시간을 설정합니다.// 음표의 지속 시간 + 30%가 잘 작동하는 것으로 보입니다:int pauseBetweenNotes = noteDuration * 1.30;delay(pauseBetweenNotes);// 음을 중지합니다:noTone(BUZZER_PIN); }}voidloop() {// 멜로디를 반복할 필요가 없습니다.}
사용 방법
아두이노를 USB 케이블을 통해 PC에 연결하세요
아두이노 IDE를 열고, 올바른 보드와 포트를 선택하세요
위의 코드를 복사하고 아두이노 IDE로 열기
아두이노 IDE에서 pitches.h 파일을 생성하기 위해:
시리얼 모니터 아이콘 바로 아래 있는 버튼을 클릭 후 새 탭을 선택하거나, Ctrl+Shift+N 키를 사용하세요.
우리는 두 배열의 값을 변경하기만 하면 됩니다: int melody[]와 int noteDurations[].
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-piezo-buzzer */#include"pitches.h"#define BUZZER_PIN 8 // 부저가 연결된 아두이노 핀// 멜로디의 노트들:int melody[] = {NOTE_E5, NOTE_E5, NOTE_E5,NOTE_E5, NOTE_E5, NOTE_E5,NOTE_E5, NOTE_G5, NOTE_C5, NOTE_D5,NOTE_E5,NOTE_F5, NOTE_F5, NOTE_F5, NOTE_F5,NOTE_F5, NOTE_E5, NOTE_E5, NOTE_E5, NOTE_E5,NOTE_E5, NOTE_D5, NOTE_D5, NOTE_E5,NOTE_D5, NOTE_G5};// 노트 지속 시간: 4 = 4분 음표, 8 = 8분 음표 등, 또한 템포라고 함:int noteDurations[] = { 8, 8, 4, 8, 8, 4, 8, 8, 8, 8, 2, 8, 8, 8, 8, 8, 8, 8, 16, 16, 8, 8, 8, 8, 4, 4};voidsetup() {// 멜로디의 노트들을 반복 처리:intsize = sizeof(noteDurations) / sizeof(int);for (int thisNote = 0; thisNote < size; thisNote++) {// 노트 지속 시간을 계산하려면, 1초를 노트 유형으로 나눈다.// 예를 들어, 4분 음표 = 1000 / 4, 8분 음표 = 1000/8 등.int noteDuration = 1000 / noteDurations[thisNote];tone(BUZZER_PIN, melody[thisNote], noteDuration);// 노트를 구별하기 위해, 노트들 사이에 최소 시간을 설정한다.// 노트의 지속 시간 + 30% 가 잘 작동하는 것 같다:int pauseBetweenNotes = noteDuration * 1.30;delay(pauseBetweenNotes);// tone 재생을 중지:noTone(BUZZER_PIN); }}voidloop() {// 멜로디를 반복할 필요 없음.}
※ 주의:
위 코드에서는 delay() 함수를 사용합니다. 이 함수는 멜로디를 재생하는 동안 다른 코드의 실행을 차단합니다. 다른 코드의 실행을 차단하지 않으려면, 대신 ezBuzzer 라이브러리를 사용하세요. 이 라이브러리는 다른 코드를 차단하지 않고 부저로 비프 소리를 내거나 멜로디를 재생하기 위해 설계되었습니다.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
아래 동영상 데모는 아래 코드를 사용합니다. 동영상은 Arduino Uno R4를 보여주지만 Arduino Uno R3에서도 동일하게 작동합니다:
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-piezo-buzzer */#define BUZZER_PIN 10constint ledPins[4] = {2, 3, 4, 5};constint buttonPins[4] = {6, 7, 8, 9};constint tones[4] = { 262, 330, 392, 523};constint MAX_LEVEL = 50;int sequence[MAX_LEVEL];int level = 1;voidsetup() {for (int i = 0; i < 4; i++) {pinMode(ledPins[i], OUTPUT);digitalWrite(ledPins[i], HIGH);pinMode(buttonPins[i], INPUT_PULLUP); }pinMode(BUZZER_PIN, OUTPUT);randomSeed(analogRead(A0)); startSound();delay(500); sequence[0] = random(0, 4); playSequence();}voidloop() {for (int i = 0; i < level; i++) {intbutton = waitForButton(); playTone(button);if (button != sequence[i]) { gameOver();return; } } level++;if (level > MAX_LEVEL) { winGame();return; }delay(500); sequence[level - 1] = random(0, 4); playSequence();}void playSequence() {for (int i = 0; i < level; i++) { playTone(sequence[i]);delay(150); }}void playTone(int index) {digitalWrite(ledPins[index], LOW);tone(BUZZER_PIN, tones[index]);delay(300);noTone(BUZZER_PIN);digitalWrite(ledPins[index], HIGH);delay(100);}int waitForButton() {while (true) {for (int i = 0; i < 4; i++) {if (digitalRead(buttonPins[i]) == LOW) {delay(30);while (digitalRead(buttonPins[i]) == LOW) { }delay(30);return i; } } }}void startSound() {tone(BUZZER_PIN, 523);delay(150);tone(BUZZER_PIN, 659);delay(150);tone(BUZZER_PIN, 784);delay(200);noTone(BUZZER_PIN);}void gameOver() {for (int i = 0; i < 3; i++) {tone(BUZZER_PIN, 150);for (int j = 0; j < 4; j++) {digitalWrite(ledPins[j], LOW); }delay(200);noTone(BUZZER_PIN);for (int j = 0; j < 4; j++) {digitalWrite(ledPins[j], HIGH); }delay(150); } level = 1;delay(1000); sequence[0] = random(0, 4); playSequence();}void winGame() {for (int i = 0; i < 4; i++) {digitalWrite(ledPins[i], LOW); }tone(BUZZER_PIN, 523);delay(150);tone(BUZZER_PIN, 659);delay(150);tone(BUZZER_PIN, 784);delay(150);tone(BUZZER_PIN, 1047);delay(400);noTone(BUZZER_PIN);for (int i = 0; i < 4; i++) {digitalWrite(ledPins[i], HIGH); } level = 1;delay(1000); sequence[0] = random(0, 4); playSequence();}
도전하세요
당신이 사랑하는 노래를 연주하려면 압전 부저를 사용하세요.
귀중한 물건에 누군가 접근하면 자동으로 알람이 울리게 합니다. 힌트: 아두이노 - 모션 센서를 참조하세요.