Simulasi Proteus - Papan Skor 7 Segment Menggunakan Arduino
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 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.
Gabung dalam percakapan