?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

아두이노 질문합니다.

페이지 정보

작성자 한율 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-06-19 18:18 조회834회 댓글1건

본문

앞서 피에조 스피커로 슈퍼마리오 멜로디 재생하기를 따라해보았습니다.

#define melodyPin 6
#define touchPin 8
#define  BUTTON 3
#define led 2

unsigned long prevPlayTime = 0;
unsigned long playDuration = 0;
int currentMelody = 0;
#include "pitches.h"


//Mario main theme melody
int melodySize = 75;
int melody[] = {
  NOTE_E7, NOTE_E7, 0, NOTE_E7, 0, NOTE_C7, NOTE_E7, 0, NOTE_G7, 0, 0,  0, NOTE_G6, 0, 0, 0,
  NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0,
  NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0,
  NOTE_C7, 0, 0, NOTE_G6, 0, 0, NOTE_E6, 0, 0, NOTE_A6, 0, NOTE_B6, 0, NOTE_AS6, NOTE_A6, 0,
  NOTE_G6, NOTE_E7, NOTE_G7, NOTE_A7, 0, NOTE_F7, NOTE_G7, 0, NOTE_E7, 0,NOTE_C7, NOTE_D7, NOTE_B6, 0, 0
};
//Mario main them tempo
int tempo[] = {
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
  9, 9, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
};


void sing() {
    if(millis() < prevPlayTime + playDuration) {
        // music is playing. do nothing
        return;
    }
    // stop the tone playing:
    noTone(6);
   
   // if(currentMelody >= melodySize)
     //   currentMelody = 0;
    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000/tempo[currentMelody];
 
    tone(melodyPin, melody[currentMelody], noteDuration);
    prevPlayTime = millis();
    playDuration = noteDuration * 1.30;
 

    currentMelody++;
  
}
 
 
void setup() {
  // put your setup code here, to run once:
  //Serial.begin(9600);
  pinMode(touchPin,INPUT);
  pinMode(melodyPin, OUTPUT);
  pinMode(BUTTON, INPUT);
  pinMode(led, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
 int prev_state =0;
 int touchValue= digitalRead(touchPin);
   
 if(touchValue == LOW){ //터치를 했을 때
    
      //present_state= HIGH;
      Serial.println("touched");
      digitalWrite(melodyPin,LOW);

      if(led == HIGH)
        {
          prev_state= HIGH;
        }
        else{
           digitalWrite(led,HIGH);
        }
     
 }
 
      

 else{ //터치를 안 했을 때

       Serial.println("not touched");
       if(prev_state==HIGH){
       sing();
       }
       }
 

  if(digitalRead(BUTTON)==HIGH)
      {
        digitalWrite(led,LOW);
        digitalWrite(melodyPin,LOW);
        prev_state=0;
      }
 
   }

터치센서와 연결을 하여 터치가 없으면 소리가 나게 하고 싶은데요. 터치가 한번 이상 있고난 후 터치입력이 없으면 소리가 나게하고 싶은데 뜻대로 되지 않더라구요 ㅠㅠ 그냥 간단하게 터치가 있으면 소리가 안난다. 터치가 없으면 소리가 난다. 라고만 하면 터치센서를 잡고 있지 않는 이상 컴퓨터에 연결하자마자 소리가 나더라구요 어떤 부분을 어떻게 고쳐야 할까요? 그리고 sing함수는 어떻게 멈추는 것인지 알고 싶습니다. 버튼을 눌러서 멜로디 핀을 low로 바꿔주는 것으로는 소리가 멈추지 않더라구요!

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

loop() 함수안에서 sing() 함수는 계속 호출되도록 해주세요. 그리고 터치에 의해 on/off 하고 싶다면 sing() 함수 안에서 터치 상태를 확인하고 실행을 중단시키면 됩니다.