Tugas Pendahuluan 2




Tugas Pendahuluan 2 Modul 3
(Percobaan 2 Kondisi 3)

1. Prosedur
[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Tulis program untuk arduino di software Arduino IDE.
3. Compile program tadi, lalu upload ke dalam arduino.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.

2. Hardware dan Diagram Blok [Kembali]

Hardware :

  1. Arduino Uno

      2. Seven Segment

      4. Resistor
      5. Power Supply
      6. Ground
      7. Dipswitch

Diagram Blok:



3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi :



Prinsip Kerja :

Rangkaian Percobaan 2 Kondisi 3 yang diimplementasikan terdiri dari dua bagian: Master dan Slave.

Master Arduino bertanggung jawab atas pengendalian beberapa saklar dan mengirimkan data berdasarkan status saklar tersebut ke Slave Arduino melalui komunikasi SPI (Serial Peripheral Interface). Setiap saklar terhubung ke pin input digital pada Master Arduino. Ketika program dijalankan, Master Arduino membaca status saklar dan menghitung berapa banyak saklar yang aktif. Jika jumlah saklar aktif adalah 3, Master Arduino akan mengirimkan data '3' ke Slave Arduino. Jika jumlah saklar aktif adalah 4, maka akan dikirimkan data '4'. Dalam hal lain, tidak ada data yang dikirimkan.

Slave Arduino bertanggung jawab menerima data yang dikirimkan oleh Master Arduino melalui SPI. Setelah menerima data, Slave Arduino akan menampilkan angka dari 0 hingga 9 secara berurutan pada dua digit LCD, dimulai dari digit pertama hingga digit kedua, atau sebaliknya, tergantung pada data yang diterima. Misalnya, jika Slave menerima data '3' dari Master, maka akan menampilkan angka dari 0 hingga 5 di digit pertama, lalu melanjutkan dengan menampilkan angka dari 6 hingga 9 di digit kedua. Jika Slave menerima data '4', maka urutan ditukar, dengan menampilkan angka dari 0 hingga 5 di digit kedua terlebih dahulu, kemudian menampilkan angka dari 6 hingga 9 di digit pertama. Jika tidak ada data yang diterima, Slave akan menampilkan angka dari 0 hingga 9 secara bergantian di kedua digit LCD. Proses ini berulang terus menerus, sehingga angka di layar LCD akan terus berubah sesuai dengan data yang diterima dari Master Arduino melalui SPI.
 

4. Flowchart dan Listing Program [Kembali]

Flowchart :



Listing Program :

Master
// Library yang diperlukan
#include<SPI.h> //Library untuk SPI

// Inisialisasi pin untuk dip switch
int dip[] = {2, 3, 4, 5, 6, 7, 8, 9};
int dipvalue[] = {}; // Array untuk menyimpan nilai dari dip switch

// Inisialisasi program
void setup (){
  Serial.begin(9600); // Memulai komunikasi serial pada baud rate 9600
  for(int i = 0; i < 8; i++){
    pinMode(dip[i], INPUT_PULLUP); // Mengatur semua pin dip switch sebagai input dengan pull-up resistor
  }
  SPI.begin(); // Memulai komunikasi SPI
  SPI.setClockDivider(SPI_CLOCK_DIV8); // Mengatur pembagian clock untuk komunikasi SPI menjadi 8 (16/8=2Mhz)
  digitalWrite(SS, HIGH); // Menetapkan SlaveSelect sebagai HIGH (Agar master tidak terhubung dengan slave)
}

// Loop utama program
void loop(void) {
  byte Mastersend; // Variabel untuk menyimpan data yang akan dikirim melalui SPI
  int x = 1; // Variabel untuk menyimpan nilai dip switch yang aktif
  int activeSwitches = 0; // Variabel untuk menghitung jumlah dip switch yang aktif

  // Membaca status dari setiap dip switch dan menghitung jumlah yang aktif
  for (int i = 0; i < 8; i++) {
    dipvalue[i] = digitalRead(dip[i]); // Membaca status dari dip switch
    if (dipvalue[i] == LOW) { // Jika dip switch aktif (dalam kondisi LOW)
      x = dip[i]; // Menyimpan nilai dip switch yang aktif
      activeSwitches++; // Meningkatkan jumlah dip switch yang aktif
    }
  }

  // Jika terdapat 3 dip switch yang aktif
  if (activeSwitches == 3) {
    // Tampilkan counter 0-5 di digit pertama
    digitalWrite(SS, LOW); // Aktifkan SPI dengan menurunkan SlaveSelect menjadi LOW
    Mastersend = 3; // Kirim data untuk menampilkan counter 0-5 di digit pertama
    Serial.println(Mastersend); // Tampilkan data yang dikirim melalui Serial Monitor
    SPI.transfer(Mastersend); // Kirim data melalui SPI
    delay(100); // Beri jeda 100 milidetik
  }
  
  // Jika terdapat 4 dip switch yang aktif
  else if (activeSwitches == 4) {
    // Tampilkan counter 0-5 di digit kedua
    digitalWrite(SS, LOW); // Aktifkan SPI dengan menurunkan SlaveSelect menjadi LOW
    Mastersend = 4; // Kirim data untuk menampilkan counter 0-5 di digit kedua
    Serial.println(Mastersend); // Tampilkan data yang dikirim melalui Serial Monitor
    SPI.transfer(Mastersend); // Kirim data melalui SPI
    delay(100); // Beri jeda 100 milidetik
  }
}

Slave

// Library yang diperlukan
#include <SPI.h>

// Pin-pin untuk menyalakan segment LCD
const int segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2};
// Variabel untuk menandai apakah data sudah diterima dari master
volatile boolean received = false;
// Variabel untuk menyimpan data yang diterima dari master
volatile byte Slavereceived;
// Variabel untuk indeks
int index;
// Pin untuk menyalakan digit 1 dan digit 2 pada LCD
int dg1 = A1;
int dg2 = A0;

// Setup program
void setup() {
  Serial.begin(9600); // Mulai komunikasi serial pada baud rate 9600
  // Konfigurasi pin-pin segment LCD sebagai output
  for (int i = 0; i < 8; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  // Konfigurasi pin digit sebagai output
  pinMode(dg1, OUTPUT);
  pinMode(dg2, OUTPUT);
  // Mengaktifkan SPI dalam mode Slave
  SPCR |= _BV(SPE);
  // Mengaktifkan interupsi untuk komunikasi SPI
  SPI.attachInterrupt();
}

// Fungsi interupsi SPI
ISR (SPI_STC_vect) {
  // Menyimpan nilai yang diterima dari master
  Slavereceived = SPDR;
  // Menandai bahwa data sudah diterima
  received = true;
}

// Loop utama program
void loop() {
  // Jika data sudah diterima dari master
  if (received) {
    Serial.println(Slavereceived); // Tampilkan data yang diterima melalui Serial Monitor
    // Logika untuk menyalakan LED tergantung pada nilai yang diterima dari master
    if (Slavereceived == 3) {
      // Tampilkan counter 0-5 di digit pertama
      for(int i=0; i<=9; i++){
        if(i <= 5){
          digitalWrite(dg1, HIGH);
          digitalWrite(dg2, LOW);
          displayCharacter(i); // Tampilkan karakter pada segment LCD
          delay(100); // Beri jeda 100 milidetik
        }
        else{
          digitalWrite(dg2, HIGH);
          digitalWrite(dg1, LOW);
          displayCharacter(i); // Tampilkan karakter pada segment LCD
          delay(100); // Beri jeda 100 milidetik
        }
      }
    }
    else if (Slavereceived == 4) {
      // Tampilkan counter 0-5 di digit kedua
      for(int i=0; i<=9; i++){
        if(i <= 5){
          digitalWrite(dg1, LOW);
          digitalWrite(dg2, HIGH);
          displayCharacter(i); // Tampilkan karakter pada segment LCD
          delay(100); // Beri jeda 100 milidetik
        }
        else{
          digitalWrite(dg2, LOW);
          digitalWrite(dg1, HIGH);
          displayCharacter(i); // Tampilkan karakter pada segment LCD
          delay(100); // Beri jeda 100 milidetik
        }
      }
    }
    else {
      // Tampilkan counter 0-5 di digit kedua
      for(int i=0; i<=9; i++){
        if(i <= 5){
          digitalWrite(dg1, LOW);
          digitalWrite(dg2, HIGH);
          displayCharacter(i); // Tampilkan karakter pada segment LCD
          delay(100); // Beri jeda 100 milidetik
        }
        else{
          digitalWrite(dg2, LOW);
          digitalWrite(dg1, HIGH);
          displayCharacter(i); // Tampilkan karakter pada segment LCD
          delay(100); // Beri jeda 100 milidetik
        }
      }
    }
    received = false; // Reset flag received
  }
}

// Fungsi untuk menampilkan karakter pada segment LCD
void displayCharacter(int ch) {
  // Matriks untuk menampilkan karakter pada segment LCD
  byte patterns[10][7] = {
    {0, 0, 0, 0, 0, 0, 1}, // 0
    {1, 0, 0, 1, 1, 1, 1}, // 1
    {0, 0, 1, 0, 0, 1, 0}, // 2
    {0, 0, 0, 0, 1, 1, 0}, // 3
    {1, 0, 0, 1, 1, 0, 0}, // 4
    {0, 1, 0, 0, 1, 0, 0}, // 5
    {0, 1, 0, 0, 0, 0, 0}, // 6
    {0, 0, 0, 1, 1, 1, 1}, // 7
    {0, 0, 0, 0, 0, 0, 0}, // 8
    {0, 0, 0, 0, 1, 0, 0}  // 9
  };

  // Jika nilai ch berada di antara 0 dan 9
  if ((ch >= 0 && ch <= 9)) {
    int index = ch; // Dapatkan indeks digit (0-9) dari karakter
    // Tampilkan pola pada pin-pins segment LCD
    for (int i


5. Kondisi [Kembali]

Percobaan 2 Kondisi 3
Jika 3 Switch aktif maka counting 0 - 5 pada digit 1 dan 6 - 9 pada digit 2, Jika 4 Switch aktif maka counting 0 - 5 pada digit 2 dan 6 - 9 pada digit 1


6. Video Simulasi [Kembali]



7. Download File [Kembali]

File Rangkaian klik disini
Video Percobaan klik disini
Listing Program klik disini.
Datasheet Arduino klik disini
Datasheet DIP Switch klik disini
Datasheet Seven Segment klik disini




















BAHAN PRESENTASI MATA KULIAH JURUSAN TEKNIK ELEKTRO