Tampilkan postingan dengan label Mikrokontroller dan Aplikasinya. Tampilkan semua postingan
Tampilkan postingan dengan label Mikrokontroller dan Aplikasinya. Tampilkan semua postingan

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 :





Senin, 11 Agustus 2025

Fungsi-fungsi dan Operator pada pemrograman Arduino (Materi ke 4)

 

Materi Ajar: Fungsi-fungsi dan Operator pada Pemrograman Arduino Uno

Tujuan Pembelajaran

Setelah mengikuti pembelajaran ini, peserta didik diharapkan mampu:

  1. Menjelaskan konsep fungsi dalam pemrograman Arduino Uno, termasuk fungsi bawaan dan fungsi buatan sendiri.
  2. Mengidentifikasi dan menjelaskan fungsi utama setup() dan loop() beserta perannya dalam program Arduino.
  3. Menjelaskan penggunaan fungsi input/output seperti pinMode(), digitalWrite(), digitalRead(), analogRead(), dan analogWrite().
  4. Menguraikan fungsi waktu (delay(), millis(), micros()) serta perbedaan karakteristiknya.
  5. Menjelaskan fungsi komunikasi serial (Serial.begin(), Serial.print(), Serial.println(), Serial.read()).
  6. Menerapkan fungsi matematika bawaan Arduino seperti min(), max(), abs(), pow(), dan sqrt() dalam program sederhana.
  7. Membuat dan mengimplementasikan fungsi buatan sendiri (user-defined functions) untuk mempermudah penulisan dan pengelolaan program.
  8. Menyusun program Arduino Uno yang memanfaatkan kombinasi beberapa fungsi untuk mengendalikan perangkat elektronik sesuai kebutuhan.

1. Pendahuluan

Arduino Uno adalah papan mikrokontroler berbasis ATmega328P yang menggunakan bahasa pemrograman mirip C/C++. Dalam pemrogramannya, terdapat fungsi yang digunakan untuk menjalankan instruksi tertentu. Fungsi ini bisa dibagi menjadi fungsi bawaan (built-in functions) dan fungsi buatan sendiri (user-defined functions).

Fungsi di Arduino memudahkan penulisan kode agar lebih terstruktur, mudah dibaca, dan bisa digunakan berulang kali.


2. Struktur Dasar Program Arduino

Secara umum, setiap program Arduino memiliki dua fungsi utama:

  1. setup()
    • Dijalankan sekali saat Arduino pertama kali dihidupkan atau di-reset.
    • Digunakan untuk inisialisasi, seperti mengatur mode pin, memulai komunikasi serial, dll.
    • Contoh:

void setup() {

  pinMode(13, OUTPUT); // Mengatur pin 13 sebagai output

}

  1. loop()
    • Dijalankan berulang kali selama Arduino hidup.
    • Digunakan untuk menjalankan logika program utama.
    • Contoh:

void loop() {

  digitalWrite(13, HIGH); // Menyalakan LED

  delay(1000);            // Tunggu 1 detik

  digitalWrite(13, LOW);  // Mematikan LED

  delay(1000);            // Tunggu 1 detik

}


3. Fungsi Bawaan Arduino (Built-in Functions)

A. Fungsi Input/Output

  1. pinMode(pin, mode)
    • Mengatur apakah sebuah pin menjadi INPUT, OUTPUT, atau INPUT_PULLUP.
    • Contoh:

pinMode(2, INPUT);        // Pin 2 sebagai input

pinMode(13, OUTPUT);      // Pin 13 sebagai output

pinMode(7, INPUT_PULLUP); // Pin 7 input dengan resistor pull-up

  1. digitalWrite(pin, value)
    • Memberikan logika HIGH (5V) atau LOW (0V) pada pin output digital.
    • Contoh:

digitalWrite(13, HIGH); // LED nyala

digitalWrite(13, LOW);  // LED mati

  1. digitalRead(pin)
    • Membaca logika digital (HIGH/LOW) dari pin input.
    • Contoh:

int tombol = digitalRead(2);

  1. analogRead(pin)
    • Membaca nilai analog (0–1023) dari pin analog (A0–A5).
    • Contoh:

int sensor = analogRead(A0);

  1. analogWrite(pin, value)
    • Mengeluarkan sinyal PWM (0–255) pada pin tertentu.
    • Contoh:

analogWrite(9, 128); // PWM 50%


B. Fungsi Waktu

  1. delay(ms)
    • Menunda eksekusi program dalam milidetik.
    • Contoh:

delay(1000); // Tunggu 1 detik

  1. millis()
    • Mengembalikan jumlah milidetik sejak Arduino mulai berjalan.
    • Contoh:

unsigned long waktu = millis();

  1. micros()
    • Mengembalikan jumlah mikrodetik sejak Arduino berjalan.

C. Fungsi Serial Communication

  1. Serial.begin(baudrate)
    • Memulai komunikasi serial dengan kecepatan tertentu.
    • Contoh:

Serial.begin(9600);

  1. Serial.print(data) / Serial.println(data)
    • Mengirim data ke monitor serial.
    • Contoh:

Serial.println("Hello Arduino");

  1. Serial.read()
    • Membaca data dari komunikasi serial.

D. Fungsi Matematika

  • min(x, y), max(x, y), abs(x), pow(base, exponent), sqrt(x).
  • Contoh:

int nilai = max(10, 20); // Hasil: 20


4. Fungsi Buatan Sendiri (User-Defined Functions)

Kita dapat membuat fungsi sendiri agar kode lebih rapi.

Contoh:

void nyalakanLED(int pin) {

  digitalWrite(pin, HIGH);

}

 

void matikanLED(int pin) {

  digitalWrite(pin, LOW);

}

 

void setup() {

  pinMode(13, OUTPUT);

}

 

void loop() {

  nyalakanLED(13);

  delay(1000);

  matikanLED(13);

  delay(1000);

}


Dalam pemrograman Arduino (yang berbasis bahasa C/C++), operator adalah simbol khusus yang digunakan untuk melakukan operasi tertentu pada satu atau lebih operand (nilai atau variabel).
Operator membantu kita melakukan perhitungan, perbandingan, logika, manipulasi data, dan lain-lain.

Berikut penjelasan lengkapnya:


1. Operator Aritmatika

Digunakan untuk operasi matematika dasar.

OperatorFungsiContoh (kode)
+Penjumlahanz = x + y;
-Penguranganz = x - y;
*Perkalianz = x * y;
/Pembagianz = x / y;
%Modulus (sisa pembagian)z = x % y;

2. Operator Penugasan

Digunakan untuk memberikan nilai ke variabel.

OperatorFungsiContohSama dengan
=Penugasan langsungx = 5;—
+=Tambah lalu simpanx += 3;x = x + 3;
-=Kurangi lalu simpanx -= 2;x = x - 2;
*=Kali lalu simpanx *= 4;x = x * 4;
/=Bagi lalu simpanx /= 5;x = x / 5;
%=Modulus lalu simpanx %= 3;x = x % 3;

3. Operator Perbandingan

Digunakan untuk membandingkan dua nilai. Hasilnya adalah true (benar) atau false (salah).

OperatorFungsiContohHasil
==Sama denganx == ytrue/false
!=Tidak sama denganx != ytrue/false
>Lebih besarx > ytrue/false
<Lebih kecilx < ytrue/false
>=Lebih besar atau samax >= ytrue/false
<=Lebih kecil atau samax <= ytrue/false

4. Operator Logika

Biasa digunakan dalam pengkondisian (if, while, dll.).

OperatorFungsiContohKeterangan
&&AND (logika DAN)(x > 0 && y < 10)Benar jika keduanya benar
||OR (logika ATAU)`(x > 0
!NOT (logika TIDAK)!(x > 0)Membalikkan nilai logika

5. Operator Increment & Decrement

Untuk menambah atau mengurangi nilai variabel sebanyak 1.

OperatorFungsiContohHasil
++Tambah 1x++;x = x + 1
--Kurang 1x--;x = x - 1

⚠ Prefix vs Postfix

  • ++x → tambah dulu, baru dipakai

  • x++ → pakai dulu, baru ditambah


6. Operator Bitwise

Memanipulasi data dalam bentuk biner (bit-level).

OperatorFungsiContoh
&AND bitwisea & b
|OR bitwisea | b
^XOR bitwisea ^ b
~NOT bitwise~a
<<Shift kiria << 2
>>Shift kanana >> 2

7. Operator Khusus di Arduino/C++

  • sizeof → Menghasilkan ukuran (dalam byte) dari variabel/tipe data.
    Contoh: sizeof(int)

  • ?: → Operator ternary (if singkat).
    Contoh: hasil = (x > y) ? x : y; → jika x > y benar, hasil x, jika salah, hasil y.

Jenis Komentar di Arduino

1. Komentar Satu Baris

Menggunakan // di awal baris.
Semua teks setelah // di baris tersebut akan diabaikan.

// Ini adalah komentar satu baris int x = 10; // komentar setelah perintah

2. Komentar Multi-baris

Menggunakan /* ... */.
Semua teks di dalamnya akan diabaikan, meskipun terdiri dari banyak baris.

/* Ini komentar lebih dari satu baris dan tidak akan dibaca oleh Arduino */ int y = 20;

3. Menonaktifkan Kode Sementara

Bisa menggunakan komentar untuk “mematikan” kode yang tidak ingin dijalankan.

// digitalWrite(LED_BUILTIN, HIGH); // kode ini tidak akan dijalankan


Kesimpulan

  • Fungsi adalah blok kode yang digunakan untuk menjalankan tugas tertentu.
  • Arduino memiliki fungsi utama (setup() dan loop()) dan fungsi bawaan untuk I/O, waktu, komunikasi serial, serta matematika.
  • Penggunaan fungsi buatan sendiri membuat program lebih modular dan mudah dibaca.
  • Operator adalah simbol khusus yang digunakan untuk melakukan operasi pada data atau variabel, baik itu perhitungan matematika, logika, perbandingan, manipulasi bit, maupun penugasan nilai.

  • Jenis operator pada Arduino (C/C++) meliputi:

    • Aritmatika → untuk perhitungan (+, -, *, /, %).

    • Penugasan → untuk memberi atau mengubah nilai (=, +=, -=, dll.).

    • Perbandingan → membandingkan nilai dan menghasilkan true atau false (==, !=, >, <, >=, <=).

    • Logika → menggabungkan atau membalik kondisi logis (&&, ||, !).

    • Increment/Decrement → menambah atau mengurangi nilai 1 (++ dan --).

    • Bitwise → memanipulasi data pada level bit (&, |, ^, ~, <<, >>).

    • Lainnya → seperti sizeof dan operator ternary ?

 

Komunikasi I2C pada mikrokontroller Arduino

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