Selasa, 13 Oktober 2026

Komunikasi I2C pada mikrokontroller Arduino

 

Bahan Ajar: Komunikasi I2C pada Mikrokontroller dan Aplikasinya

1. Pendahuluan

Dalam sistem mikrokontroller, komunikasi antar perangkat (sensor, aktuator, display, dan memori eksternal) sangat penting. Salah satu protokol komunikasi serial sinkron yang paling populer dan efisien adalah I2C (Inter-Integrated Circuit), yang sering dibaca sebagai "I-squared-C" atau "I-two-C".

Dikembangkan oleh Philips Semiconductors (sekarang NXP Semiconductors) pada tahun 1982, protokol ini dirancang untuk menghubungkan chip atau IC dalam satu papan PCB yang sama dengan menggunakan jumlah jalur kabel yang sangat sedikit.

2. Tujuan Pembelajaran

Setelah mempelajari bahan ajar ini, siswa/mahasiswa diharapkan mampu:

1.   Memahami Konsep Dasar: Menjelaskan definisi, prinsip kerja, dan karakteristik protokol komunikasi I2C.

2.   Mengidentifikasi Jalur Pin: Menyebutkan dan membedakan fungsi pin SDA dan SCL pada mikrokontroller (misalnya Arduino / ESP32).

3.   Menganalisis Sistem Pengalamatan (Addressing): Menjelaskan cara kerja sistem Master-Slave dan pengalamatan perangkat berbasis 7-bit/10-bit pada bus I2C.

4.   Merancang Rangkaian: Menghubungkan modul I2C (seperti modul LCD 16x2 I2C) ke mikrokontroller dengan benar. 

5.   Membuat Program Aplikasi: Menulis dan mengunggah kode program untuk menampilkan informasi (misalnya pembacaan sensor/tegangan aki) pada LCD berantarmuka I2C.

3. Karakteristik Utama I2C Sinkron Berbasis Clock: Menggunakan sinyal clock bersama untuk sinkronisasi pengiriman data.

·     Dua Kabel Saja (Two-Wire Interface):

1.   SDA (Serial Data Line): Jalur untuk mentransfer data (baik dari master ke slave atau sebaliknya).

2.   SCL (Serial Clock Line): Jalur untuk sinyal clock yang dibangkitkan oleh master.

·     Multi-Master dan Multi-Slave: Satu bus dapat dihubungkan oleh banyak master dan banyak slave, di mana setiap perangkat memiliki alamat unik (biasanya 7-bit atau 8-bit).


4. Studi Kasus: Voltmeter Aki Mobil/Motor dengan Arduino dan LCD I2C

A. Deskripsi Proyek

Kita akan membuat alat ukur tegangan aki (accu) 12V menggunakan pin ADC (Analog-to-Digital Converter) mikrokontroller. Karena pin ADC mikrokontroller biasanya hanya mampu membaca tegangan maksimal 5V atau 3.3 V, kita memerlukan rangkaian pembagi tegangan (voltage divider resistor) agar tegangan aki 12V aman dibaca oleh mikrokontroller. Hasil pengukuran kemudian akan ditampilkan secara real-time pada LCD 16x2 yang dikendalikan melalui komunikasi I2C.

B. Skema Rangkaian (Wiring)

·     Modul LCD I2C ke Arduino Uno:

·     GND ke GND Arduino

·     VCC ke 5V Arduino

·     SDA ke Pin A4 Arduino (pada ESP32 biasanya GPIO 21)

·     SCL ke Pin A5 Arduino (pada ESP32 biasanya GPIO 22)

·     Rangkaian Pembagi Tegangan Aki:

·     Tegangan Aki Positif (+12V) Resistor R1 (10 kOhm)

·     Titik Tengah (R1 dan R2) Pin Analog A0 Arduino

·     Resistor R2 (3 kOhm) ke GND bersama

·     Catatan Rumus Pembagi Tegangan: Vout = Vin x((R_2)/(R_1 + R_2). Dengan R1 = 10kOhm dan R2 = 2.2kOhm, faktor pengalinya sekitar 5.

C. Contoh Kode Program (Arduino IDE)

Pastikan Anda sudah menginstal Pustaka (Library) LiquidCrystal_I2C melalui Library Manager Arduino IDE sebelum mengunggah kode ini.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Set alamat I2C untuk LCD 16x2 (umumnya 0x27 atau 0x3F)
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int pinAki = A0; // Pin analog untuk membaca tegangan aki

// Nilai resistor pembagi tegangan (dalam Ohm)
float R1 = 10000.0; // 10 kOhm
float R2 = 3000.0;  // 3 kOhm

void setup() {
  // Inisialisasi komunikasi serial untuk debugging
  Serial.begin(9600);
 
  // Inisialisasi LCD I2C
  lcd.init();                     
  lcd.backlight(); // Nyalakan lampu latar LCD
 
  // Tampilkan pesan pembuka
  lcd.setCursor(0, 0);
  lcd.print("Voltmeter Aki");
  lcd.setCursor(0, 1);
  lcd.print("Sistem I2C Aktif");
  delay(2000);
  lcd.clear();
}

void loop() {
  // Membaca nilai ADC (0 - 1023 untuk Arduino Uno 10-bit)
  int nilaiADC = analogRead(pinAki);
 
  // Konversi nilai ADC ke tegangan pin (skala 5V)
  float teganganPin = (nilaiADC * 5.0) / 1023.0;
 
  // Hitung kembali tegangan asli aki menggunakan rumus pembagi tegangan
  float teganganAki = teganganPin * ((R1 + R2) / R2);
 
  // Tampilkan hasil di Serial Monitor
  Serial.print("Tegangan Aki: ");
  Serial.print(teganganAki);
  Serial.println(" V");
 
  // Tampilkan hasil pada LCD I2C
  lcd.setCursor(0, 0);
  lcd.print("Tegangan Aki:");
 
  lcd.setCursor(0, 1);
  lcd.print(teganganAki, 2); // Tampilkan 2 angka di belakang koma
  lcd.print(" V   ");       // Spasi tambahan untuk membersihkan sisa karakter lama
 
  // Indikator status aki sederhana
  if (teganganAki < 11.5) {
    lcd.setCursor(8, 1);
    lcd.print("(LOW)");
  } else if (teganganAki >= 11.5 && teganganAki <= 14.5) {
    lcd.setCursor(8, 1);
    lcd.print("(NORMAL)   ");
  } else {
    lcd.setCursor(8, 1);
    lcd.print("(OVER)     ");
  }

  delay(1000); // Update setiap 1 detik
}

Wiring Diagram :





Tidak ada komentar:

Posting Komentar

Komunikasi I2C pada mikrokontroller Arduino

  Bahan Ajar: Komunikasi I2C pada Mikrokontroller dan Aplikasinya 1. Pendahuluan Dalam sistem mikrokontroller, komunikasi antar perangka...