Tutorial Shift Register yang dimpementasikan pada Seven Segment 4 digit
Selamat berkunjung sahabat blogger, kali ini saya akan berbagi cara membuat countdown dengan menggabungkan 4 Seven Segment dengan 1 IC Shift Reigster 76HC164. Saya senang sekali berbagi ilmu ini, mungkin bagi anda hal ini sangat bermanfaat.
Arduino Uno, itulah nama dari sebuah produk hardware yang bisa anda otak atik program yang ada di dalamnya sesuai denga keinginan anda. Disini saya pakai Arduino Uno untuk mengiplentasikan sistem Countdown ini.
Alat dan Bahan yang harus di persiapkan :
- Arduino Uno 1x
- IC 74HC164 1x
- Resistor 330 ohm 4x
- Seven Segment Anode/Katode 4x (Pada tutorial ini saya menggunakan Anode Seven Segment)
- Jumper
- Project Board(Bread Board)
- Laptop/PC yang sudah terinstal IDE Arduino
- Rangkai Seven Segment dan IC pada Project Board mengikuti rangkaian pada gambar berikut.
- Pin 2 sebagai data
- Pin 3 sebagai clock
- Pin 4 Vcc 1 sebagai sumber daya seven segment digit 1 (paling kanan)
- Pin 5 Vcc 2 sebagai digit 2
- Pin 6 Vcc 3 sebagai digit 3
- Pin 7 Vcc 4 sebagai digit 4
--- Code Test Seven Segment -----
//---------------------------------------//
// ----------===[ KEBUN IT]===-----------//
// --=[ Contact : kebunit@gmail.com ]=-- //
//---------------------------------------//
// for Anode Seven Segment
#define ON HIGH
#define OFF LOW
// for Cathode Seven Segment
//#define ON LOW
//#define OFF HIGH
// definisi port yang di pakai
#define data 2
#define clock 3
#define D1 4
#define D2 5
#define D3 6
#define D4 7
void setup() {
pinMode(data,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(D1,OUTPUT);
pinMode(D2,OUTPUT);
pinMode(D3,OUTPUT);
pinMode(D4,OUTPUT);
Serial.begin(9600);
}
// Angka 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 pada Shift Register
byte segment[]={B11000000,B01111001,B0100100,
B0110000,B0011001,B0010010,
B0000010,B01111000,B0000000,B0010000};
void loop(){
for (int i = 0; i < 100000; i++){
for (int j = 0; j <=9;j++){
shiftOut(data, clock, MSBFIRST, segment[j]); // menampilkan angka 0 sampai 9
digitalWrite(D1, ON);
digitalWrite(D2, ON);
digitalWrite(D3, ON);
digitalWrite(D4, ON);
delay(1000);
}
}
}
jika code tersebut sudah berjalan sesuai keinginan. Maka selanjutnya kita akan membuat kode untuk countdown. Pada kode di atas, semua seven segment masih hidup dan menampilkan angka yang sama untuk setiap digit. Bagaimana cara agar tiap digit bisa menghasikan kombinasi angka yang kita inginkan? jawabannya adalah dengan membuat delay sendiri.
Sistem Arduino mereprensentasikan sebuah rekursif yang terus berjalan (Infinite Loop). Kemudian Shift Register berfungsi untuk memotong arus untuk di nyalakan pada setiap pin output secara bergantian mulai dari Q0 sampai Q7. Secara logika kita tidak mungkin mengunakan delay yang lama untuk membuat sebuah countdown. Oleh karena itu, Kita bisa membuat delay manual sesuai keinginan kita. Yaitu dengan memakai salah satu operator handal yaitu % (Modulo). Modulo merupakan operator yang digunakan untuk menentukan sisa dari sebuah hasil pembagian angka.
Modulo berfungsi untuk memecah delay manual buatan sendiri yang dibuat pada masing-masing digit. Sehingga setiap digit berjalan sebagai angka satuan, puluhan, ratusan, dan ribuan. Dengan demikian, kita bisa melakukan perhitungan angka yang ingin kita keluarkan.
Sistem rangkaian ini mensimulasikan penggunaan countdown yang di mulai dari sebuah angka yang mempunyai maksimal 4 digit angka dan minimal 0. Ketika sudah mencapai angka nol (0000), maka angka nol tersebut akan delay beberapa saat setelah itu akan di lakukan countdown kembali dari angka yang telah ditetapkan angka .
Berikut kode Countdown dalam detik.
//---------------------------------------//
// ----------===[ KEBUN IT]===-----------//
// --=[ Contact : kebunit@gmail.com ]=-- //
//---------------------------------------//
// for Anode Seven Segment
#define ON HIGH
#define OFF LOW
// for Cathode Seven Segment
#define ON HIGH
#define OFF LOW
#define data 2
#define clock 3
#define D1 4
#define D2 5
#define D3 6
#define D4 7
void setup() {
pinMode(data,OUTPUT);
pinMode(clock,OUTPUT);
pinMode(D1,OUTPUT);
pinMode(D2,OUTPUT);
pinMode(D3,OUTPUT);
pinMode(D4,OUTPUT);
Serial.begin(9600);
}
// digit 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
byte segment[]={B11000000,B01111001,B0100100,
B0110000,B0011001,B0010010,
B0000010,B01111000,B0000000,B0010000};
// Set angka yang anda inginkan berdasarkan digit
// contoh Countdown dimulai dari 1000
int angka1 = 0; // angka satuan
int angka2 = 0; // angka puluhan
int angka3 = 0; // angka ratusan
int angka4 = 1; // angka ribuan
int digit1 = 0, a = angka1;
int digit2 = 0, b = angka2;
int digit3 = 0, c = angka3;
int digit4 = 0, d = angka4;
int pembatas = 0;
bool berhenti = true;
void loop(){
hitungMundur();
}
void hitungMundur(){
digit1--;
digit2--;
digit3--;
digit4--;
if ((a == angka1)&& (b == angka2 ) && (c == angka3) && (d == angka4)){
for (int x =0 ; x < 200;x++){
Number(1,angka1);
clearLED();
Number(2,angka2);
clearLED();
Number(3,angka3);
clearLED();
Number(4,angka4);
clearLED();
}
c = angka3-1;
berhenti = false;
Serial.println("Tampilan pertama timer dalam detik");
}
// delay angka satuan
if (digit1 % 10 == 0) {
a--;
Serial.println("==>> digit1");
clearLED();
}
if (digit1 < 0){
digit1 = 100;
a = 9;
Serial.println("=========>> digit2");
}
// delay angka puluhan
if (digit2 % 100 == 0) {
b--;
clearLED();
}
if (digit2 < 0){
digit2 = 1000;
b = 9;
Serial.println("===================>> digit3 ");
}
// delay angka ratusan
if (digit3 % 1000 == 0) {
c--;
clearLED();
}
if ((digit3 < 0)&&(c < 0)){
pembatas++;
digit3 = 1000;
c = 9;
Serial.println("==========================================>> digit4");
d--; // untuk angka ribuan (digit ke-4)
if (d < 0) {
d = 0;
}
}
Number(1,a);
clearLED();
Number(2,b);
clearLED();
Number(3,c);
clearLED();
Number(4,d);
clearLED();
// delay ketika |0|0|0|0|
if ((c == 0)&&(d == 0) &&(b == 0 ) && (a == 0)){
Serial.println("Delay untuk angka |0|0|0|0| ");
for (int y = 0; y < 500; y++){
Number(1,a);
clearLED();
Number(2,b);
clearLED();
Number(3,c);
clearLED();
Number(4,d);
clearLED();
}
c = angka3;
d = angka4;
b = angka2;
a = angka1;
digit1 = 0;
digit2 = 0;
digit3 = 0;
digit4 = 0;
berhenti = true;
}
}
void clearLED(){
delay(3); // Untuk setting kecepatan detik, tinggal kurangi atau tambahi nilai delay-nya
digitalWrite(D1,OFF);
digitalWrite(D2,OFF);
digitalWrite(D3,OFF);
digitalWrite(D4,OFF);
}
void Number(int digit,int angka){
switch (digit) {
case 1:
digitalWrite(D1,ON);
break;
case 2:
digitalWrite(D2,ON);
break;
case 3:
digitalWrite(D3,ON);
break;
case 4:
digitalWrite(D4,ON);
break;
}
switch (angka){
case 0:
shiftOut(data, clock, MSBFIRST, segment[0]);
break;
case 1:
shiftOut(data, clock, MSBFIRST, segment[1]);
break;
case 2:
shiftOut(data, clock, MSBFIRST, segment[2]);
break;
case 3:
shiftOut(data, clock, MSBFIRST, segment[3]);
break;
case 4:
shiftOut(data, clock, MSBFIRST, segment[4]);
break;
case 5:
shiftOut(data, clock, MSBFIRST, segment[5]);
break;
case 6:
shiftOut(data, clock, MSBFIRST, segment[6]);
break;
case 7:
shiftOut(data, clock, MSBFIRST, segment[7]);
break;
case 8:
shiftOut(data, clock, MSBFIRST, segment[8]);
break;
case 9:
shiftOut(data, clock, MSBFIRST, segment[9]);
break;
}
}
Untuk melihat log activity program, Anda bisa langsung membuka menu pada IDE Arduino. Yaitu Tools -> Serial Monitor atau bisa pake shortkey Ctrl+Shift+M. Anda bisa melihat hasil Looping program yang sedang berjalan.
Semoga tutorial di atas bermanfaat untuk anda yang memanfaatkan kode di atas untuk sebuah kebaikan yang berarti.
Cintai negerimu dengan mencintai hal kecil dalam hidupmu. Mulai dengan berbagi ilmu, bukan maksud untuk menggurui. Namun apalah daya diriku hanyalah mahluk ciptaan Tuhan yang hanya ingin berbagi sesuatu hal yang sederhana. Disinilah aku berbagi kepada kalian wahai generasi penerus bangsa.
--- Kebahagianku ketika aku bisa berbagi kepada mereka yang membutuhkan ---