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 :


