TP 2 - M3



1. Prosedur [Kembali]
1. Rangkai komponen sesuai percobaan dan kondisi yang dipilih.
2. Buat program menggunakan Arduino IDE.
3. Transfer program yang telah dibuat ke Arduino yang ada di Proteus.
4. Uji coba program di simulasi sesuai dengan kondisi yang diinginkan.
5. Proses selesai setelah uji coba berhasil dilakukan.

2. Hardware dan Diagram Blok [Kembali]

a. Hardware
 
1. Arduino Uno
 Spesifikasi:

2. Dipswitch
 
Spesifikasi:

3. 7-segment
 

b. Diagram Blok

3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
 

Prinsip Kerja
1) MASTER
Tugas utama Arduino master adalah memantau status tombol yang terhubung, mengidentifikasi tombol mana yang sedang aktif, dan mengirimkan informasi tersebut ke Arduino slave melalui koneksi SPI. Setiap kali dalam iterasi loop, Arduino master membaca status tombol dan menyimpan nilai tombol yang aktif dalam variabel `digit'. Setelah itu, nilai `digit' dikirimkan ke Arduino slave melalui koneksi SPI. Arduino master menunggu untuk jangka waktu k sebelum mengulangi proses tersebut.

Arduino master berfungsi sebagai pengendali utama yang terus-menerus memeriksa kondisi tombol. Saat sebuah tombol ditekan, Arduino master secara cepat dan efisien mendeteksinya dan mengirimkan informasi tentang tombol mana yang aktif ke Arduino slave melalui SPI. Proses ini dilakukan secara berulang dengan interval yang ditentukan, sehingga memastikan respons yang cepat dan konsisten terhadap perubahan status tombol.

2) SLAVE
Arduino slave bertugas menerima pesan dari Arduino master dan menampilkan informasi pada sebuah display segment. Kode slave ini didesain untuk menerima data melalui komunikasi Serial Peripheral Interface (SPI) dan menampilkan informasi tersebut pada display segment. Setelah melakukan inisialisasi pin dan komunikasi serial, kode mengaktifkan SPI dan menyiapkan fungsi interrupt untuk menangani data masuk. Ketika data diterima, fungsi interrupt memprosesnya dan menyalakan segmen yang sesuai pada display. Selanjutnya, dalam loop utama, kode memeriksa apakah ada data yang diterima. Jika ada, karakter tersebut diinterpretasikan ke dalam pola segmen yang sesuai dan ditampilkan pada display. Proses ini terus berulang secara kontinu.

Arduino slave berperan sebagai perangkat yang responsif dan interaktif, menerima instruksi dari Arduino master melalui SPI dan menampilkan informasi dengan jelas dan efektif pada display segment. Dengan penggunaan fungsi interrupt, Arduino slave dapat dengan cepat menanggapi data masuk tanpa mengganggu proses utama yang sedang berjalan, sehingga memberikan pengalaman pengguna yang mulus dan responsif.

 
4. Flowcharth dan Listing Program [Kembali]
a. Flowcharth

b. Listing Program
Master:
```cpp
#include <SPI.h>

// Array of pins for dip switches
int dipSwitchPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
int dipSwitchValues[8] = {}; // Array to store dip switch values
byte previousMasterSend = 255; // Initialize to a value that won't be a valid count

void setup() {
  Serial.begin(9600); // Begin serial communication
  // Set all dip switch pins as input with pull-up resistors enabled
  for (int i = 0; i < 8; i++) {
    pinMode(dipSwitchPins[i], INPUT_PULLUP);
  }
  SPI.begin(); // Initialize SPI communication
  SPI.setClockDivider(SPI_CLOCK_DIV8); // Set SPI clock divider
  digitalWrite(SS, HIGH); // Set Slave Select pin to HIGH
}

void loop() {
  byte masterSend = 0; // Variable to store count of active dip switches
  int activeSwitchCount = 0; // Variable to count active dip switches
  
  // Read status of dip switches
  for (int i = 0; i < 8; i++) {
    dipSwitchValues[i] = digitalRead(dipSwitchPins[i]);
    if (dipSwitchValues[i] == LOW) {
      activeSwitchCount++; // Increment count if switch is active
    }
  }
  
  masterSend = activeSwitchCount; // Assign count to variable to be sent to master
  
  // Check if count has changed since last transmission
  if (masterSend != previousMasterSend) {
    digitalWrite(SS, LOW); // Set Slave Select pin to LOW to begin SPI communication
    SPI.transfer(masterSend); // Send count to master
    previousMasterSend = masterSend; // Update previous count
    Serial.println(masterSend); // Print count to serial monitor
  }
  
  delay(1000); // Delay before next iteration
}
```
SLAVE:
```cpp
#include <SPI.h>

// Array of pins for the display segments
const int segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2};
volatile boolean dataReceived = false; // Flag to indicate data reception
volatile byte previousSlaveReceived = 255; // Initialize to a value that won't be a valid character

void setup() {
  Serial.begin(9600); // Begin serial communication
  // Set all segment pins as output
  for (int i = 0; i < 8; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  // Enable SPI and attach interrupt
  SPCR |= _BV(SPE); // Enable SPI
  SPI.attachInterrupt(); // Attach interrupt for SPI communication
}

// Interrupt service routine for SPI communication
ISR (SPI_STC_vect) {
  byte slaveReceived = SPDR; // Read received data from SPI data register
  if (slaveReceived != previousSlaveReceived) {
    dataReceived = true; // Set flag to indicate data reception
    previousSlaveReceived = slaveReceived; // Update previous received data
  }
}

void loop() {
  // Check if new data has been received
  if (dataReceived) {
    displayCharacter(previousSlaveReceived); // Display the received character
    delay(1000); // Delay for 1 second
    dataReceived = false; // Reset flag after displaying character
  }
}

// Function to display character on segment display
void displayCharacter(int ch) {
  // Define patterns for each digit
  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
  };

  // Check if the character is within the valid range
  if (ch >= 0 && ch <= 8) {
    int index = ch; // Get the digit index (0-9) from the character
    // Write the pattern to the segment pins
    for (int i = 0; i < 7; i++) {
      digitalWrite(segmentPins[i], patterns[index][i]);
    }
  }
}
```
 
5. Kondisi [Kembali]
Percobaan 2 Kondisi 5
Setiap 1 Switch aktif muncul angka sesuai jumlah switch yang aktif pada digit 1
 
6. Video Simulasi [Kembali]



7. Download File [Kembali]

HTML klik disini  
Simulasi  klik disini
Gambar Simulasi  klik disini 
Video Simulasi  klik disini 
Listing Program klik disini
Datasheet Arduino klik disini
Datasheet Dipswitch klik disini
Datasheet 7-SEGMENT klik disini