Joystick KY-023

Bermain Game LCD20x4 I2C dengan Joystick KY-023

Joystick sering digunakan dalam banyak penerapan. Digunakan untuk bermain game, menggerakkan robot, menggerakan camera, mengendalikan mainan RC dan sebagainya.

Video tutorial ini menjelaskan secara detil mengenai Joystick KY-023, sebuah joystick sederhana yang sangat bermanfaat untuk kebutuhkan apapun dan bagaimana kita bisa menggunakannya dengan micro controller papan Arduino.

Video ini memiliki dua bagian. Bagian pertama menjelaskan secara detil mengenai fitur-fitur joystick KY-023 dan bagaimana kita bisa menggunakannya dengan micro controller papan Arduino.

Bagian kedua menjelaskan mengenai bagaimana kita bisa bermain game pada layar LCD 20×4 I2C dengan menggunakan joystick KY-023.

Dalam game ini, kita menjadi seorang manusia yang berusaha menangkap hantu. Manusia bergerak berdasarkan pergerakkan joystick. Hantu bergerak secara acak. Hantu tertangkap apabila posisi kolom dan barisnya sama dengan posisi kolom dan baris manusia.

Bagian 1 – Kode program Joystick KY023

// Protus Tanuhandaru
// www.progresstech.co.id

int pos_x; // Variabel untuk menyimpan nilai pergerakan sumbu X
int pos_y; // Variabel untuk menyimpan nilai pergerakan sumbu Y
int SW_PIN; // Variabel untuk menyimpan nilai digital tombol

void setup() {
  pinMode(2, INPUT_PULLUP); // PIN 2 merupakan input dan mengaktifkan resistor pull-up
  digitalWrite(2, HIGH); // Memberikan nilai default HIGH pada PIN 2 
  Serial.begin(9600); // Mengatur baud rate kecepatan komunikasi data
}

void loop() {
  pos_x = analogRead(A0); // Membaca nilai sumbu X [0...1023]
  pos_y = analogRead(A1); // Membaca nilai sumbu Y [0...1023]
  SW_PIN = digitalRead(2); // Membaca apakah tombol ditekan (0 atau 1)

  Serial.print("X = ");
  Serial.print(pos_x, DEC);
  Serial.print(" | Y = ");
  Serial.print(pos_y);
  Serial.print(" | Button = ");
  Serial.println(SW_PIN);
  delay(100);
}

Bagian 2 – Game Tangkap Hantu LCD20x4 I2C dan Joystick KY 023

 // Protus Tanuhandaru // www.progresstech.co.id #include <LiquidCrystal_I2C.h> // Memanggil library LCD I2C LiquidCrystal_I2C lcd(0x27, 20, 4); // // Mengatur alamat I2C dan ukuran LCD // Membuat karakter orang berjalan byte customOrangBerjalan0[8] = {   0b01110,   0b01110,   0b00100,   0b00111,   0b01100,   0b10110,   0b00101,   0b11001 }; // Membuat karakter orang berjalan byte customOrangBerjalan1[8] = {   0b01110,   0b01110,   0b00100,   0b10100,   0b01110,   0b00101,   0b01010,   0b10001 }; // Membuat karakter hantu byte customHantu[8] = {   0b00100,   0b01110,   0b11111,   0b10101,   0b01110,   0b01110,   0b11111,   0b11111 }; // Variabel boolean untuk menentukan kapan animasi orang berubah bool bergerak = false; // Bagian Joystick int pos_x; // Variabel untuk menyimpan nilai pergerakan sumbu X int pos_y; // Variabel untuk menyimpan nilai pergerakan sumbu Y int SW_PIN; // Variabel untuk menyimpan nilai digital tombol //Bagian LCD int pos_kolom_orang; int pos_baris_orang; int pos_kolom_hantu; int pos_baris_hantu; void setup() {   //Bagian Joystick   pinMode(2, INPUT_PULLUP); // PIN 2 merupakan input dan mengaktifkan resistor pull-up   digitalWrite(2, HIGH); // Memberikan nilai default HIGH pada PIN 2    //Bagian Setup   lcd.begin();   lcd.backlight();   lcd.createChar(0, customOrangBerjalan0); // Membuat karakter baru orang berlari   lcd.createChar(1, customOrangBerjalan1); // Membuat karakter baru orang berlari   lcd.createChar(2, customHantu); // Membuat karakter hantu   lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1   lcd.print("PROGRESSTECH"); // Menulis konten pada LCD   lcd.setCursor(1, 2); // Menempatkan kursor pada kolom 1 dan baris 2   lcd.print("Protus Tanuhandaru"); // Menulis konten pada LCD   delay(4000); // Memberikan delay 4 detik   lcd.clear(); // Menghapus konten LCD   lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1   lcd.print("Tangkap Hantu"); // Menulis konten pada LCD   delay(4000); // Memberikan delay 4 detik   lcd.clear(); // Menghapus konten LCD   pos_kolom_orang = 9; // Menentukan posisi kolom awal orang   pos_baris_orang = 2; // Menentukan posisi baris awal orang   pos_kolom_hantu = 6; // Menentukan posisi kolom awal hantu    pos_baris_hantu = 1; // Menentukan posisi baris awal hantu   lcd.setCursor(pos_kolom_orang, pos_baris_orang); // Menempatkan kursor pada kolom awal dan baris awal orang   lcd.setCursor(pos_kolom_hantu, pos_baris_hantu); // Menempatkan kursor pada kolom awal dan baris awal hantu   lcd.write((byte)0);   lcd.write((byte)3);   Serial.begin(9600); // Mengatur baud rate kecepatan komunikasi data } void location(int x, int y, int button) {     // Geser ke atas   if((y>900)&&(x<900)&&(x>100)) {     if(pos_baris_orang == 0) {      } else {       pos_baris_orang = pos_baris_orang - 1;     }    }   // Geser ke bawah   if((y<100)&&(x<900)&&(x>100)) {     if(pos_baris_orang == 3) {      } else {       pos_baris_orang = pos_baris_orang + 1;     }     }      // Geser ke kiri dan ke atas   if((x<100)&&(y>900)) {     if(pos_kolom_orang == 0) {       } else {       pos_kolom_orang = pos_kolom_orang - 1;     }     if(pos_baris_orang == 0) {       } else {       pos_baris_orang = pos_baris_orang - 1;     }    }   // Geser ke kiri dan ke bawah   if((x<100)&&(y<100)) {     if(pos_kolom_orang == 0) {     } else {       pos_kolom_orang = pos_kolom_orang - 1;     }     if(pos_baris_orang == 3) {      } else {       pos_baris_orang = pos_baris_orang + 1;     }      }   // Geser ke kanan dan ke atas   if((x>900)&&(y>900)) {     if(pos_kolom_orang == 19) {     } else {       pos_kolom_orang = pos_kolom_orang + 1;     }     if(pos_baris_orang == 0) {      } else {       pos_baris_orang = pos_baris_orang - 1;     }        }   // Geser ke kanan dan ke bawah   if((x>900)&&(y<100)) {     if(pos_kolom_orang == 19) {     } else {       pos_kolom_orang = pos_kolom_orang + 1;     }     if(pos_baris_orang == 3) {      } else {       pos_baris_orang = pos_baris_orang + 1;     }      }   // Geser ke kanan    if((x>900)&&(y<900)&&(y>100)) {     if(pos_kolom_orang == 19) {     } else {       pos_kolom_orang = pos_kolom_orang + 1;     }       }   // Geser ke kiri   if((x<100)&&(y<900)&&(y>100)) {     if(pos_kolom_orang == 0) {     } else {       pos_kolom_orang = pos_kolom_orang - 1;     }      }      lcd.clear(); // Menghapus konten LCD   lcd.setCursor(pos_kolom_orang, pos_baris_orang); //Menempatkan kursor orang pada baris dan kolom baru      // Mengatur perubahan gambar animasi orang   if(bergerak == false) {     lcd.write((byte)0);     bergerak = true;   } else {     lcd.write((byte)1);     bergerak = false;   }   // Hantu bergerak secara acak   if(pos_kolom_hantu == 0) {     pos_kolom_hantu = pos_kolom_hantu + 1;   } else if (pos_kolom_hantu == 19){     pos_kolom_hantu = pos_kolom_hantu - 1;   } else {     pos_kolom_hantu = pos_kolom_hantu + random(-1,2);   }   if(pos_baris_hantu == 0) {     pos_baris_hantu = pos_baris_hantu + 1;   } else if (pos_baris_hantu == 3){     pos_baris_hantu = pos_baris_hantu - 1;   } else {     pos_baris_hantu = pos_baris_hantu + random(-1,2);   }   // Menempatkan kursor gambar hantu pada kolom dan baris yang baru   lcd.setCursor(pos_kolom_hantu,pos_baris_hantu);       lcd.write((byte)2); // Menggambar hantu pada LCD   // Jika posisi kolom dan baris orang dan hantu sama, maka hantunya tertangkap   if(pos_kolom_orang == pos_kolom_hantu) {     if(pos_baris_orang == pos_baris_hantu) {       lcd.clear();       lcd.setCursor(5, 1);       lcd.print("Kena loe!");       delay(500);      }   }   // Jika tombol joystick ditekan, maka LCD menampilkan konten   if(SW_PIN == 0) {     lcd.setCursor(0, 0);     lcd.print("Tangkap hantunya");   } } void loop() {   pos_x = analogRead(A0); // Membaca nilai sumbu X [0...1023]   pos_y = analogRead(A1); // Membaca nilai sumbu Y [0...1023]   SW_PIN = digitalRead(2); // Membaca apakah tombol ditekan (0 atau 1)   Serial.print("X = ");   Serial.print(pos_x, DEC);   Serial.print(" | Y = ");   Serial.print(pos_y, DEC);   Serial.print(" | Button = ");   Serial.println(SW_PIN, DEC);   location(pos_x, pos_y, SW_PIN); // Memanggil fungsi location    delay(500); } // Protus Tanuhandaru
// www.progresstech.co.id

#include <LiquidCrystal_I2C.h> // Memanggil library LCD I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // // Mengatur alamat I2C dan ukuran LCD

// Membuat karakter orang berjalan
byte customOrangBerjalan0[8] = {
  0b01110,
  0b01110,
  0b00100,
  0b00111,
  0b01100,
  0b10110,
  0b00101,
  0b11001
};

// Membuat karakter orang berjalan
byte customOrangBerjalan1[8] = {
  0b01110,
  0b01110,
  0b00100,
  0b10100,
  0b01110,
  0b00101,
  0b01010,
  0b10001
};

// Membuat karakter hantu
byte customHantu[8] = {
  0b00100,
  0b01110,
  0b11111,
  0b10101,
  0b01110,
  0b01110,
  0b11111,
  0b11111
};

// Variabel boolean untuk menentukan kapan animasi orang berubah
bool bergerak = false;

// Bagian Joystick
int pos_x; // Variabel untuk menyimpan nilai pergerakan sumbu X
int pos_y; // Variabel untuk menyimpan nilai pergerakan sumbu Y
int SW_PIN; // Variabel untuk menyimpan nilai digital tombol

//Bagian LCD
int pos_kolom_orang;
int pos_baris_orang;
int pos_kolom_hantu;
int pos_baris_hantu;

void setup() {
  //Bagian Joystick
  pinMode(2, INPUT_PULLUP); // PIN 2 merupakan input dan mengaktifkan resistor pull-up
  digitalWrite(2, HIGH); // Memberikan nilai default HIGH pada PIN 2 

  //Bagian Setup
  lcd.begin();
  lcd.backlight();
  lcd.createChar(0, customOrangBerjalan0); // Membuat karakter baru orang berlari
  lcd.createChar(1, customOrangBerjalan1); // Membuat karakter baru orang berlari
  lcd.createChar(2, customHantu); // Membuat karakter hantu
  lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1
  lcd.print("PROGRESSTECH"); // Menulis konten pada LCD
  lcd.setCursor(1, 2); // Menempatkan kursor pada kolom 1 dan baris 2
  lcd.print("Protus Tanuhandaru"); // Menulis konten pada LCD
  delay(4000); // Memberikan delay 4 detik
  lcd.clear(); // Menghapus konten LCD
  lcd.setCursor(4, 1); // Menempatkan kursor pada kolom 4 dan baris 1
  lcd.print("Tangkap Hantu"); // Menulis konten pada LCD
  delay(4000); // Memberikan delay 4 detik
  lcd.clear(); // Menghapus konten LCD
  pos_kolom_orang = 9; // Menentukan posisi kolom awal orang
  pos_baris_orang = 2; // Menentukan posisi baris awal orang
  pos_kolom_hantu = 6; // Menentukan posisi kolom awal hantu 
  pos_baris_hantu = 1; // Menentukan posisi baris awal hantu
  lcd.setCursor(pos_kolom_orang, pos_baris_orang); // Menempatkan kursor pada kolom awal dan baris awal orang
  lcd.setCursor(pos_kolom_hantu, pos_baris_hantu); // Menempatkan kursor pada kolom awal dan baris awal hantu
  lcd.write((byte)0);
  lcd.write((byte)3);
  Serial.begin(9600); // Mengatur baud rate kecepatan komunikasi data
}

void location(int x, int y, int button) {  
  // Geser ke atas
  if((y>900)&&(x<900)&&(x>100)) {
    if(pos_baris_orang == 0) { 
    } else {
      pos_baris_orang = pos_baris_orang - 1;
    } 
  }

  // Geser ke bawah
  if((y<100)&&(x<900)&&(x>100)) {
    if(pos_baris_orang == 3) { 
    } else {
      pos_baris_orang = pos_baris_orang + 1;
    }  
  }
  
  // Geser ke kiri dan ke atas
  if((x<100)&&(y>900)) {
    if(pos_kolom_orang == 0) {  
    } else {
      pos_kolom_orang = pos_kolom_orang - 1;
    }
    if(pos_baris_orang == 0) {  
    } else {
      pos_baris_orang = pos_baris_orang - 1;
    } 
  }

  // Geser ke kiri dan ke bawah
  if((x<100)&&(y<100)) {
    if(pos_kolom_orang == 0) {
    } else {
      pos_kolom_orang = pos_kolom_orang - 1;
    }
    if(pos_baris_orang == 3) { 
    } else {
      pos_baris_orang = pos_baris_orang + 1;
    }   
  }

  // Geser ke kanan dan ke atas
  if((x>900)&&(y>900)) {
    if(pos_kolom_orang == 19) {
    } else {
      pos_kolom_orang = pos_kolom_orang + 1;
    }
    if(pos_baris_orang == 0) { 
    } else {
      pos_baris_orang = pos_baris_orang - 1;
    }     
  }

  // Geser ke kanan dan ke bawah
  if((x>900)&&(y<100)) {
    if(pos_kolom_orang == 19) {
    } else {
      pos_kolom_orang = pos_kolom_orang + 1;
    }
    if(pos_baris_orang == 3) { 
    } else {
      pos_baris_orang = pos_baris_orang + 1;
    }   
  }

  // Geser ke kanan 
  if((x>900)&&(y<900)&&(y>100)) {
    if(pos_kolom_orang == 19) {
    } else {
      pos_kolom_orang = pos_kolom_orang + 1;
    }    
  }

  // Geser ke kiri
  if((x<100)&&(y<900)&&(y>100)) {
    if(pos_kolom_orang == 0) {
    } else {
      pos_kolom_orang = pos_kolom_orang - 1;
    }   
  }
  
  lcd.clear(); // Menghapus konten LCD
  lcd.setCursor(pos_kolom_orang, pos_baris_orang); //Menempatkan kursor orang pada baris dan kolom baru
  
  // Mengatur perubahan gambar animasi orang
  if(bergerak == false) {
    lcd.write((byte)0);
    bergerak = true;
  } else {
    lcd.write((byte)1);
    bergerak = false;
  }

  // Hantu bergerak secara acak
  if(pos_kolom_hantu == 0) {
    pos_kolom_hantu = pos_kolom_hantu + 1;
  } else if (pos_kolom_hantu == 19){
    pos_kolom_hantu = pos_kolom_hantu - 1;
  } else {
    pos_kolom_hantu = pos_kolom_hantu + random(-1,2);
  }
  if(pos_baris_hantu == 0) {
    pos_baris_hantu = pos_baris_hantu + 1;
  } else if (pos_baris_hantu == 3){
    pos_baris_hantu = pos_baris_hantu - 1;
  } else {
    pos_baris_hantu = pos_baris_hantu + random(-1,2);
  }

  // Menempatkan kursor gambar hantu pada kolom dan baris yang baru
  lcd.setCursor(pos_kolom_hantu,pos_baris_hantu); 
  
  lcd.write((byte)2); // Menggambar hantu pada LCD

  // Jika posisi kolom dan baris orang dan hantu sama, maka hantunya tertangkap
  if(pos_kolom_orang == pos_kolom_hantu) {
    if(pos_baris_orang == pos_baris_hantu) {
      lcd.clear();
      lcd.setCursor(5, 1);
      lcd.print("Kena loe!");
      delay(500); 
    }
  }

  // Jika tombol joystick ditekan, maka LCD menampilkan konten
  if(SW_PIN == 0) {
    lcd.setCursor(0, 0);
    lcd.print("Tangkap hantunya");
  }
}


void loop() {
  pos_x = analogRead(A0); // Membaca nilai sumbu X [0...1023]
  pos_y = analogRead(A1); // Membaca nilai sumbu Y [0...1023]
  SW_PIN = digitalRead(2); // Membaca apakah tombol ditekan (0 atau 1)

  Serial.print("X = ");
  Serial.print(pos_x, DEC);
  Serial.print(" | Y = ");
  Serial.print(pos_y, DEC);
  Serial.print(" | Button = ");
  Serial.println(SW_PIN, DEC);

  location(pos_x, pos_y, SW_PIN); // Memanggil fungsi location 
  delay(500);
}

Bagian 1 – Joystick KY023 Breadboard

Joystick KY023 breadboard

Bagian 2 – Joystick KY023 dan LCD 20×4 Breadboard

Joystick KY023 dan LCD 20x4_breadboard

Leave a Reply

Your email address will not be published. Required fields are marked *