7 Mei 2015

Arduino : 4 Seven Segment +1 IC Shift Register


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
Langkah-langkah pengerjaan :
  • Rangkai Seven Segment dan IC  pada Project Board mengikuti rangkaian pada gambar berikut.








  • Hubungkan rangkaian ke Arduino Uno sesuai gambar tersebut.
    1. Pin 2 sebagai data
    2. Pin 3 sebagai clock
    3. Pin 4 Vcc 1  sebagai sumber daya seven segment digit 1 (paling kanan)
    4. Pin 5 Vcc 2 sebagai digit 2 
    5. Pin 6 Vcc 3 sebagai digit 3
    6. Pin 7 Vcc 4 sebagai digit 4
    Berikut rangkaian Seven Segment Paralel.










  • Setelah semua rangkaian di rangkai, silahkan cek dulu rangkaian seven segment dengan kode berikut.


  • --- 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 ---






    Tidak ada komentar:

    Posting Komentar