오늘이라도
[Arduino] 4. 스트라이크 게임, 조도 센서, 피에조 스피커, 초음파 거리 센서, 거리에 따라 소리 출력하기 본문
[Arduino] 4. 스트라이크 게임, 조도 센서, 피에조 스피커, 초음파 거리 센서, 거리에 따라 소리 출력하기
upcake_ 2020. 4. 23. 14:30https://github.com/upcake/Class_Examples
교육 중에 작성한 예제들은 깃허브에 올려두고 있습니다.
gif 파일은 클릭해서 보는 것이 정확합니다.
- 스트라이크 게임 -
▼스트라이크 게임, 코드
void setNum();
int num1 = 0;
int num2 = 0;
int num3 = 0;
int chkNum1 = 0;
int chkNum2 = 0;
int chkNum3 = 0;
int strike = 0;
int ball = 0;
void setup() {
Serial.begin(9600);
randomSeed(analogRead(A0));
setNum();
for(int i = 2; i <= 6; i++) {
pinMode(i, OUTPUT);
}
} // setup()
void loop() {
if(Serial.available()) {
strike = 0;
ball = 0;
chkNum1 = Serial.parseInt();
chkNum2 = Serial.parseInt();
chkNum3 = Serial.parseInt();
Serial.print("chkNum ▶ ");
Serial.print(chkNum1);
Serial.print("/");
Serial.print(chkNum2);
Serial.print("/");
Serial.println(chkNum3);
if(num1 == chkNum1) {
strike++;
} else if(num1 == chkNum2 || num1 == chkNum3) {
ball++;
}
if(num2 == chkNum2) {
strike++;
} else if(num2 == chkNum1 || num2 == chkNum3) {
ball++;
}
if(num3 == chkNum3) {
strike++;
} else if(num3 == chkNum1 || num3 == chkNum2) {
ball++;
}
Serial.print("Strike : ");
Serial.print(strike);
Serial.print(" / Ball : ");
Serial.println(ball);
/* 출력문을 for문으로도 작성할 수 있다.
* for(i = 0; i < ball; i++) {
* digitalWrite(i + 2, HIGH);
* }
*/
if(strike > 0 && ball == 0) {
if(strike == 1) {
digitalWrite(5, HIGH);
delay(1000);
digitalWrite(5, LOW);
} else if(strike == 2) {
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
delay(1000);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
} else if(strike == 3) {
Serial.println("You Win!");
int cnt = 0;
while(true) {
if(cnt == 9) {
break;
}
for (int i = 2; i <= 6; i++) {
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
}
cnt++;
}
setNum();
} // if strike == 3
} else if(strike == 0 && ball > 0) {
if(ball == 1) {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
} else if(ball == 2) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
} else if(ball == 3) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
} else if(strike > 0 && ball > 0) {
if(strike == 1 && ball == 1) {
digitalWrite(2, HIGH);
digitalWrite(5, HIGH);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(5, LOW);
} else if (strike == 1 && ball == 2) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(5, LOW);
}
}
} // if Serial available
} // loop()
void setNum() {
num1 = random(1, 10);
num2 = random(1, 10);
num3 = random(1, 10);
while(num1 == num2 || num1 == num3 || num2 == num3) {
num1 = random(1, 10);
num2 = random(1, 10);
num3 = random(1, 10);
}
Serial.println("========================================");
Serial.print(num1);
Serial.print(", ");
Serial.print(num2);
Serial.print(", ");
Serial.println(num3);
Serial.println("========================================");
Serial.println("Game Start!");
} // setNum()
- 숫자 3개를 랜덤 생성하고 num1, num2, num3 변수에 저장한다.
- 사용자에게 숫자 3개를 입력받고 chkNum1, chkNum2, chkNum3에 저장한다.
- 각각의 숫자와 자리가 모두 일치하면 strike 값이 증가하고, strike 값만큼 노랑 LED가 켜진다.
- 일치하는 숫자가 있지만 자리가 다를 경우 ball 값이 증가하고, ball 값만큼 초록 LED가 켜진다.
- 숫자와 자리까지 모두 맞추면 승리 메시지가 출력되고 모든 LED가 순차적으로 반복해서 켜진다.
- 다시 게임을 시작한다.
- 조도 센서 -
- 주변이 어두울 때는 불이 켜지고 밝을 때는 불이 켜지게끔 코드를 작성하였다.
- 센서 주변의 밝기에 따라 센서에 0 ~ 1023의 아날로그 값이 입력된다.
- 피에조 스피커 -
- 피에조 스피커는 주파수에 맞게 해당 소리를 출력하는 스피커이다.
- 코드 상단부에 각 음계에 맞는 주파수를 미리 정의해두고 사용한다.
- 소리를 출력하기 위해 tone() 메서드를 사용한다.
- tone(핀 번호, 주파수, 지속 시간)
- 초음파 거리 센서 -
- 센서가 작동하면 trig부분에서 초음파를 발사한다. (digitalWrite HIGH/LOW)
- 장애물에 부딪히고 반사되는 초음파를 echo부분에서 인식한다. (pulseIn)
- 발사에서 인식까지 걸린 시간, 즉, 초음파의 이동 시간을 이용해 거리를 구한다.
※ (측정 거리) = (초음파의 이동 시간/2) / (초음파의 속도)
- 거리에 따라 소리 출력 -
- 센서에서 거리가 멀수록 소리가 느리게 출력되고 가까울수록 빠르게 출력된다.