본문 바로가기
Project/Embedded Project

기억력 도전 게임 프로젝트

by kjy1010 2023. 12. 22.

이번 프로젝트는 라즈베리파이에서 LED와 버튼을 활용하여 LED 기억력 도전 게임을 만드는 프로젝트입니다.

 

구현조건

  • 게임이 시작하면, 세 개의 LED가 임의의 순서로 한 번씩 점등됨
    - LED 점등 시간은 1초로 함.
  • LED의 점등이 끝나면, 점등된 순서에 맞게 버튼을 입력해야 함.
    - 버튼 입력을 확인하기 위해, 버튼 입력 시 해당하는 LED를 0.5초 점등시킴.
    - 0.5초 점등되는 동안에는 다른 버튼은 입력 받을 수 없음.
  • 버튼 입력 순서가 올바르면, 성공 표시 LED를 3번 점등하고, 게임을 종료함.
  • 그렇지 않으면 실패 표시 LED를 3번 점등하고 게임을 종료함.

회로도

  • LED 1 : GPIO 26(37) / LED 2 : GPIO 19(35) / LED 3 : GPIO 13(33)
  • 성공 표시 LED : GPIO 6(31) / 실패 표시 LED : GPIO 5(29)
  • Button 1 : GPIO16(36) / Button 2 : GPIO20(38) / Button 3 : GPIO21(40)

 

wiringledgame.c 파일을 만들어 코드를 작성해보겠습니다.

 

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define Button1 27 /* GPIO16 */
#define Button2 28 /* GPIO20 */
#define Button3 29 /* GPIO21 */
#define LED1 25 /* GPIO26 */
#define LED2 24 /* GPIO19 */
#define LED3 23 /* GPIO13 */
#define SLED 22/* GPIO6 */
#define FLED 21 /* GPIO5 */

int switchControl( )
{
    int i;
    int random[3];
    int cnt=0;
    int scnt=0;
    int fcnt=0;
    srand(time(NULL));
    pinMode(Button1, INPUT);
    pinMode(Button2, INPUT);
    pinMode(Button3, INPUT);
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(SLED, OUTPUT);
    pinMode(FLED, OUTPUT);

    for(i=0;i<3;i++)
    {
        random[i] = rand()%3;
        if(random[i]==0)
        {
            digitalWrite(LED1, HIGH);
            delay(1000);
            digitalWrite(LED1, LOW); 
            delay(500);
        }
        
        else if(random[i]==1)
        {
            digitalWrite(LED2, HIGH);
            delay(1000);
            digitalWrite(LED2, LOW); 
            delay(500);
        }
        else if(random[i]==2)
        { 
            digitalWrite(LED3, HIGH);
            delay(1000);
            digitalWrite(LED3, LOW);
            delay(500);         
        }
    }
    
   
    printf("start game\n");

    for (;;) 
    { 
        if(digitalRead(Button1) == LOW) 
        {                       
            digitalWrite(LED1, HIGH);
            delay(500);
            digitalWrite(LED1, LOW);
            if(random[cnt]==0)
            {
                scnt++;
                cnt++;
            }
            else
            {
                fcnt++;
                cnt++;
            }           
           printf("%d %d %d\n",scnt,fcnt,cnt);
        }
        else if(digitalRead(Button2) == LOW) 
        { 
            digitalWrite(LED2, HIGH); 
            delay(500);
            digitalWrite(LED2, LOW); 
            if(random[cnt]==1)
            {
                scnt++; 
                cnt++;         
            }
            else
            {
                fcnt++;
                cnt++;
            }  
            printf("%d %d %d\n",scnt,fcnt,cnt);          
        }
        else if(digitalRead(Button3) == LOW) 
        { 
            digitalWrite(LED3, HIGH); 
            delay(1000);
            digitalWrite(LED3, LOW); 
            if(random[cnt]==2)
            {
                scnt++;
                cnt++;
            }
            else
            {
                fcnt++;
                cnt++;
            }
            printf("%d %d %d\n",scnt,fcnt,cnt);
            
        }   
        if(cnt==3)
        break;
    }
    if(scnt == 3)
    {
        for(int i=0;i<3;i++)
        {
            digitalWrite(SLED, HIGH); 
            printf("you win");
            delay(1000);
            digitalWrite(SLED, LOW); 
            
        }       
    } 
    else if(scnt != 3)
    {
        for(int i=0;i<3;i++)
        {
            digitalWrite(FLED, HIGH); 
            printf("you lose");
            delay(1000);
            digitalWrite(FLED, LOW); 
            
        }       
    }   

    return 0; 
}
int main(int argc, char **argv)
{
    wiringPiSetup( );
    switchControl( ); /* 스위치 사용을 위한 함수 */
    return 0;
}

 

코드를 작성하였다면 gcc를 이용해 컴파일하고 실행시켜보겠습니다.

 

pi@raspberrypi:~ $ gcc -o wiringsledgame wiringledgame.c -lwiringPi
pi@raspberrypi:~ $ sudo ./wiringswitch

 

위의 명령어를 통해 프로그램을 실행 시킬 수 있습니다.

'Project > Embedded Project' 카테고리의 다른 글

충돌 위험 신호 시스템 프로젝트  (0) 2023.12.26