Proyek ini menggunakan IC (integrated circuits) shift register8 bit binary counter untuk mengatur LEDs menampilkan binary counter. Dengan menggunakan IC, kita dapat mengatur 8 buah LED dengan menggunakan 3 output pin Arduino.
Komponen
- 1 x 74HC595 Shift Register IC
- 8 x 560Ω Resistors*
- 8 x 5mm LEDs
- 0.1uF Capacitor
Perhatian: hubungkan daya 5V dari Arduino di jalur bawah dibagian bawah breadboard dan ground di jalur atasnya. Lalu hubungkan dengan kabel dari bagian bawah breadboard ke bagian atas breadboard (lihat gambar).
Untuk mencari pin 1 dari chip, ditunjukan dengan titik bulat (dimple) pada sisi kiri bawah. Pin 1 dibawah dimple tersebut dan pin 8 ada di kanan bawah, pin 9 di kanan atas, and pin 16 di kiri atas.
Pasang kabel untuk menghubungkan pins 10 dan 16 ke sumber daya 5V , untuk ground hubungkan ke pins 8 dan 13.
Hubungkan kabel untuk digital pin 8 dengan pin 12 pada IC. Digital pin 12 ke pin 11 pada IC, dan dari digital pin 11 ke pin 14 pada IC.
Gunakan resistor 560Ω pada LED, hubungkan katoda LED dengan ground. Anoda pada LED 1 hubungkan dengan pin 15 pada IC. Dan untuk anoda LED 2 sampai 8 hubungkan dengan pin 1 sampai 7 pada IC.
Kita perlu melakukan bypass kapasitor (decoupling capacitor). Pastikan rating voltage lebih tinggi dibandingkan voltage yang digunakan. Pastikan kapasitor sedekat mungkin dengan chip. Manfaat dari kapasitor ini untuk mengurangi efek electrical noise pada rangkaian.
Setelah rangkaian selesai, masukan Arduino sketch.

Sketch
int latchPin = 8; //Pin connected to Pin 12 of 74HC595 (Latch)
int clockPin = 12; //Pin connected to Pin 11 of 74HC595 (Clock)
int dataPin = 11; //Pin connected to Pin 14 of 74HC595 (Data)
void setup() {
//set pins to output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
//count from 0 to 255
for (int i = 0; i < 256; i++) {
shiftDataOut(i);
//set latchPin low then high to send data out
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
void shiftDataOut(byte dataOut) {
// Shift out 8 bits LSB first, clocking each with a rising edge of the clock line
boolean pinState;
for (int i=0; i<=7; i++) { // for each bit in dataOut send out a bit
digitalWrite(clockPin, LOW); //set clockPin to LOW
// if the value of DataOut and (logical AND) a bitmask
// are true, set pinState to 1 (HIGH)
if ( dataOut & (1<<i) ) {
pinState = HIGH;
}
else {
pinState = LOW;
}
//sets dataPin to HIGH or LOW depending on pinState
digitalWrite(dataPin, pinState); //send bit out
digitalWrite(clockPin, HIGH);
}
digitalWrite(clockPin, LOW); //stop shifting out data
}
Penjelasan Singkat74HC595
Type 74HC595 adalah type 8-bit serial-in, serial or parallel-out shift register with output latches. Dapat mengirim data ke shift register secara serial dan ouput secara paralel. Serial berarti, 1 bit per satu waktu. Parallel berarti lebih dari 1 bits, dalam hal ini adalah 8 bits dalam satu waktu.
Ketika data dikirim ke shift registers 1 bit setiap waktu. Setiap bit akan dipush selama ada bit baru yang masuk, ketika bit ke 9 dimasukan, bit pertama tadi akan di push dari shist register dan hilang (bila kita tidak melakukan sesuatu pada data tersebut).
Ketika latch signal diubah dari LOW ke HIGH, isi dari shift registers saat ini di copy ke output latches.(Proses copy ini tidak mempengaruhi isi dari shift register).
Type shift register ini umum digunakan untuk konversi data dari serial ke paralel. Ada type lain yang masuk data pararlel, keluar serial, digunakan untuk konversi dari paralel ke serial.
Pada proyek ini, data output adalah 1s dan 0s (atau 0V dan 5V), dapat digunakan untuk menyalakan atau mematikan 8 LEDs.
Shift register pada proyek ini hanya membutuhkan 3 input dari Arduino. Output dari Arduino dan Input shift registers 74HC595595 yang dibutuhkan adalah:
| Arduino | 74HC595 | Deskripsi |
| 8 | 12 | Storage Register Clock Input |
| 11 | 14 | Serial Data Input |
| 12 | 11 | Shift Register Clock Input |
Pin 10 (master reset) dan 13 (output enable input) tidak digunakan. Kita hanya perlu set high pada pin 10 atau low pada pin 13 agar projek ini berjalan dengan baik.
Pembahasan Sketch
Pertama-tama, inisialisasi 3 variable untuk 3 pin yang akan digunakan.
int latchPin = 8; //Pin connected to Pin 12 of 74HC595 (Latch) int clockPin = 12; //Pin connected to Pin 11 of 74HC595 (Clock) int dataPin = 11; //Pin connected to Pin 14 of 74HC595 (Data)
Pada fungsi setup, atur pin ke mode output.
void setup() {
//set pins to output
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
Pada fungsi loop , lakukan counting dari 0 sampai 255. Pada setiap iterasi, latchPin di set ke LOW untuk keperluan data entry. Kemudia panggil fungsi shiftDataOut, passing nilai dari i pada for. Kemudian set latchPin ke HIGH, transfer data dari shift register ke output latches and output pins. Kemudian delay setengah second sebelum melakukan iterasi berikutnya.
void loop() {
//count from 0 to 255
for (int i = 0; i < 256; i++) {
shiftDataOut(i);
//set latchPin low then high to send data out
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
delay(1000);
}
}
Fungsi shiftDataOut menerima 1 byte (8-bit angka), yaitu angka dalam rentang 0 sampai 255. Type data byte dipilih karena hanya membutuhkan 8 bit yang dikirimkan ke shift register.
Inisialisai boolean variable pinState. Digunakan untuk menyimpan status pin ketika data dikirim.
boolean pinState;
Kita sudah siap mengirim 8 bits secara serial ke 74HC595, 1 bit per waktu Lihat loop for dibuat berulang 8 kali.
for (int i=0; i<=7; i++) {
Clock pin diatur ke LOW sebelum mengirim bit data.
digitalWrite(clockPin, LOW);
if/else statement untuk menentukan apakah pinState variable harus diset ke 1 atau 0.
if ( dataOut & (1<<i) ) {
pinState = HIGH;
}
else {
pinState = LOW;
}
Kode berikutnya melakukan digitalWrite nilai HIGH atau LOW ke data pin dan set clockPin HIGH untuk menuliskan nilai bit ke storage register.
digitalWrite(dataPin, pinState); //send bit out digitalWrite(clockPin, HIGH);
Kemudian ClockPin diset ke LOW untuk memastikan tidak ada bit lagi yang ditulis ke storage register.
digitalWrite(clockPin, LOW); //stop shifting out data