오늘이라도

[Arduino] 4. 스트라이크 게임, 조도 센서, 피에조 스피커, 초음파 거리 센서, 거리에 따라 소리 출력하기 본문

취업성공패키지 SW 개발자 교육/사물 인터넷(IoT)

[Arduino] 4. 스트라이크 게임, 조도 센서, 피에조 스피커, 초음파 거리 센서, 거리에 따라 소리 출력하기

upcake_ 2020. 4. 23. 14:30
반응형

https://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가 순차적으로 반복해서 켜진다.

 - 다시 게임을 시작한다.

 

▲스트라이크 게임, 작동 영상(2배속)

 

 

 - 조도 센서 -

▲조도 센서 연동해서 LED 켜기, 회로도

 

▲조도 센서 연동해서 LED 켜기, 코드와 시리얼 모니터

 - 주변이 어두울 때는 불이 켜지고 밝을 때는 불이 켜지게끔 코드를 작성하였다.

 - 센서 주변의 밝기에 따라 센서에 0 ~ 1023의 아날로그 값이 입력된다.

 

▲조도 센서 연동해서 LED켜기, 작동 영상

 

 

 - 피에조 스피커 -

▲피에조 스피커로 학교종 연주, 회로도

 

▲피에조 스피커로 학교종 연주, 코드

 - 피에조 스피커는 주파수에 맞게 해당 소리를 출력하는 스피커이다.

 - 코드 상단부에 각 음계에 맞는 주파수를 미리 정의해두고 사용한다.

 - 소리를 출력하기 위해 tone() 메서드를 사용한다.

 - tone(핀 번호, 주파수, 지속 시간)

 

▲피에조 스피커로 학교종 연주, 실물 보드 사진

 

 - 초음파 거리 센서 -

▲초음파 거리 센서, 회로도

 

▲초음파 거리 센서, 코드

 - 센서가 작동하면 trig부분에서 초음파를 발사한다. (digitalWrite HIGH/LOW)

 - 장애물에 부딪히고 반사되는 초음파를 echo부분에서 인식한다. (pulseIn)

 - 발사에서 인식까지 걸린 시간, 즉, 초음파의 이동 시간을 이용해 거리를 구한다.

※ (측정 거리) = (초음파의 이동 시간/2) / (초음파의 속도)

 

 

▲초음파 거리 센서, 실물 보드 사진

 

 

 - 거리에 따라 소리 출력 -

▲거리에 따라 소리 출력, 회로도
▲거리에 따라 소리 출력, 코드

 - 센서에서 거리가 멀수록 소리가 느리게 출력되고 가까울수록 빠르게 출력된다.

 

▲거리에 따라 소리 출력, 실물 보드 사진

반응형