Anda di halaman 1dari 11

PRAKTIKUM 8

KOMUNIKASI I2C, RTC, LCD, DAN PENGAMBILAN DATA WAKTU

Materi

 Praktik pemograman I2C Scanner


 Praktik pemograman Real Time Clock
 Praktik pemograman LCD 16x2 I2C
 Praktik menampilkan data sensor dan aktuator servo pada LCD

Tujuan Praktikum

 Mampu menjelaskan dan mengaplikasikan pemograman menggunakan komunikasi


I2C

Alat dan Bahan

 LDR
 I2C
 LCD 16x2
 RTC
 Kabel Jumper (secukupnya)
 Breadboard
 Arduino
 Servo

A. I2C (Inter Integrated Circuit)

Inter Integrated Circuit adalah standar komunikasi serial dua arah menggunakan dua
saluran yang di desain khusus untuk mengirim maupun menerima data. Sistem I2C
terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi
data antara I2C dengan pengontrolnya. Piranti yang dihubungkan dengan sistem I2C
Bus dapat dioperasikan sebagai Master dan Slave. Master adalah piranti yang memulai
transfer data pada I2C Bus dengan membentuk sinyal Start, mengakhiri transfer data
dengan membentuk sinyal Stop, dan membangkitkan sinyal clock.

Ilustrasi Komunikasi I2C


Komunikasi I2C hanya memerlukan 2 kabel seperti halnya komunikasi serial, namun
kedua kabel ini mampu berkomunikasi hingga 1008 alamat slave. Pada komunikasi I2C
perlu diingat bahwa harus ada pull-up resistor pada jalur SDA dan SCL. Pull up resistor
ini berfungsi untuk memastikan bahwa jalur I2C tetap dalam kondisi HIGH pada saat
tidak ada perangkat/device yang berkomunikasi. Pull-up resistor ini biasanya bernilai
4.7k hingga 10k.

Penempatan pull up resistor pada jalur I2C

Contoh device yang menggunakan interface I2C A5 (SDA) dan A4 (SCL) beserta
alamatnya antara lain :

1. MAG3110 3-Axis Magnetometer (0x0E)


2. Si4713 FM Transmitter with RDS (0x11 atau 0x63)
3. VCNL40x0 proximity sensor (0x13)
4. MCP9808 temp sensor (0x18 - 0x1F)
5. LIS3DH 3-axis accelerometer (0x18 atau 0x19)
6. LSM303 Accelerometer & Magnetometer (0x19 untuk accelerometer dan 0x1E
untuk magnetometer)
7. MMA845x 3-axis Accelerometer (0x1C atau 0x1D)
8. FXOS8700 Accelerometer/Magnetometer (0x1C, 0x1D, 0x1E atau 0x1F)
9. MMA7455L (0x1C atau 0x1D)
10. LSM9DS0 9-axis IMU (0x1D atau 0x1E untuk Accel/Mag, 0x6A atau 0x6B untuk
Gyro)
11. ADXL345 3-axis accelerometer (0x1D atau 0x53)
12. Modul RTC DS3231 (0x68)
13. RTC DS1307 (0x68)
14. Sensor MPU6050 – Accelerometer dan Gyro (0x68 atau 0x69)
15. Modul LCD OLED (0x3C atau 0x3D)
16. Sensor Gyroscope ADXL345 (0x1D atau 0x53)
17. Sensor Barometric BMP180 (0x77)
18. Sensor Barometric BMP280(0x76 atau 0x77)
19. Modul INA219 (0x40 - 0x4F)
20. Koneksi antar arduino
21. Koneksi antara arduino dengan Raspberry pi
Keuntungan dari penggunaaan i2c yaitu modul yang akan dipasang dapat diparalelkan
dengan jalur yang sama dan hanya membedakan alamat /address dari modul maupun
sensor tersebut. Sehingga dapat menghemat penggunaan pin I/O pada arduino uno
hanya 2 pin. Namun, pada saat pembelian modul ataupun sensor jarang adanya
pencantuman address I2C maka dibutuhkan pemindaian address dari modul ataupun
sensor yang menggunakan interface.

B. LCD 16X2 KARAKTER I2C

LCD (Liquid Crystal Display) merupakan salah satu jenis output yang biasa digunakan
dalam pembuatan instrumen yang membutuhkan tampilan visual sebagai keluarannya.
LCD yang digunakan adalah LCD 16x2 karena LCD ini mampu menampilkan 16
karakter dalam 2 baris. LCD 16x2 memiliki 16 pin yaitu GND (1), VCC (2), VEE (3),
RS (4), R/W (5), EN (6), DB0 (7), DB1 (8), DB2 (9), DB3 (10), DB4 (11), DB5 (12),
DB6 (13), DB7 (14), VCC LED (15), GND LED (16). LCD 16x2 telah dikombinasikan
dengan modul I2C sehingga pin yang dihubungkan ke Arduino Board menjadi lebih
sedikit. Modul I2c ini memiliki 4 pin yang harus terhubung dengan Arduino Board yaitu
GND (1), VCC (2), SDA (3), SCL (4).

Walaupun pin yang dihubungkan dengan Arduino Board menjadi lebih sedikit, LCD
tetap dapat berfungsi menggunakan library default yang ada di dalam Arduino IDE.
a. INSTALASI LIBRARY LCD I2C

Kita harus mendownload library eksternal LCD I2C agar dapat menggunakan
modul LCD I2C dengan mencari NewliquidCrystal_1.3.4.zip dari Arduino atau
yang terbaru. Setelah diinstall maka jika ingin menggunakan modul ini tambahkan
library pada sketch yang ingin di buat.

Dapat juga menambahkan secara manual di dalam Skecth seperti beberapa header
berikut ini:
#include <wire.h>
#include <LiquidCrystal_I2C.h>

b. INISIALISASI LCD 16X2 I2C

Setelah kita menambahkan header LCD I2C pada Sketch kita, maka perlu
menginisialisasi beberapa variabel agar modul ini dapat berfungsi.
Berikut sintak yang diperlukan :
//inisialisasi LCD 16X2 I2C
#define I2C_ADDR 0x3F
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin,
D6_pin, D7_pin);
Langkah pertama ialah menginisialisasi Alamat I2C modul terlebih dahulu.
Inisialisasi ini penting agar Arduino Board dapat berkomunikasi dengan modul
LCD. Sebagai contoh Alamat I2C modul LCD yang terhubung ialah 0x3F. 0x3F
merupakan bilangan hexadecimal yang biasa ditemui dalam aplikasi elektronik.
Komunikasi I2C merupakan sebuah komunikasi antar perangkat dengan sistem
MASTER-SLAVE. Protocol I2C menggunakan dua pin yaitu SDA (Data) dan SCL
(Clock). Kita dapat menghubungkan Arduino Board dengan lebih dari 1000
perangkat lain dengan menggunakan komunikasi I2C karena setiap perangkat
memiliki alamat yang berbeda.
Berikutnya perlu pendefinisian pin-pin yang ada di modul I2C sesuai dengan yang
dibutuhkan. Definisi pin ini digunakan untuk inisialisasi LCD I2C pada sintak
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin,
D6_pin, D7_pin);
Setelah itu, di dalam void setup() tambahkan dua baris sintak berikut:
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
lcd.setBacklight(HIGH);
Inisialisasi di atas digunakan untuk menyalakan BACKGROUND LED LCD.

c. LIQUIDCRYSTAL()

Fungsi ini merupakan fungsi bawaan dari library LCD yang terdapat pada Arduino
IDE. Fungsi ini diperlukan untuk menginisialisasi pin-pin LCD yang terhubung
pada Arduino Board.
Sintak:
LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
Parameter:
rs : pin RS LCD
rw : pin RW LCD
enable : pin ENABLE LCD
d0-d7 : pin D0-D7 LCD

Contoh Program:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
Penjelasan:
Pin-pin LCD yang terhubung diinisialisasikan dan fungsi LiquidCrystal dijadikan
sebuah variabel baru dengan nama lcd.

d. LCD.BEGIN()

Fungsi lcd.begin() digunakan untuk menginisialisasikan jumlah karakter dan baris


LCD yang digunakan. Fungsi ini harus dipanggil sebelum menggunakan fungsi
LCD yang lainnya.
Sintak:
lcd.begin(karakter, baris)
Contoh program :
void setup() {
lcd.begin(16,2)
}
Penjelasan:
Pada sintak di atas LCD yang digunakan ialah LCD dengan jumlah karakter yang
digunakan sebanyak 16 dan 2 baris.
e. LCD.SETCURSOR()

Fungsi lcd.setCursor() digunakan untuk menentukan posisi kursor LCD.


Sintak:
lcd.setCursor(kolom, baris)
Contoh program :
lcd.setCursor(1,1)
Penjelasan:
Dari sintak di atas, kursor diletakkan pada kolom ke-2 dan baris ke-2 (nilai 0 pada
baris dan kolom sdianggap sebagai baris ke-1).

f. LCD.CLEAR()

Fungsi lcd.clear() digunakan untuk menghapus teks yang ada di LCD dan
meletakkan posisi kursor pada baris ke-1 kolom ke-1.
Sintak:
lcd.clear()
Contoh program :
lcd.print(“test”);
lcd.clear();
Penjelasan:
lcd.clear() akan menghapus teks “test” yang tertampil pada LCD.

g. LCD.WRITE()

Fungsi lcd.write() digunakan untuk menulis karakter pada LCD.


Sintak:
lcd.write(data)
Contoh program :
lcd.write(20);
lcd.write(‘ ‘);
Penjelasan:
Kedua sintak di atas akan memperintahkan LCD untuk menampilkan karakter spasi.
Nilai decimal yang ada di dalam kurung akan diubah menjadi karakter ASCII.

h. LCD.PRINT()

Fungsi lcd.print() digunakan untuk menulis kalimat/string pada LCD.


Sintak:
lcd.print(data)
Contoh program :
lcd.print(“makedonia”);
Penjelasan:
lcd.print() akan menampilkan teks “makedonia” pada LCD.
C. MODULE RTC (Real Time Clock)

RTC merupakan komponen yang diperlukan untuk memberikan informasi mengenai


waktu. Waktu disini dapat berupa detik, menit, hari, bulan dan tahun. Arduino
(misalnya UNO) tidak dilengkapi secara internal dengan RTC. Dengan demikian, untuk
aplikasi yang memerlukan pewaktuan, kita harus menyertakannya secara tersendiri.
Agar tetap dapat bekerja, sebuah RTC dilengkapi dengan baterai, yang umumnya
orang-orang menyebutkannya sebagai baterai "CMOS". Berapa jenis dari RTC yaitu
RTC dengan chip DS3231, DS1307, DS1302 dan sebagainya.

DS1307 DS1302 DS3231

Beberapa modul RTC ada yang disertakan penambahan fitur pengukur suhu yang
dikemas ke dalam 1 modul seperti modul RTC DS1307 di atas. Selain itu pada modul
RTC ada yang memiliki IC EEPROM tipe AT24C32 yang dapat dimanfaatkan juga
seperti pada modul DS3231 di atas. Interface atau antarmuka untuk mengakses modul
ini yaitu menggunakan I2C atau two wire (SDA dan SCL). Sehingga apabila diakses
menggunakan mikrontroler misal Arduino Uno pin yang dibutuhkan 2 pin saja dan 2
pin power.

D. PRAKTIKUM PEMOGRAMAN
Praktikum 1

// I2C Scanner
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
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.print(address,HEX);
Serial.println(" !");

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);
}

Praktikum 2

//set waktu
#include "DS3231_Simple.h" //library tergantung dari RTC yang digunakan
DS3231_Simple Clock;

void setup() {
Serial.begin(9600);
Clock.begin();
}

void loop() {
DateTime waktu;
waktu.Day = 3; //atur tanggal
waktu.Month = 10; //atur bulan
waktu.Year = 20; //atur tahun
waktu.Hour = 14; //atur jam
waktu.Minute = 17; //atur menit
waktu.Second = 33; //atur detik
Clock.write(waktu);

Serial.print("Waktu telah di atur ke: ");


Clock.printTo(Serial);
Serial.println();

Serial.print("Program berakhir (RESET untuk menjalakan lagi)");


while(1);
}
Praktikum 3

//menampilkan waktu
#include "DS3231_Simple.h" //library tergantung dari RTC yang digunakan
DS3231_Simple Clock;

void setup() {
Serial.begin(9600);
Clock.begin();
}

void loop() {
DateTime waktu;
waktu = Clock.read();

Serial.print(waktu.Day);
Serial.print("/");
Serial.print(waktu.Month);
Serial.print("/");
Serial.print(waktu.Year);
Serial.print(" ");
Serial.print(waktu.Hour);
Serial.print(":");
Serial.print(waktu.Minute);
Serial.print(":");
Serial.println(waktu.Second);

delay(1000);
}

Praktikum 4

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte i=0;
void setup() {
lcd.begin();

lcd.setCursor(0,0);
lcd.print("TEST LCD i2C Scanner");
lcd.setCursor(0,1);
lcd.print("Praktikum MCU ");
delay(2000);
lcd.Clear();

void loop(){
lcd.setCursor(0,0);
lcd.print(“Count=”);
lcd.print(i);
delay(1000);
}

Praktikum 5

#include <LiquidCrystal_I2C.h>
#include "DS3231_Simple.h" //library tergantung dari RTC yang digunakan

LiquidCrystal_I2C lcd(0x27, 16, 2);


DS3231_Simple Clock;

byte i=0;
void setup() {
lcd.begin();

lcd.setCursor(0,0);
lcd.print("TEST LCD i2C Scanner");
lcd.setCursor(0,1);
lcd.print("Praktikum MCU ");
delay(2000);
lcd.Clear();

void loop(){
DateTime waktu;
waktu = Clock.read();
lcd.setCursor(0,0);

lcd.print(waktu.Day);
lcd.print("/");
lcd.print(waktu.Month);
lcd.print("/");
lcd.print(waktu.Year);
lcd.print(" ");
lcd.print(waktu.Hour);
lcd.print(":");
lcd.print(waktu.Minute);
lcd.print(":");
lcd.println(waktu.Second);

lcd.setCursor(0,1);
lcd.print(“Count=”);
lcd.print(i);
delay(1000);
}
E. Tugas
1. Buatlah program dimana LCD menampilkan nilai iterasi yang dibuat dari 1 hingga
60 dengan waktu jeda sebanyak 1 detik.
2. Butlah program yang menampilkan waktu pada LCD berdasarkan data dari RTC
dengan posisi rata tengah
3. Buatlah pengambilan data sensor sesuai dengan waktu yang ditetapkan dan
ditampilkan via komunikasi serial serta menampilkan data sensor dan aktuator
servo pada LCD

Anda mungkin juga menyukai