소규모 프로젝트(개인)

아두이노와 앱인벤터를 이용한 점수판 만들기 프로젝트

dawon-project 2025. 1. 1. 17:38

안녕하세요 

오늘은 제가 만들었던 앱인벤터와 아두이노를 이용해서 간단하게 점수판을 만들었던 프로젝트를 소개해드려고 합니다.

우선, 앱인벤터를 통해서 앱을 다운 받으면  앱 버튼을 통해서 점수를 매길 수 있으며 앱을 통해서 추가한 점수가 아두이노에 UART로 연결된 블루투스를 통해서 실시간으로 데이터가 전송이 되어서 FND에 앱 화면에서의 점수가 자동으로 기입되도록 만들었습니다.

 

+)추가로 동영상을 보셨을때 FND를 두개를 사용하고 있는데 하나의 FND는 계속해서 깜박이고, 다른 하나는 깜박이지 않는 것을 볼 수 있습니다. 

그 이유는 빨간색 FND는 "Static Display FND"로 한 번 입력된 값을 고정적으로 표시하는 FND이고,

파란색 FND는 "Dynamic Display FND"로 실시간으로 입력되는 데이터를 지속적으로 갱신해 표시하는 FND이기 때문에 제가 주기적으로 Delay 즉, 지연 시간을 주어서 FND에 반영되어 이러한 현상이 발생하는 것입니다. 

 

밑에 코드에 대한 설명도 적어놨으니 재밌게 봐주시면 감사하겠습니다.

 

<APP UI>

<아두이노 코드>

#include <Arduino.h>
#include <TM1637Display.h>
#include <SoftwareSerial.h> 
//7세그먼트 선택 핀
int digit_select_pin[] = {A0,A1,A2,A3};//7-segment 선택 리스트
//7세그먼트 제어 핀
int segment_pin[] = {13,12,11,10,9,8,7,6};//7-segment 내부 a~h까지 순서대로 핀 설정
//자릿수 표현 사이의 지연 시간, ms 단위
int time_delay = 5;
//0~9까지의 숫자 표시를 위한 세그먼트 a~dp의 점멸 패턴
//켜지는 부분이 1로 표현됨
byte digits_data[10]={~0xFC, ~0x60, ~0xDA, ~0xF2, 
~0x66, ~0xB6, ~0xBE, ~0xE4, ~0xFE, ~0xE6};//0~9 값 넣어놓기
#define CLK 2
#define DIO 3
uint8_t data[] = {0x00,0x00,0x00,0x00};// 초기값 세팅
TM1637Display display(CLK,DIO);//TM1637 FND 디스플레이 핀 설정
int blueS;//청 세트 값
int redS;//홍 세트 값
int blue;//청 점수
int red;//홍 점수
int count=0;//앱인벤터에서 값을 총 4번 보낸다 1. 청 세트 값 2.홍 세트 값 3. 청 점수 4. 홍 점수 이렇게 순차적으로 값을 타이머를 통해 보내는 것을 count하기 위한 변수 
int num1;//홍 점수 10의 자리 값
int num2;//홍 점수 1의 자리 값
int num3;//청 점수 10의 자리 값
int num4;//청 점수 1의 자리 값
SoftwareSerial BTSerial(5,4);//블루투스 uart 핀 설정
 
 
void setup()
 
{
 
  display.setBrightness(15);// TM1637 FND의 모듈 밝기 최대로 설정 -> 이것을 생략하면 출력된 값이 보이지 않음
  Serial.begin(9600);//통신 속도 설정
  BTSerial.begin(9600);//블루투스 통신 속도 설정
 for(int i = 0; i < 4; i++)
  {
    pinMode(digit_select_pin[i], OUTPUT);
  }
  // 여러 7-세그먼트 제어 핀을 출력으로 설정
  for(int i = 0; i < 8; i++)
  {
    pinMode(segment_pin[i], OUTPUT);
  }
  //7-세그먼트 내부 핀(a~h) 출력으로 설정
}
void show_digit(int pos, int number)
{
  for(int i = 0; i < 4; i++)
  {
    if(i+1 ==pos)
      //해당 자릿수의 선택 핀만 HIGH로 설정
      digitalWrite(digit_select_pin[i], HIGH);
    else
      //나머지 자리는 LOW로 설정
      digitalWrite(digit_select_pin[i], LOW);
  }
  // 8개 세그먼트 제어
  for(int i = 0; i < 8; i++)
  {
    byte segment_data = (digits_data[number] 
    & (0x01 << i)) >> i;
    if(segment_data == 1)
      digitalWrite(segment_pin[7-i], HIGH); //해당하는 a~h 값 불이 꺼짐
    else
      digitalWrite(segment_pin[7-i], LOW);//해당하는 a~h 값 불이 켜짐
  }
}
 
void loop()
 
{
  
  
 if (BTSerial.available()) //블루투스로 값이 들어오면
 {
 
 int tosend = (int)BTSerial.read();//들어온 값을 읽어서 int 타입으로 형 변환한 후 값을 tosend에 넣음
 
 count++;
  if( count ==4){
   count=0; //count 초기화=> 다시 4번 값이 들어오는지 count 하기 위함
   red = tosend;  //4번째 홍 점수 값 red변수에 담기
  num1= red/10; //red 점수 10의 자리
    num2= red%10; //red 점수 1의 자리
    Serial.print("blueS = "); // serial로 들어온 값을 확인하기 위한 코드
    Serial.println(blueS);  // serial로 들어온 값을 확인하기 위한 코드
    Serial.print("redS = ");  // serial로 들어온 값을 확인하기 위한 코드
    Serial.println(redS); // serial로 들어온 값을 확인하기 위한 코드
    Serial.print("blue = ");  // serial로 들어온 값을 확인하기 위한 코드
    Serial.println(blue); // serial로 들어온 값을 확인하기 위한 코드
    Serial.print("red = "); // serial로 들어온 값을 확인하기 위한 코드
    Serial.println(red);  // serial로 들어온 값을 확인하기 위한 코드
  }else if(count ==1){
    blueS= tosend;  //1번째 값인 청 세트 값을 blueS에 담기
  }else if(count==2){
    redS = tosend;//2번째 값인 홍 세트 값을 redS에 담기
  }else if(count==3){
    blue= tosend; //3번째 값인 청 점수 값을 blue에 담기
     num3 = blue/10;  //blue 점수 10의 자리
     num4 = blue%10;  //blue 점수 1의 자리
  }
 
 }else{
   data[0] =display.encodeDigit(blueS/10); //TM1637 FND의 왼쪽부터 첫번째 7-segment에 표시할 청 세트의 10의 자리 값 넣기
   data[1] =0x80 | display.encodeDigit(blueS%10); //TM1637 FND의 왼쪽부터 두번째 7-segment에 표시할 청 세트의 1의 자리 값 넣기
   data[2] = display.encodeDigit(redS/10);//TM1637 FND의 왼쪽부터 세번째 7-segment에 표시할 홍 세트의  10의 자리 값 넣기
   data[3] = display.encodeDigit(redS%10); //TM1637 FND의 왼쪽부터 네번째 7-segment에 표시할 홍 세트의 1의 자리 값 넣기
   display.setSegments(data); //세트 수를 담은 리스트 data값을 display.setSegments 함수에 넣어서 TM1637 FND에 출력
   show_digit(1,num3);//num3에 담긴 청 점수 10의 자리 값 anode Fnd에 출력 (Fnd의 왼쪽부터 첫번째에 표시)
   delay(5);
    show_digit(2,num4);//num4에 담긴 청 점수 1의 자리 값 anode Fnd에 출력(Fnd의 왼쪽부터 두번째에 표시)
    delay(5);
     show_digit(3,num1);//num1에 담긴 홍 점수 10의 자리 값 anode Fnd에 출력(Fnd의 왼쪽부터 세번째에 표시)
     delay(5);
   show_digit(4,num2);//num2에 담긴 홍 점수 1의 자리 값 anode Fnd에 출력(Fnd의 왼쪽부터 네번째에 표시)
   delay(5);
 }
 
  }

 

<앱인벤터 블럭 코드>

 

<최종 구동 영상>