2023.08.07(pm) : 스위치 많이 누르기 게임

오늘 만들어볼 작품은 스위치 많이 누르기 게임입니다.

제품 구매 링크는 여기를 클릭하세요. 제품을 구매하면 교육자료가 포함되어 있습니다.

아두이노 기초는 아래 두 글을 참고 바랍니다.

준비물은 아래와 같습니다.

아두이노, 브레드보드, 점퍼케이블, 푸쉬버튼스위치 3개, LCD모듈, 볼트너트, 아크릴판 이렇게 구성되어 있습니다. 아크릴판은 껍질을 벗겨서 준비해주세요.

아래와 같이 LCD 모듈을 지지해줄 지지대를 4개의 구멍에 라이저를 조립해줍니다.

여기서 팁은 기둥을 놓고 아래에서 볼트를 조립하려고 하면 어려우니까 볼트를 손으로 받쳐놓고 위에서 기판라이저를 돌려주면 쉽게 조립할 수 있습니다.

아두이노 보드도 아래와 같이 고정을 해줍니다. 긴 볼트를 아래에서 위로 꽂아주고, 투명 지지대를 끼워준 뒤 맨 위에 아두이노 보드를 올려서 고정해줍니다. 간섭때문에 너트를 아래에서 조립해주는게 더 쉬울수도 있겠네요.

여기까지 조립이 다 되었다면, 브레드보드의 뒷면에 있는 양면테이프를 제거해주고 아크릴 판 위에 붙인 뒤 스위치를 아래와 같이 꽂아줍니다.

꽂기 전에 아래 브레드보드 기초를 확인하시기 바랍니다.

회로 연결은 아래와 같이 해줍니다.

출처 : 스위치 많이 누르기 게임

이제 코드를 아두이노에 업로드해주기만 하면 되는데요, 업로드 하기 전 LCD 모듈을 사용하기 위한 라이브러리가 필요합니다. 아두이노의 라이브러리 매니저에 가서 I2C LCD를 검색한 뒤 LiquidCrystal I2C를 Install해줍니다.

그리고 아래의 코드를 업로드해줍니다.

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

#define BUTTON_1P     10
#define BUTTON_2P     9
#define BUTTON_START  8

LiquidCrystal_I2C lcd(0x27, 20, 4);

unsigned int buttonCnt1 = 0;
unsigned int buttonCnt2 = 0;

unsigned long currTime = 0;
unsigned long prevTime = 0;

unsigned int gameTime = 30;

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON_1P, INPUT_PULLUP);
  pinMode(BUTTON_2P, INPUT_PULLUP);
  pinMode(BUTTON_START, INPUT_PULLUP);
  lcd.init();
  lcd.backlight();
}

void loop() {
  if (button1P() == 1) {
    if (gameTime > 0) buttonCnt1++;
    delay(50);
  }

  if (button2P() == 1) {
    if (gameTime > 0) buttonCnt2++;
    delay(50);
  }

  if (buttonStart() == 1) {
    gameTime = 30;
    buttonCnt1 = 0;
    buttonCnt2 = 0;
    delay(50);
  }

  currTime = millis();
  if (currTime - prevTime >= 1000)
  {
    prevTime = currTime;
    if (gameTime > 0) gameTime--;
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print("TIME:");
    lcd.print(gameTime);
    lcd.setCursor(0, 1);
    lcd.print("1P:");
    lcd.print(buttonCnt1);
    lcd.setCursor(8, 1);
    lcd.print("2P:");
    lcd.print(buttonCnt2);
  }
}

int button1P()
{
  static int oldSw = 1;
  static int newSw = 1;
  newSw = digitalRead(BUTTON_1P);
  if (newSw != oldSw)
  {
    oldSw = newSw;
    if (newSw == 0) {
      return 1;
    }
  }
  return 0;
}

int button2P()
{
  static int oldSw = 1;
  static int newSw = 1;
  newSw = digitalRead(BUTTON_2P);
  if (newSw != oldSw)
  {
    oldSw = newSw;
    if (newSw == 0) {
      return 1;
    }
  }
  return 0;
}

int buttonStart()
{
  static int oldSw = 1;
  static int newSw = 1;
  newSw = digitalRead(BUTTON_START);
  if (newSw != oldSw)
  {
    oldSw = newSw;
    if (newSw == 0) {
      return 1;
    }
  }
  return 0;
}

완성된 모습은 아래와 같습니다.

혹시 LCD에 불만 켜지고 어떤 글씨도 표시되지 않는다면 LCD 모듈의 아랫면에 파란색으로 되어 있는 가변저항을 드라이버를 이용해서 돌려줍니다.

그리고 아래와 같이 모두 네모가 출력될때까지 돌려준다음, 전원을 다시 공급해주고 글씨가 선명하게 표시될 때까지 가변저항을 조금씩 돌려줍니다.

이 게시물을 로봇만들기 재능봉사단 활동에 이용할 자료입니다.

감사합니다.