Simulasi Proteus - Arduino 7 Segment Counter
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:
/*
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);
}
}
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.
Gabung dalam percakapan