·
Rangkailah
rangkaian seperti panduan pada modul
·
Buka
Arduino IDE dan masukan listing program, lalu upload program ke arduino
·
Variasikan
DIPSW_6 dan amati perubahan pada Double Seven Segmen
ada rangkaian di atas, terdapat sepasang arduino dan sebuah double seven segment. Arduino pertama berfungsi sebagai master yang menerima input dari DIPSW_6. Sedangkan Arduino kedua adalah slave atau arduino yang dikontrol. Slave menerima instruksi dari Master dan meneruskannya ke double Seven Segment. Sesuai kondisi yang dipilih dan listing program yang mana setiap 3 switch diaktifkan maka double Seven Segment akan melakukan counting dari 9 sampai 0 secara bergantian di digit 1 dan 2.
a. Master
b. Slave
a. Master
//Master Arduino
#include<SPI.h> //Library for SPI
int dip[] = {2,3,4,5,6,7};
int dipvalue[] = {};
void setup (){
Serial.begin(9600); //Starts Serial Communication at Baud Rate 115200
for(int i = 0; i < 6; i++){
pinMode(dip[i], INPUT_PULLUP);
}
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;
for(int i = 0; i < 6; i++){
dipvalue[i] = digitalRead(dip[i]);
if(dipvalue[i] == LOW){
x = dip[i];
}
}
digitalWrite(SS, LOW);
Mastersend = x;
Serial.println(Mastersend);
SPI.transfer(Mastersend); //Send the mastersend value to slave also receives value from slave
delay(1000);
}
a. 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 currentNumber = 9; // Inisialisasi angka saat ini
int switchCount = 0; // Counter untuk menghitung jumlah switch aktif
void setup() {
Serial.begin(9600);
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
SPCR |= _BV(SPE); // Mengaktifkan SPI dalam mode Slave
SPI.attachInterrupt(); // Menetapkan interrupt untuk komunikasi SPI
}
ISR (SPI_STC_vect) { // Fungsi rutin interrupt
Slavereceived = SPDR; // Menyimpan nilai yang diterima dari master
received = true; // Set nilai received menjadi true
}
#define D1 A0
#define D2 A1
void loop() {
Serial.println(Slavereceived);
if (received) {
if (Slavereceived == 1) { // Jika switch aktif
switchCount++;
if (switchCount >= 3) { // Jika sudah terdeteksi 3 switch aktif
switchCount = 0; // Reset counter
currentNumber = 9; // Mulai perhitungan dari 9 lagi
}
}
received = false; // Reset nilai received
displayCharacter(currentNumber); // Menampilkan angka saat ini di 7 segment
delay(1000); // Delay sebelum menampilkan angka selanjutnya
currentNumber--; // Mengurangi angka saat ini untuk perhitungan selanjutnya
if (currentNumber < 0) { // Jika mencapai 0, kembali ke 9
currentNumber = 9;
}
}
}
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)) {
// Mendapatkan indeks digit (0-9) dari karakter
int index = ch;
// Menulis pola ke pin-pins segment
for (int i = 0; i < 7; i++) {
digitalWrite(segmentPins[i], patterns[index][i]);
}
}
}
Tidak ada komentar:
Posting Komentar