MODUL III
COMMUNICATION
- Rangkailah seperti rangkaian berikut
- Buka Arduino IDE dan masukan listing program Upload program ke arduino
- Variasikan tombol yang ditekan dan amati keluarannya pada DOT MATRIX
Rangkaian ini berfungsi sebagai berikut:
Kode Master:
Inisialisasi:
Mendefinisikan konstanta untuk alamat slave, pin tombol, dan variabel untuk status tombol dan penghitung.
Menginisialisasi komunikasi I2C dan mengatur pin tombol sebagai input dengan pull-up resistor internal.
Memulai komunikasi serial untuk keperluan debugging.
Loop Utama:
Membaca status kedua tombol (button1 dan button2).
Tombol 2 (penghitung):
Jika tombol 2 ditekan (LOW), penghitung "count" ditambah 1.
Delay debouncing ditambahkan untuk menghindari penekanan tombol berkali-kali terdaftar sebagai satu.
Penghitung diatur ulang ke 0 setelah melebihi 3 (dapat dikonfigurasi).
Tombol 1 (perintah):
Jika count genap:
Jika tombol 1 ditekan (LOW), penghitung "counter" ditambah 1.
Komunikasi I2C dimulai dengan slave menggunakan alamatnya.
Nilai "counter" dikirim sebagai perintah ke slave.
Komunikasi I2C dihentikan.
Delay debouncing ditambahkan.
Penghitung diatur ulang ke 0 setelah melebihi 3 (dapat dikonfigurasi).
Jika count adalah kelipatan 3, komunikasi I2C dihentikan (mungkin untuk memberi waktu kepada slave untuk memproses perintah sebelumnya).
Mencetak nilai count dan counter untuk debugging.
Kode Slave:
Inisialisasi:
Mendefinisikan konstanta untuk jumlah LED dan pin awal.
Menginisialisasi komunikasi I2C sebagai slave dengan alamat yang ditentukan (9).
Mendaftarkan fungsi event handler "receiveEvent" untuk menangani data yang masuk dari master.
Mengatur semua pin LED sebagai output.
Loop Utama:
Tidak ada tindakan yang dilakukan dalam loop utama karena semua fungsi ditangani dalam fungsi receiveEvent.
Fungsi receiveEvent:
Membaca byte perintah yang masuk dari master.
Mencetak perintah yang diterima untuk debugging.
Berdasarkan perintah yang diterima:
1: Menyalakan semua LED.
2: Mematikan semua LED.
3: Mengedipkan semua LED berulang kali sebanyak 5 kali.
Fungsi Keseluruhan:
Kode ini mengatur sistem di mana menekan tombol 1 pada master mengirimkan perintah ke slave, mengontrol LED yang terhubung dengannya.
Menekan tombol 2 pada master berfungsi sebagai "pengalih mode", menentukan jenis perintah yang dikirim oleh tombol 1.
Kode ini menerapkan debouncing untuk menghindari kesalahan interpretasi penekanan tombol cepat sebagai beberapa penekanan.
Kode ini menggunakan komunikasi I2C, memungkinkan komunikasi sederhana antara dua Arduino hanya menggunakan dua kabel (SDA dan SCL).
Alamat slave diatur ke 9 dalam kode ini, dan master perlu menggunakan alamat ini untuk berkomunikasi dengan slave.
Pin LED dikontrol berdasarkan perintah yang diterima, menyalakannya, mematikannya, atau mengedipkannya.
Listing Program
//Master
#include <Wire.h>
#define SLAVE_ADDRESS 9 // Slave Arduino address
#define BUTTON1 2 // Pin for the push button
#define BUTTON2 3
int buttonState1 = 0;
int buttonState2 = 0;
int buttonPrevState1 = 0;
int buttonPrevState2 = 0;
unsigned int counter = 0;
unsigned int count = 0;
void setup() {
Wire.begin(); // Initialize I2C communication
pinMode(BUTTON1, INPUT_PULLUP); // Set button pin as input with internal pull-up resistor
pinMode(BUTTON2, INPUT_PULLUP);
Serial.begin(9600); // Initialize serial communication for debugging
}
void loop() {
buttonState1 = digitalRead(BUTTON1);
buttonState2 = digitalRead(BUTTON2);
if (buttonState2 != buttonPrevState2){
if(buttonState2 == LOW){
count++;
}
delay(50);
}
buttonPrevState2 = buttonState2;
if(count > 3){
count = 0;
}
if(count % 2 == 0){
if (buttonState1 != buttonPrevState1) {
if (buttonState1 == LOW) {
// Button is pressed
counter++;
Wire.beginTransmission(SLAVE_ADDRESS);
Wire.write(counter); // Send command to the slave
Wire.endTransmission();
}
delay(50); // Debouncing delay
}
buttonPrevState1 = buttonState1;
if(counter > 3){
counter = 0;
}
}else if(count % 3 == 0){
Wire.endTransmission();
}
Serial.print(count); Serial.println(counter);
}
//Slave
#include <Wire.h>
#define LED_COUNT 8
#define LED_PIN_START 2 // Start pin for the LEDs
void setup() {
Serial.begin(9600);
Wire.begin(9); // Initialize I2C communication as Slave with address 9
Wire.onReceive(receiveEvent); // Register event for receiving data
for (int i = LED_PIN_START; i < LED_PIN_START + LED_COUNT; i++) {
pinMode(i, OUTPUT); // Set LED pins as output
}
}
void loop() {
// Nothing to do here, all actions are performed in the receiveEvent function
}
void receiveEvent(int numBytes) {
unsigned int command = Wire.read(); // Read incoming command from master
Serial.println(command);
delay(500);
if (command == 1) {
// Turn all LEDs ON
for (int i = LED_PIN_START; i < LED_PIN_START + LED_COUNT; i++) {
digitalWrite(i, HIGH);
}
} else if (command == 2) {
// Turn all LEDs OFF
for (int i = LED_PIN_START; i < LED_PIN_START + LED_COUNT; i++) {
digitalWrite(i, LOW);
}
} else if (command == 3) {
// Blink all LEDs
for (int j = 0; j < 5; j++) { // Repeat the blinking 5 times
for (int i = LED_PIN_START; i < LED_PIN_START + LED_COUNT; i++) {
digitalWrite(i, HIGH);
delay(1000);
}
delay(500); // Delay for ON state
for (int i = LED_PIN_START; i < LED_PIN_START + LED_COUNT; i++) {
digitalWrite(i, LOW);
delay(1000);
}
delay(500); // Delay for OFF state
}
}
}
Percobaan 5 (Tanpa Kondisi)
Tidak ada komentar:
Posting Komentar