#include <LedControl.h> // Mengimpor pustaka LedControl untuk mengontrol modul MAX7219 yang terhubung dengan dot matrix LED.
// Inisialisasi objek LedControl dengan pin DIN, CLK, LOAD (CS) yang terhubung ke Arduino.
LedControl lc = LedControl(5,6,7,1);
// Array untuk menyimpan pola LED yang akan ditampilkan.
byte patterns[8] = {0, 0, 0, 0, 0, 0, 0, 0};
// Pengaturan pin untuk dipswitch dan motor.
const int in1 = A0;
const int in2 = A1;
const int in3 = A2;
const int in4 = A3;
const int infrared = A4;
const int enable = 4;
const int motor1Pin1 = 2;
const int motor1Pin2 = 3;
void setup() {
// Konfigurasi modul dot matrix.
lc.shutdown(0, false); // Mengaktifkan modul
lc.setIntensity(0, 8); // Mengatur kecerahan (0-15)
lc.clearDisplay(0); // Membersihkan tampilan
// Mengatur pin-pin sebagai input atau output.
pinMode(enable, OUTPUT);
pinMode(in1, INPUT);
pinMode(in2, INPUT);
pinMode(in3, INPUT);
pinMode(in4, INPUT);
pinMode(infrared, INPUT);
pinMode(motor1Pin1, OUTPUT);
pinMode(motor1Pin2, OUTPUT);
// Memulai komunikasi serial.
Serial.begin(9600);
}
void loop() {
// Membaca nilai dari sensor infrared.
int infrarednya = digitalRead(infrared);
// Mengendalikan arah motor berdasarkan nilai dipswitch.
if(infrarednya == HIGH) {
digitalWrite(enable, HIGH); // Mengaktifkan motor jika sensor infrared aktif.
// Mengecek kondisi dipswitch dan mengatur arah motor serta menampilkan pola pada dot matrix sesuai kondisi.
if (digitalRead(in1) == HIGH && digitalRead(in2) == LOW && digitalRead(in3) == HIGH && digitalRead(in4) == LOW) {
// Jika dipswitch menunjuk ke kiri.
digitalWrite(motor1Pin1, LOW); // Mengatur output motor untuk bergerak ke kiri.
digitalWrite(motor1Pin2, HIGH);
displayArrowLeft(); // Menampilkan panah ke kiri di dot matrix.
}
else if (digitalRead(in1) == LOW && digitalRead(in2) == HIGH && digitalRead(in3) == LOW && digitalRead(in4) == HIGH) {
// Jika dipswitch menunjuk ke kanan.
digitalWrite(motor1Pin1, HIGH); // Mengatur output motor untuk bergerak ke kanan.
digitalWrite(motor1Pin2, LOW);
displayArrowRight(); // Menampilkan panah ke kanan di dot matrix.
}
else {
// Jika tidak ada pergerakan dipswitch, motor berhenti.
digitalWrite(motor1Pin1, LOW);
digitalWrite(motor1Pin2, LOW);
displayLetterX(); // Menampilkan huruf "X" di dot matrix.
}
}
else {
digitalWrite(enable, LOW); // Menonaktifkan motor jika sensor infrared tidak aktif.
}
}
// Fungsi untuk menampilkan pola pada dot matrix.
void displayArrow(byte pattern) {
// Menetapkan pola pada setiap baris dot matrix.
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, pattern);
}
delay(500); // Mengatur kecepatan animasi
lc.clearDisplay(0); // Membersihkan tampilan setelah menampilkan pola.
delay(500); // Jeda sebelum membaca input lagi.
}
// Menampilkan panah ke kanan di dot matrix.
void displayArrowRight() {
byte arrowRight[8] = {
B00011000,
B00001100,
B00000110,
B11111111,
B11111111,
B00000110,
B00001100,
B00011000
};
// Menetapkan pola panah ke kanan pada setiap baris dot matrix.
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, arrowRight[row]);
}
}
// Menampilkan panah ke kiri di dot matrix.
void displayArrowLeft() {
byte arrowLeft[8] = {
B00011000,
B00110000,
B01100000,
B11111111,
B01100000,
B00110000,
B00011000,
B00000000
};
// Menetapkan pola panah ke kiri pada setiap baris dot matrix.
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, arrowLeft[row]);
}
}
// Menampilkan huruf "X" di dot matrix.
void displayLetterX() {
byte letterX[8] = {
B10000001,
B01000010,
B00100100,
B00011000,
B00011000,
B00100100,
B01000010,
B10000001
};
// Menetapkan pola huruf "X" pada setiap baris dot matrix.
for (int row = 0; row < 8; row++) {
lc.setRow(0, row, letterX[row]);
}
}