Percobaan 2 Kondisi 6
Komunikasi SPI Menggunakan Arduino
1. Prosedur
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. 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
Hardware :
1.Arduino Uno
2.Dipswitch
3.Seven Segment 2 Digit
4.Resistor
Diagram Blok :
Rangkaian Simulasi :
Prinsip Kerja :
Pada arduino master bertugas untuk pembacaan kondisi tombol dan pengiriman pesan ke Arduino slave berdasarkan kondisi tersebut. Dalam setiap iterasi loop, Arduino master membaca status tombol-tombol yang terhubung, mengidentifikasi dua tombol yang aktif, dan mengirimkan dua digit yang berbeda ke Arduino slave melalui SPI (Serial Peripheral Interface). Ketika dua tombol dipilih, nilai dari tombol-tombol tersebut disimpan di variabel digit1 dan digit2. Setelah itu, Arduino master mengirimkan kedua digit tersebut ke slave melalui koneksi SPI. Arduino master kemudian menunggu selama satu detik sebelum mengulangi proses tersebut.
Pada arduino slave bertugas untuk penerimaan pesan dari Arduino master dan menampilkan dua digit yang diterima secara bergantian pada display. Ketika Arduino slave menerima pesan dari master melalui koneksi SPI, ISR (Interrupt Service Routine) akan diaktifkan. Di dalam ISR, slave menerima dua byte secara berurutan dari master dan menyimpannya di variabel Slavereceived1 dan Slavereceived2. Selanjutnya, di dalam loop, slave memanggil fungsi displayCharacter() dengan dua nilai yang diterima dari master untuk menampilkan dua digit secara bergantian pada display. Setelah menampilkan digit pertama, slave menunggu sebentar sebelum menampilkan digit kedua. Proses ini terus berlanjut, sehingga display pada slave akan menampilkan dua digit yang dikirim dari master secara bergantian saat dua tombol aktif pada master.
4. Flowchart dan Listing Program
Flowchart :
Listing Program :
Master
#include <SPI.h> // Mengimpor library SPI untuk komunikasi serial
// Mendeklarasikan pin-pin untuk dip switch
int dip[] = {2, 3, 4, 5, 6, 7, 8, 9};
int dipvalue[] = {}; // Array untuk menyimpan nilai pembacaan dari dip switch
int dipCount = 0; // Variabel untuk menghitung jumlah dip switch yang aktif
void setup() {
Serial.begin(9600); // Memulai komunikasi serial dengan baud rate 9600
// Mengatur semua pin dip switch sebagai input dengan pull-up resistor
for (int i = 0; i < 8; i++) {
pinMode(dip[i], INPUT_PULLUP);
}
// Memulai komunikasi SPI
SPI.begin();
// Mengatur pembagi clock SPI untuk mengontrol kecepatan data transfer
SPI.setClockDivider(SPI_CLOCK_DIV8);
// Mengatur Slave Select (SS) pin ke HIGH. Ini menandakan bahwa tidak ada komunikasi SPI yang aktif
digitalWrite(SS, HIGH);
}
void loop() {
byte Mastersend = 0; // Variabel untuk menyimpan data yang akan dikirim ke slave
// Membaca nilai dari setiap dip switch dan menghitung berapa yang aktif (dalam posisi LOW)
for (int i = 0; i < 8; i++) {
dipvalue[i] = digitalRead(dip[i]);
if (dipvalue[i] == LOW) {
dipCount++; // Menambahkan jumlah dip switch yang aktif
}
}
// Mengatur nilai Mastersend berdasarkan jumlah dip switch yang aktif
if (dipCount == 1) {
Mastersend = 1; // Jika hanya satu dip switch yang aktif, kirim 1
} else if (dipCount == 4) {
Mastersend = 4; // Jika empat dip switch yang aktif, kirim 4
}
dipCount = 0; // Mereset jumlah dip switch yang aktif untuk iterasi berikutnya
// Mengirim nilai Mastersend ke slave melalui SPI
digitalWrite(SS, LOW); // Mengaktifkan slave dengan mengatur SS ke LOW
SPI.transfer(Mastersend); // Mengirim data ke slave
delay(100); // Memberikan delay untuk memastikan slave memiliki waktu yang cukup untuk memproses data yang diterima
}
Slave
#include <SPI.h>
#define a 9
#define b 8
#define c 7
#define d 6
#define e 5
#define f 4
#define g 3
#define dp 2
#define D1 A0
#define D2 A1
const int segmentPins[] = {a, b, c, d, e, f, g}; // Koneksi digit 1 ke pin 1, digit 2 ke pin 0
volatile boolean received = false;
volatile byte Slavereceived;
void setup() {
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
Serial.begin(9600);
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
SPCR |= _BV(SPE);
SPI.attachInterrupt();
}
ISR(SPI_STC_vect) {
Slavereceived = SPDR;
received = true;
}
void displayCharacter(int digit, int digitPosition) {
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
};
// Write the pattern to the segment pins
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], patterns[digit][i]);
}
// Aktifkan digit yang sesuai
if (digitPosition == D1) {
digitalWrite(D1, HIGH);
digitalWrite(D2, LOW);
} else if (digitPosition == D2) {
digitalWrite(D1, LOW);
digitalWrite(D2, HIGH);
}
delay(5); // Delay kecil untuk memastikan penampilan stabil
}
void loop() {
if (received) {
if (Slavereceived == 1) {
displayCharacter(8, D1); // Menampilkan angka 1 hanya pada digit 1
displayCharacter(0, D2); // Matikan digit 2
} else if (Slavereceived == 4) {
displayCharacter(4, D1); // Menampilkan angka 4 pada kedua digit
displayCharacter(4, D2);
}
delay(100);
received = false;
}
}
Setiap 2 switch yang aktif akan melakukan counting 0 - 9 pada digit 1 dan 2 secara berseling
Download HTML
Download Rangkaian
Download Program
Download Video Simulasi
Download Datasheet SW-SPDT
Download Datasheet Resistor
Download Datasheet Arduino Uno
Download Datasheet LED
Tidak ada komentar:
Posting Komentar