Simulasi Proteus - Papan Skor 7 Segment Menggunakan Arduino

arduino 7 segment score board

 
Hallo, kembali lagi untuk utak atik display 7 segment? dari pengembangan post sebelumnya terkait aplikasi counter, mari kita buat menjadi papan skor. Basic skematiknya masih sama, cm kita akan menggunakan 4 digit 7 Segment dengan penghitungan puluhan. Meningat pin I/O pada arduino(uno/nano) sangatlah terbatas, maka kita akan mengunakan metode shift register (dengan IC 74HC595)  untuk ekspansi pin I/O arduino dalam mengendalikan 3 display 7 Segment tersebut. 74HC595 adalah register geser yang bekerja pada protokol Serial IN Parallel OUT (SIPO). OK langsung saja tes di proteus.

Untuk komponen yang digunakan adalah arduino uno (lib Arduino Proteus bisa donlot disini), IC 74HC595, 7 Segment Common Anoda (CA), beberapa Resistor, dan beberapa push button. Nah untuk fiturnya adalah dua buah counter (tim 1 dan tim2), shift skor (kalau ada pindah lapang dan skor tetap), sama reset skor.  Rangkainya di proteus seperti berikut:

Arduino 7 Segment Score Board

Arduino Program  Code 

Untuk program arduinonya silahkan tinggal copas berikut. Tidak memerlukan library tambahan. Jadi bisa langsung compile dan disimulasikan.

/*
  program arduino simulasi proteus
  project: arduino 7 segment sore board
  board: arduino uno/nano, 74HC595 shift register, 7 segment CA 
*/

#include "Wire.h"

#define DATA 2
#define CLK 3
#define LATCH 4

#define S1_UP 5
#define S1_DOWN 6
#define S2_UP 7
#define S2_DOWN 8 
#define S_SHIFT 9
#define S_RESET 10
#define LED 11

//konfigurasi segment dengan hex / biner 8 bit = https://www.electrical4u.com/images/march16/1460385570.PNG
byte segment[10]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F};

byte ani_char[8]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x01,0x40};

int skor1_d1=0; //satuan
int skor1_d2=0; //puluhan
int skor2_d1=0; //satuan
int skor2_d2=0; //puluhan
int stat_blink=0;

void setup(){
  pinMode(S1_UP, INPUT);
  pinMode(S1_DOWN, INPUT);
  pinMode(S2_UP, INPUT);
  pinMode(S2_DOWN, INPUT);
  pinMode(S_SHIFT, INPUT);
  pinMode(S_RESET, INPUT);

  pinMode(LATCH, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  
  // opening animation
  int i = 0;
  while(i<8){
    i++;
    digitalWrite(LATCH, LOW);
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
    digitalWrite(LATCH, HIGH);
    delay(200);
  }
  digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
  digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
  digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
  digitalWrite(LED, HIGH);
}

void loop(){
  //display 1 counter UP
  if(digitalRead(S1_UP)== HIGH){
    skor1_d1++;
    if(skor1_d1>9){
      skor1_d1 = 0;
      skor1_d2++;
      
      if(skor1_d2>9){
        skor1_d2 = 0;        
       }
     }
  }
  
  //display 1 counter DOWN
  else if(digitalRead(S1_DOWN)== HIGH){
    skor1_d1--;
    if(skor1_d1<0){
      skor1_d1 = 9;
      skor1_d2--;
      
      if(skor1_d2<0){
        skor1_d2 = 9;        
       }
     }
  }

  //display 2 counter UP
  else if(digitalRead(S2_UP)== HIGH){
    skor2_d1++;
    if(skor2_d1>9){
      skor2_d1 = 0;
      skor2_d2++;
      
      if(skor2_d2>9){
        skor2_d2 = 0;        
       }
     }
  }

  //display 2 counter UP
  else if(digitalRead(S2_DOWN)== HIGH){
    skor2_d1--;
    if(skor2_d1<0){
      skor2_d1 = 9;
      skor2_d2--;
      
      if(skor2_d2<0){
        skor2_d2 = 9;        
       }
     }
  }
  
  else if(digitalRead(S_SHIFT)== HIGH){
    stat_blink =1;
    int tmp_skor1, tmp_skor2;
    tmp_skor1 =  skor1_d1;
    tmp_skor2 =  skor1_d2;
    skor1_d1 = skor2_d1;
    skor1_d2 = skor2_d2;
    skor2_d1 = tmp_skor1;
    skor2_d2 = tmp_skor2;
  }
  
  else if(digitalRead(S_RESET)== HIGH){
    stat_blink =1;
    skor1_d1 = 0;
    skor1_d2 = 0;
    skor2_d1 = 0;
    skor2_d2 = 0;
  }

  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor1_d1]); // display 1 digit satuan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor1_d2]); // display 1 digit puluhan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor2_d1]); // display 2 digit satuan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor2_d2]); // display 2 digit puluhan
  digitalWrite(LATCH, HIGH);

  if(stat_blink == 1){
    led_blink(2); //led blink 2 kali
    stat_blink =0;
  }
  
  delay(300); //delay dalam simulasi-sesuaikan apabila terlalu tombol responsive
 
}

void led_blink(int blink_times){
  int x = 0;
  while (x <= blink_times){
    x++;
    digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
  }
  digitalWrite(LED, HIGH);
}

Untuk penjelasan mengenai progran masih sama seperti pada simulasi counter sebelumnya. Proses untuk menampilkan data ada di baris berikut: 

  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor1_d1]); // display 1 digit satuan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor1_d2]); // display 1 digit puluhan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor2_d1]); // display 2 digit satuan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[skor2_d2]); // display 2 digit puluhan
  digitalWrite(LATCH, HIGH);

Urutan nilai yang dikirimkan adalah dari display yang paling belakang (Skor 1 - satuan). Pengisian nilai melalui variabel segment dengan nilai object dari variabel tersebut(nilai didapat dari variebel skor1_d1 ... skor2_d2). Contoh saat nilai Skor 1 digit satuan adalah 1(skor1_d1), maka nilai yang dikirimkan adalah nilai dari objek ke 1 (array) dari variabel segment yaitu 0x06 (hex) atau 00000110 (biner) dan akan menghasilkan tampilan 1 pada seven segment.

Papan Skor Arduino 7 Segment

Nah untuk hasilnya kira kira akan seperti dalam video berikut:



Untuk file Project Papan Skor 7 Segment Menggunakan Arduino silahkan dapat di download pada link berikut :