내장 점수 카운터가 있는 향상된 버즈 와이어 게임 - 아두이노 Nano 프로젝트
부품 및 소모품
| 부품 | 수량 |
| 아두이노 Nano R3 | 1 |
| 부저 | 1 |
| 5mm LED: 빨강 | 1 |
| 5mm LED: 초록 | 1 |
| Texas Instruments 시프트 레지스터 - 직렬-병렬 (74HC595) | 1 |
| 7세그먼트 LED 디스플레이, 빨강 | 1 |
| 저항 221Ω | 10 |
| 9V 배터리 (일반) | 1 |
필요한 도구 및 장비
프로젝트 소개
아두이노로 이것저것 만지작거리며 시간을 보내다, 실패 횟수를 세고 10번 닿으면 난리 나는 향상된 버즈 와이어 게임을 만들기로 했습니다!
제가 제 게임을 못 하는 영상입니다:
소스 코드는 세 파일로 나뉩니다.
코드에서 각 실패 후 500ms의 "유예 기간"을 설정했습니다. 플레이어에게 더 큰 휴식을 주고 싶다면 이 값을 수정하세요.
끝부분에서 LED가 너무 밝다는 걸 알았습니다! LED에 사용된 저항을 더 강한 것으로 교체해도 됩니다. 저는 약 100옴만 사용했거든요.
링으로는 열쇠고리 끝부분을 사용했습니다. 좋은 점은 그냥 열어서 와이어 끝까지 다시 돌아갈 필요가 없다는 거죠.
여러분이 제 프로젝트를 즐기시길 바랍니다!
코드
nervous_meter_score.ino (아두이노)
int latchPin = 3; // 74HC595의 ST_CP [RCK]
int clockPin = 4; // 74HC595의 SH_CP [SCK]
int dataPin = 2; // 74HC595의 DS [S1]
const int STOP_LED = 6;
const int GO_LED = 7;
const int BUZZ = 8;
const int TOUCH = 10;
const int fail_threshold = 9;
enum Status { STOP = 0, GO = 1 };
void setup() {
Serial.begin(9600);
displayInitialSetup();
gameInitialSetup();
}
Status status = GO;
int failCounter = 0;
void loop() {
while (failCounter > fail_threshold) {
gameover();
}
switch (status) {
case GO:
digitalWrite(GO_LED, HIGH);
digitalWrite(STOP_LED, LOW);
digitalWrite(BUZZ, LOW);
if (digitalRead(TOUCH) == HIGH) {
status = STOP;
}
break;
case STOP:
digitalWrite(GO_LED, LOW);
failCounter++;
if (failCounter > fail_threshold) break;
displayDigit(failCounter);
Serial.println(failCounter);
failAlarm();
status = GO;
break;
}
}
byte seg_spin[6] = { B10000000, B01000000, B00100000, B00010000, B00001000, B00000100 };
void gameover() {
for (int i=0; i<6; i++) {
digitalWrite(BUZZ, HIGH);
delay(5);
digitalWrite(BUZZ, LOW);
delay(50);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, seg_spin[i]);
digitalWrite(latchPin, HIGH);
delay(10);
}
}
score_display.ino (아두이노)
byte seg_digits[10] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11100110 // 9
};
void displayDigit(int x) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, seg_digits[x]);
digitalWrite(latchPin, HIGH);
}
void displayInitialSetup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
displayDigit(0);
}
game.ino (아두이노)
void gameInitialSetup() {
pinMode(STOP_LED, OUTPUT);
pinMode(GO_LED, OUTPUT);
pinMode(BUZZ, OUTPUT);
pinMode(TOUCH, HIGH);
digitalWrite(TOUCH, LOW);
}
void failAlarm() {
digitalWrite(STOP_LED, HIGH);
beep();
delay(150);
digitalWrite(STOP_LED, LOW);
digitalWrite(BUZZ, LOW);
delay(500);
}
void beep() {
for(int i=0; i<3; i++) {
digitalWrite(BUZZ, HIGH);
delay(50);
digitalWrite(BUZZ, LOW);
delay(50);
}
}
회로도
D10이 5V에 연결되면 실패로 간주되어 부저가 울리고 카운터가 증가합니다. 회로도에서는 이를 표현할 수 없어서 와이어와 구조를 적절히 구성하세요 :)