TP2 M3

 




Modul 3
Communication

1. Prosedur
 [Kembali]

1. Rangkai semua komponen sesuai kondisi yang dipilih
2. buat program di aplikasi arduino IDE
3. setelah selesai masukkan program ke arduino di proteus
4.  jalankan program pada simulasi dan cobakan sesuai dengan modul dan kondisi
5. Selesai

2. Hardware dan diagram blok [Kembali]
      1. Arduino Uno

      2. Seven Segment

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

Diagram Blok :


3. Rangkaian Simulasi dan Prinsip kerja [Kembali]

→ Gambar Rangkaian Sebelum Disimulasikan
                                    



→ Gambar Rangkaian Setelah Disimulasikan
                                        



PRINSIP KERJA

Ketika program dijalankan dan memasuki komponen Arduino MASTER, program akan terus berjalan dalam loop utama. Pada awal jalannya rangkaian, terjadi proses perhitungan jumlah switch yang berada dalam kondisi on. Berdasarkan kondisi ini, perintah akan dijalankan sesuai dengan situasi yang ada.

Berikut adalah penjelasan lebih lanjut:

  1. Semua Switch On: Jika semua switch berada dalam kondisi on, maka tiga LED akan dinyalakan.
  2. Lima Switch On: Jika ada lima switch on, maka LED 2-6 akan berkedip secara bergantian dengan delay yang telah diatur.
  3. Tidak Ada Switch On: Jika tidak ada switch yang aktif, maka semua LED akan tetap mati.

Bagian loop MASTER memiliki dua kondisi:

  • Kondisi A: Terjadi ketika semua switch on.
  • Kondisi B: Terjadi ketika tidak ada switch yang aktif.

Perintah dari MASTER akan dikirim ke SLAVE, yang terhubung ke output LED. Pada bagian SLAVE, LED akan diatur antara HIGH dan LOW sesuai dengan kondisi A dan B.


4. FlowChart [Kembali]

a. Listing Program 

    1. Kode Master

//Master Arduino
#include<SPI.h> //Library for SPI
int dip[] = {2,3,4,5,6,7,8,9};
int dipvalue[] = {};
void setup (){
Serial.begin(9600); //Starts Serial Communication at Baud Rate 9600
for(int i = 0; i < 8; i++){
pinMode(dip[i], INPUT);
}
SPI.begin(); //Begins the SPI commnuication
SPI.setClockDivider(SPI_CLOCK_DIV8); //Sets clock for SPI communication at 8 (16/8=2Mhz)
digitalWrite(SS,HIGH); // Setting SlaveSelect as HIGH (So master doesnt connnect with slave)
}

void loop(void) {
  byte Mastersend;
  int x = 1;
  int activeSwitches = 0; // variabel untuk menghitung jumlah saklar yang aktif

  // Membaca status saklar dan menghitung berapa yang aktif
  for (int i = 0; i < 8; i++) {
    dipvalue[i] = digitalRead(dip[i]);
    if (dipvalue[i] == HIGH) {
      x = dip[i];
      activeSwitches++;
    }
  }

  // Jika 3 saklar aktif, tampilkan counter 0-5 di digit pertama, kemudian counting 6-9 di digit kedua
  if (activeSwitches == 3) {
    // Tampilkan counter 0-5 di digit pertama
      digitalWrite(SS, LOW);
      Mastersend = 3;
      Serial.println(Mastersend);
      SPI.transfer(Mastersend);
      delay(100);
    // Lanjutkan counting dari 6-9 di digit kedua
    //for (int i = 6; i <= 9; i++) {
     // digitalWrite(SS, LOW);
     // Mastersend = i;
      //Serial.println(Mastersend);
      //SPI.transfer(Mastersend);
      //delay(100);
    }
  //}
 
  // Jika 4 saklar aktif, tampilkan counter 0-5 di digit kedua, kemudian counting 6-9 di digit pertama
  else if (activeSwitches == 4) {
    // Tampilkan counter 0-5 di digit kedua
      digitalWrite(SS, LOW);
      Mastersend = 4; // Shift 4 bit ke kiri untuk menetapkan digit kedua
      Serial.println(Mastersend);
      SPI.transfer(Mastersend);
      delay(100);
    // Lanjutkan counting dari 6-9 di digit pertama
    //for (int i = 6; i <= 9; i++) {
     // digitalWrite(SS, LOW);
     // Mastersend = i << 4; // Shift 4 bit ke kiri untuk menetapkan digit kedua
     // Serial.println(Mastersend);
      //SPI.transfer(Mastersend);
      //delay(100);
    //}
  }
}



    2. Kode Slave
#include <SPI.h>

const int segmentPins[] = {9, 8, 7, 6, 5, 4, 3, 2};
volatile boolean received = false;
volatile byte Slavereceived;
int index;
int dg1 = A1;
int dg2 = A0;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 8; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(dg1, OUTPUT);
  pinMode(dg2, OUTPUT);
  SPCR |= _BV(SPE); // Turn on SPI in Slave Mode
  SPI.attachInterrupt(); // Interrupt ON is set for SPI communication
}

ISR (SPI_STC_vect) { // Interrupt routine function
  Slavereceived = SPDR; // Value received from master is stored in variable Slavereceived
  received = true; // Sets received as True
}

void loop() {
  if (received) { // Logic to SET LED ON OR OFF depending upon the value received from master
    Serial.println(Slavereceived);
    if (Slavereceived == 3) {
      for(int i=0;i<=9;i++){
        if(i <= 5){
          digitalWrite(dg1,HIGH);
          digitalWrite(dg2,LOW);
          displayCharacter(i);
          delay (100);
        }
        else{
          digitalWrite(dg2, HIGH);
          digitalWrite(dg1,LOW);
          displayCharacter(i);
          delay (100);
        }
      }
     
    }
    else if (Slavereceived == 4) {
      for(int i=0;i<=9;i++){
        if(i <= 5){
          digitalWrite(dg1,LOW);
          digitalWrite(dg2,HIGH);
          displayCharacter(i);
          delay (100);
        }
     
        else{
          digitalWrite(dg2, LOW);
          digitalWrite(dg1, HIGH);
          displayCharacter(i);
          delay (100);
        }
      }}

      else {
      for(int i=0;i<=9;i++){
        if(i <= 5){
          digitalWrite(dg1,LOW);
          digitalWrite(dg2,HIGH);
          displayCharacter(i);
          delay (100);
        }
     
        else{
          digitalWrite(dg2, LOW);
          digitalWrite(dg1, HIGH);
          displayCharacter(i);
          delay (100);
        }
         
      }
    }
     
    }
   
    received = false; // Reset received flag
  }

void displayCharacter(int ch) {
  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
  };

  if ((ch >= 0 && ch <= 9)) {
    // Get the digit index (0-9) from the character
    int index = ch;
    // Write the pattern to the segment pins
    for (int i = 0; i < 7; i++) {
      digitalWrite(segmentPins[i], patterns[index][i]);
    }
  }
}



b. Flowchart

5. Kondisi [Kembali]
Kondisi  : 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]
Download Simulasi Rangkaian Klik disini
Download HTML Klik disini
Download Video Simulasi Klik disini
Download Datasheet ARDUINO UNO klik disini





















Komentar

Postingan populer dari blog ini

Cover

Cover uP dan uC