Simulasi Proteus - Arduino 7 Segment Counter

Arduino 7 Segment Counter

nomor antrian 7 segment arduino

Halo teman-teman, nah kali ini ada simulasi buat kalian yang sedang mencoba utak-atik display 7 segment. Walaupun display 7 Segment merupakan display untuk character terbatas, tapi display ini gak ada lawannya kalau menyangkut tampilan angka. Untuk simulasi kali ini adalah aplikasi counter UP / counter Down yang akan ditampilkan dalam 3 digit angka yang otomatis menggunakan 3 display 7 Segment. 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 bisa donlot disini), IC 74HC595, 7 Segment Common Anoda (CA), beberapa Resistor, dan beberapa push button. Rangkainya seperti berikut:

Counter 7 Segmen dengan arduino

Arduino 7 Segment Counter

Arduino Code Program
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 COUNTER UP / DOWN
  board: arduino uno/nano, 74HC595 shift register, 7 segment CA 
*/

#include "Wire.h"

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

#define S_UP 5
#define S_DOWN 6
#define S_RESET 7

//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 nilai_satuan=0; //satuan
int nilai_puluhan=0; //puluhan
int nilai_ratusan=0; //ratusan

int  stat_blink =0;

void setup(){
  pinMode(S_UP, INPUT);
  pinMode(S_DOWN, INPUT);
  pinMode(S_RESET, INPUT);

  pinMode(LATCH, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  
  disp_seg_init();

}

void loop(){
  // counter UP
  if(digitalRead(S_UP)== HIGH){
    nilai_satuan++;
    if(nilai_satuan > 9){
      nilai_satuan = 0;
      nilai_puluhan++;
      
      if(nilai_puluhan > 9){
        nilai_puluhan = 0;  
         nilai_ratusan++;  
          
         if( nilai_ratusan > 9){ 
           nilai_ratusan=0;       
         }   
       }
       
     }
  }

  else if(digitalRead(S_DOWN)== HIGH){
    nilai_satuan--;
    if(nilai_satuan < 0){
      nilai_satuan = 9;
      nilai_puluhan--;
      
      if(nilai_puluhan < 0){
        nilai_puluhan = 9;  
        nilai_ratusan--;  
          
         if( nilai_ratusan < 0){ 
           nilai_ratusan=9;       
         }   
       }
       
     }
  }
  
  else if(digitalRead(S_RESET)== HIGH){
    stat_blink =1;
    nilai_ratusan = 0;
    nilai_puluhan = 0;
    nilai_satuan = 0;
  }

  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLK, MSBFIRST, ~segment[nilai_satuan]); // digit satuan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[nilai_puluhan]); // digit puluhan
  shiftOut(DATA, CLK, MSBFIRST, ~segment[nilai_ratusan]); // digit ratusan
  digitalWrite(LATCH, HIGH);

  if(stat_blink == 1){
    disp_seg_init();
    stat_blink =0;
  }
  
  delay(300); //delay dalam simulasi
 
}

void disp_seg_init(){
  // 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);
  }
}



Sedikit penjelasan mengenai progran ya teman-teman. Proses untuk menampilkan data ada di baris berikut: 
digitalWrite(LATCH, LOW); 
shiftOut(DATA, CLK, MSBFIRST, ~segment[nilai_satuan]); // digit satuan 
shiftOut(DATA, CLK, MSBFIRST, ~segment[nilai_puluhan]); // digit puluhan 
shiftOut(DATA, CLK, MSBFIRST, ~segment[nilai_ratusan]); // digit ratusan 
digitalWrite(LATCH, HIGH);

urutan nilai yang dikirimkan adalah dari display yang paling belakang (satuan). Pengisian nilai melalui variabel segment dengan nilai object dari variabel tersebut. contoh saat nilai satuan adalah 1, 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.

Sama halnya pada fungsi disp_seg_init(), variable ani_char hanya terdiri dari satu segment yang dapat di desain dengan bilangan hexa seperti tabel diatas.  

Untuk file Project silahkan dapat di download pada link berikut :