Tugas Pendahuluan 2 Modul 3
(Percobaan 2 Kondisi 3)
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
[Kembali]
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
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
7. Download File
[Kembali]
HTML klik disini
File Rangkaian klik disini
Video Percobaan klik disini
Video Percobaan klik disini
Listing Program klik disini.
Datasheet Arduino klik disini