Cara Menghubungkan I2C LCD 16×2 dengan ESP32 menggunakan Arduino IDE

Objective:

Menghubungkan I2C LCD 16×2 dengan ESP32 menggunakan Arduino IDE


Skenario:

Dalam skenario ini kita akan mempelajari cara menghubungkan dan menggunakan modul LCD I2C dengan ESP32, memprogramnya menggunakan Arduino IDE. Fokusnya adalah pemahaman komunikasi I2C dan bagaimana mengatur output tampilan dari perangkat ESP32.


Dasar Teori:

  1. ESP32:
    • ESP32 adalah mikrokontroler yang mendukung Wi-Fi dan Bluetooth, sering digunakan untuk aplikasi IoT. Mikrokontroler ini juga mendukung komunikasi serial seperti I2C, yang umum digunakan untuk menghubungkan sensor dan display.
  2. LCD I2C 16×2:
    • LCD I2C menggunakan protokol I2C yang hanya memerlukan dua kabel untuk komunikasi (SDA dan SCL), sangat efisien dibandingkan LCD parallel biasa. Modul ini biasanya menampilkan karakter 16 kolom dan 2 baris.

  1. I2C Protocol:
    • I2C (Inter-Integrated Circuit) adalah protokol komunikasi yang menggunakan dua saluran (SDA dan SCL) untuk komunikasi data serial. Ini memungkinkan koneksi beberapa perangkat dalam satu sistem dengan alamat unik untuk setiap perangkat.


Bahan dan Alat:

  • ESP32
  • LCD I2C 16×2
  • Breadboard
  • Kabel jumper
  • Komputer dengan Arduino IDE
  • Pustaka LiquidCrystal_I2C

Langkah-langkah:

  1. Wiring Setup:

wiring esp32 I2C

    • Hubungkan ESP32 dengan LCD I2C menggunakan jalur berikut:
      • VCC pada LCD I2C ke VIN ESP32
      • GND pada LCD I2C ke GND ESP32
      • SDA pada LCD I2C ke GPIO21 (SDA) ESP32
      • SCL pada LCD I2C ke GPIO22 (SCL) ESP32

  1. Library Installation:
    • Buka Arduino IDE.
    • Pergi ke Sketch > Include Library > Manage Libraries.
    • Cari dan instal LiquidCrystal_I2C.
  2. Code Implementation:
    • Buat sketsa baru dan masukkan kode berikut:
      #include <LiquidCrystal_I2C.h>
      
      // set the LCD number of columns and rows
      int lcdColumns = 16;
      int lcdRows = 2;
      
      // set LCD address, number of columns and rows
      // if you don't know your display address, run an I2C scanner sketch
      LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);  
      
      void setup(){
        // initialize LCD
        lcd.init();
        // turn on LCD backlight                      
        lcd.backlight();
      }
      
      void loop(){
        // set cursor to first column, first row
        lcd.setCursor(0, 0);
        // print message
        lcd.print("Halo, bisaioti!");
        delay(1000);
        // clears the display to print new message
        lcd.clear();
        // set cursor to first column, second row
        lcd.setCursor(0,1);
        lcd.print("Halo, bisaioti!");
        delay(1000);
        lcd.clear(); 
      }
    • #include <LiquidCrystal_I2C.h>
      • Baris ini menginclude library LiquidCrystal_I2C.h yang digunakan untuk berinteraksi dengan modul LCD I2C..
    • int lcdColumns = 16;
      int lcdRows = 2;
      • Baris ini mendefinisikan dua variabel integer lcdColumns dan lcdRows yang digunakan untuk menentukan jumlah kolom dan baris pada modul LCD. Dalam contoh ini, modul LCD memiliki 16 kolom dan 2 baris.
    • LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
      • Baris ini membuat instance dari kelas LiquidCrystal_I2C yang digunakan untuk berinteraksi dengan modul LCD. Konstruktor LiquidCrystal_I2C mengambil tiga argumen:

        0x27: Alamat I2C dari modul LCD.
        lcdColumns: Jumlah kolom pada modul LCD (16).
        lcdRows: Jumlah baris pada modul LCD (2).

    • void setup(){
      // initialize LCD
      lcd.init();
      // turn on LCD backlight 
      lcd.backlight();
      }
      • Fungsi setup() dipanggil sekali pada awal program. Fungsi ini melakukan dua hal:

        lcd.init(): Menginisialisasi modul LCD.
        lcd.backlight(): Menyalakan backlight modul LCD.

    • void loop(){
      
      // set cursor to first column, first row
      
      lcd.setCursor(0, 0);
      
      // print message
      
      lcd.print("Hello, Bisaioti.com!");
      
      delay(1000);
      
      // clears the display to print new message
      
      lcd.clear();
      
      // set cursor to first column, second row
      
      lcd.setCursor(0,1);
      
      lcd.print("Hello, bisaioti.com");
      
      delay(1000);
      
      lcd.clear(); 
      
      }
      • Fungsi loop() dipanggil berulang-ulang setelah fungsi setup(). Fungsi ini melakukan beberapa hal:

        lcd.setCursor(0, 0): Mengatur posisi cursor ke kolom pertama, baris pertama.
        lcd.print(“Hello, Bisaioti.com!”): Mencetak pesan “Hello, Bisaioti.com!” pada modul LCD.
        delay(1000): Mengintroduksi delay 1 detik.
        lcd.clear(): Menghapus tampilan modul LCD.
        lcd.setCursor(0,1): Mengatur posisi cursor ke kolom pertama, baris kedua.
        lcd.print(“Hello, bisaioti.com”): Mencetak pesan “Hello, bisaioti.com” pada modul LCD.
        delay(1000): Mengintroduksi delay 1 detik.
        lcd.clear(): Menghapus tampilan modul LCD.

  3. Upload and Run:
    • Hubungkan ESP32 ke komputer.
    • Pilih board dan port yang sesuai (Tools > Board > ESP32).
    • Unggah kode ke ESP32.
  4. Testing:
    • Setelah kode berhasil diunggah, lihat tampilan LCD yang menunjukkan pesan “Selamat Datang, bisaioti.com demo!”.
    • Jika tidak ada tampilan, pastikan alamat I2C (0x27 dalam contoh) sesuai dengan LCD Anda. Gunakan I2C scanner jika diperlukan.
    • Program untuk Mengetahui Alamat dari LCD
      • #include <Wire.h>
        
        void setup() {
        
        Wire.begin();
        
        Serial.begin(115200);
        
        Serial.println("\nI2C Scanner");
        
        }
        
        void loop() {
        
        byte error, address;
        
        int nDevices;
        
        Serial.println("Scanning...");
        
        nDevices = 0;
        
        for(address = 1; address < 127; address++ ) {
        
        Wire.beginTransmission(address);
        
        error = Wire.endTransmission();
        
        if (error == 0) {
        
        Serial.print("I2C device found at address 0x");
        
        if (address<16) {
        
        Serial.print("0");
        
        }
        
        Serial.println(address,HEX);
        
        nDevices++;
        
        }
        
        else if (error==4) {
        
        Serial.print("Unknow error at address 0x");
        
        if (address<16) {
        
        Serial.print("0");
        
        }
        
        Serial.println(address,HEX);
        
        } 
        
        }
        
        if (nDevices == 0) {
        
        Serial.println("No I2C devices found\n");
        
        }
        
        else {
        
        Serial.println("done\n");
        
        }
        
        delay(5000); 
        
        }
    • Output dari Program diatas

  1. Serial Monitor (Opsional):
    • Buka Serial Monitor di Arduino IDE untuk memantau status program atau debug.

Pertanyaan Diskusi:

  1. Bagaimana protokol I2C memfasilitasi komunikasi antara ESP32 dan LCD?
    • Protokol I2C menggunakan dua kabel (SDA dan SCL) untuk komunikasi data serial. ESP32 bertindak sebagai master, mengirimkan sinyal melalui SDA dan SCL untuk mengontrol modul LCD dengan alamat I2C yang unik.
  2. Apa keuntungan menggunakan I2C dibandingkan dengan paralel komunikasi?
    • I2C hanya memerlukan dua kabel untuk komunikasi data, sementara paralel membutuhkan lebih banyak pin. I2C juga memungkinkan koneksi beberapa perangkat dengan alamat unik, sehingga lebih hemat pin dan fleksibel.
  1. Bagaimana cara menemukan alamat I2C dari modul jika tidak diketahui?
    • Anda dapat menggunakan I2C scanner untuk menemukan alamat perangkat I2C. Kode scanner akan mencetak alamat I2C yang terdeteksi pada Serial Monitor.

Related Articles

Leave a Reply

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