본문 바로가기
개발일지/기타

아두이노 플레쉬 암산 게임기, 부저로 효과음 넣기

by 라이티아 2024. 5. 11.

-현재 듣고 있는 곡-

ザムザ / てにをは feat.初音ミク

플레이 리스트에 나도 모르게 들어있었던 노래였는데, 최근 찾아볼 정도로 좋아하고 있다

특유의 次(つぎ)발음이 좋다

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// LCD 모듈 설정
LiquidCrystal_I2C lcd(0x27, 16, 2);  // 주소 0x27에 16x2 크기의 LCD 모듈을 사용합니다.

const int buttonPinA = 2; // 버튼 핀을 디지털 핀 2에 연결합니다.
const int buttonPinB = 3;
const int buttonPinC = 4;
const int buttonPinD = 5;
// 이전 버튼 상태 변수 초기화
int previousButtonStateA = LOW;
int previousButtonStateB = LOW;
int previousButtonStateC = LOW;
int previousButtonStateD = LOW;

int level = 1;

int gameend = 0;

void setup() {
  // 버튼 핀을 입력으로 설정
  pinMode(buttonPinA, INPUT);
  pinMode(buttonPinB, INPUT);
  pinMode(buttonPinC, INPUT);
  pinMode(buttonPinD, INPUT);
  
  // LCD 초기화
  lcd.init();
  lcd.backlight();

  // 시리얼 통신 시작
  Serial.begin(9600);
}

void loop() {
  // 버튼 상태 읽기
  int buttonStateA = digitalRead(buttonPinA);
  int buttonStateB = digitalRead(buttonPinB);
  int buttonStateC = digitalRead(buttonPinC);
  int buttonStateD = digitalRead(buttonPinD);
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("flash plus");
  lcd.setCursor(0, 1);
  lcd.print("press to start");
  delay(50);
  
  if (buttonStateA == HIGH && previousButtonStateA == LOW) {
    while(true){
      int time_c = 0;
      int randomNumberA = random(1, level*10);
      int randomNumberB = random(1, level*10);
      int randomNumberC = random(1, level*10);
      int randomNumberD = random(1, level*10);
      int randomNumberE = random(1, level*10);
      int sum = randomNumberA + randomNumberB + randomNumberC + randomNumberD + randomNumberE;
      int answer = 0;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("start");
      lcd.setCursor(0, 1);
      lcd.print("level ");
      lcd.print(level);
      delay(1000);
      
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Plus all number");
      lcd.setCursor(0, 1);
      lcd.print(randomNumberA);
      delay(1000);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Plus all number");
      lcd.setCursor(0, 1);
      lcd.print(randomNumberB);
      delay(1000);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Plus all number");
      lcd.setCursor(0, 1);
      lcd.print(randomNumberC);
      delay(1000);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Plus all number");
      lcd.setCursor(0, 1);
      lcd.print(randomNumberD);
      delay(1000);

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Plus all number");
      lcd.setCursor(0, 1);
      lcd.print(randomNumberE);
      delay(1000);
      
      unsigned long startTime = millis();
      while(millis() - startTime < 10000){
        buttonStateB = digitalRead(buttonPinB);
        buttonStateC = digitalRead(buttonPinC);
        buttonStateD = digitalRead(buttonPinD);
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Answer is");
        lcd.setCursor(0, 1);
        lcd.print(answer);
        delay(50);
        
        if (buttonStateB == HIGH && previousButtonStateB == LOW) {
          answer += 100;
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Answer is");
          lcd.setCursor(0, 1);
          lcd.print(answer);
          delay(50);
        }
        if (buttonStateC == HIGH && previousButtonStateC == LOW) {
          answer += 10;
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Answer is");
          lcd.setCursor(0, 1);
          lcd.print(answer);
          delay(50);
        }
        if (buttonStateD == HIGH && previousButtonStateD == LOW) {
          answer += 1;
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Answer is");
          lcd.setCursor(0, 1);
          lcd.print(answer);
          delay(50);
        }
        
        previousButtonStateA = buttonStateA;
        previousButtonStateB = buttonStateB;
        previousButtonStateC = buttonStateC;
        previousButtonStateD = buttonStateD;
      }
      
      if(answer == sum){
        level += 1;
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("You are right!");
        lcd.setCursor(0, 1);
        lcd.print("Soon next level");
        delay(5000);
      }
      else{
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("You are lose");
        lcd.setCursor(0, 1);
        lcd.print("Game End");
        gameend = 1;
        delay(5000);
      }
        
      if(gameend == 1)
        break;
        
      previousButtonStateA = buttonStateA;
      previousButtonStateB = buttonStateB;
      previousButtonStateC = buttonStateC;
      previousButtonStateD = buttonStateD;
    }
  }
  if(gameend == 1){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Last level is ");
    lcd.print(level);
    lcd.setCursor(0, 1);
    lcd.print("Game End");
    delay(10000);
    previousButtonStateA = buttonStateA;
    previousButtonStateB = buttonStateB;
    previousButtonStateC = buttonStateC;
    previousButtonStateD = buttonStateD;
  }
  gameend = 0;
}

현재 아두이노로 구현된 플레시 암산 게임기이다

 

여기에 버튼을 누르면 소리가 나게 해보려 한다

 

 

일단 부저 소리의 매커니즘을 까먹었으니, 이전에 만든 코드를 살펴보자

https://github.com/NoNamed02/College/blob/main/Arduino/lecture/servo_senser_buser.ino

(이전에 만든 자동 정수기 매커니즘이다)

 

 

우선 부저 핀을 #define으로 설정해준다

사실 int로 해도 될거 같지만, 그냥 그러려니 하자

 

여기에 tone()함수를 사용하여 소리를 낸다

tone(부저핀(디지털), 주파수) 로 사용한다

 

그럼 부저 음계를 살펴보자

3도 도의 음계는 대충 130이다

이렇게 하면 시작 버튼을 누르면 소리가 난다

 

문제가 생겼다

이렇게, 도 - 솔 - 미 - 솔 의 멜로디를 넣으니, 중간 중간의 딜레이 때문에 버튼이 인식되는 타이밍이 꼬였다

즉, 버튼을 눌러도, 딜레이 다음에 걸리면 버튼이 눌리지 않은 취급이 된다

if문으로 하면 좀 나아지나 싶었지만, 큰 차이가 없다

그냥 딜레이를 물리적으로 줄이는 걸로 타협하자

 

그후, 승리, 패배, 다음 스테이지 등 효과음을 추가하여 마무리 했다

https://github.com/NoNamed02/College/blob/main/Arduino/lecture/flash%20plus.ino

 

College/Arduino/lecture/flash plus.ino at main · NoNamed02/College

Contribute to NoNamed02/College development by creating an account on GitHub.

github.com

 

그렇게 완성된 플레이 암산 게임기이다