ESP32 memiliki antarmuka komunikasi I2C yang berfungsi sebagai master maupun slave dalam berkomunikasi dengan device lainnya maupun sensor.
Pada tutorial ini kita akan melihat protokol komunikasi I2C dengan ESP32 menggunakan Arduino IDE : Pin mana yang dikhususkan untuk I2C, menghubungkan beberapa perangkat I2C ke bus yang sama serta bagaimana cara menggunakan protokol komunikasi I2C yang benar.
Dalam tutorial ini, kita akan membahas konsep-konsep berikut:
- Menghubungkan Perangkat I2C dengan ESP32
- Pindai Alamat I2C dengan ESP32
- Gunakan Pin I2C yang Berbeda dengan ESP32 (ubah pin I2C default)
- ESP32 dengan Beberapa Perangkat I2C
- bus yang sama, alamat yang berbeda
- alamat yang sama
- ESP32 Menggunakan Dua Antarmuka Bus I2C
Kami akan memprogram ESP32 menggunakan Arduino IDE, jadi sebelum melanjutkan tutorial ini Anda harus menginstal add-on ESP32 di Arduino IDE Anda. Ikuti tutorial selanjutnya untuk menginstal ESP32 di Arduino IDE, jika Anda belum melakukannya.
Memperkenalkan Protokol Komunikasi I2C pada ESP32
I²C berarti Inter integrated Circuit (diucapkan I-squared-C), dan merupakan protokol komunikasi multi-master, multi-slave yang sinkron. Anda dapat menghubungkan:
- beberapa Slave ke 1 master: misalnya, ESP32 Anda membaca dari sensor AHT10 menggunakan I2C dan menulis pembacaan sensor di layar LCD 16×2 I2C.
- beberapa master mengendalikan slave yang sama: misalnya, dua papan ESP32 menulis data ke LCD 16×2 I2C yang sama.
Kami menggunakan protokol ini berkali-kali dengan ESP32 untuk berkomunikasi dengan perangkat eksternal seperti sensor maupun displau. Dalam kasus ini, ESP32 sebagai master control dan perangkat eksternal lainnya sebagai slave-nya.
Kami memiliki beberapa tutorial dengan antarmuka ESP32 dengan perangkat I2C:
- Layar LCD 16×2 dengan driver PCF8574
- ADS1115 sebagai module extention IO khusus ADC
- AHT10 sebagai module sensor temperatur dan kelembaban
- PCF8574 sebagai extention IO digital 8 IO
Antarmuka Bus ESP32 I2C
ESP32 mendukung komunikasi I2C melalui dua antarmuka bus I2C yang dapat berfungsi sebagai master atau slave I2C, tergantung pada konfigurasi pengguna. Sesuai dengan lembar data ESP32, antarmuka I2C dari ESP32 mendukung:
- Mode standar : 100 Kbit/sec
- Mode cepat : 400 Kbit/sec
- Hingga 5 MHz, namun dibatasi oleh kekuatan pull-up SDA
- Mode pengalamatan 7-bit/10-bit
- Mode pengalamatan ganda. Pengguna dapat memprogram register perintah untuk mengontrol antarmuka I²C, sehingga mereka memiliki lebih banyak fleksibilitas
Menghubungkan Perangkat I2C dengan ESP32
Protokol komunikasi I2C menggunakan dua kabel untuk berbagi informasi. SCL (Serial Clock) digunakan untuk sinyal clock dan SDA (Serial Data) yang digunakan untuk mengirim dan menerima data.
Pada umumnya, jalur SDA dan SCL aktif rendah, sehingga harus di pull up menggunakan resistor agar data yang dikirimkan aman. Nilai tipikal adalah 10k Ohm untuk perangkat 5V dan 2.4k Ohm untuk perangkat 3.3V.
Sebagian besar sensor yang kami gunakan dalam proyek kami adalah papan breakout yang sudah memiliki resistor bawaan. Jadi, biasanya jika Anda berurusan dengan komponen elektronik jenis ini, Anda tidak perlu khawatir tentang hal ini.
Menghubungkan perangkat I2C ke ESP32 mudah, yaitu menghubungkan GND ke GND, SDA ke SDA, SCL ke SCL dan catu daya positif ke periferal, biasanya 3.3V (tetapi itu tergantung pada modul yang digunakan).
ESP32 | Device Slave |
3V3 | 3V3 |
GND | GND |
GPIO22 | SCL |
GPIO21 | SDA |
SCAN Alamat I2C menggunakan ESP32
Dengan komunikasi I2C, setiap slave di bus memiliki alamatnya sendiri, nomor heksadesimal yang memungkinkan ESP32 untuk berkomunikasi dengan setiap perangkat.
Alamat I2C biasanya dapat ditemukan pada datasheet komponen. Namun, jika sulit untuk mengetahuinya, Anda mungkin perlu menjalankan program scanner I2C untuk mengetahui alamat I2C.
Anda dapat menggunakan sketsa berikut untuk menemukan alamat I2C perangkat Anda.
#include <Wire.h> //library untuk pemanggilan komunikasi i2c void setup() { Wire.begin(); //start inisialisasi Serial.begin(9600); Serial.println("nyebarilmu.com"); Serial.println("\nI2C Scanner"); } void loop() { byte eror, alamat; int alat; Serial.println("Scanning..."); alat = 0; for(alamat = 1; alamat < 127; alamat++ ) { Wire.beginTransmission(alamat); eror = Wire.endTransmission(); if (eror == 0) { Serial.print("Perangkat I2C ditemukan pada alamat 0x"); if (alamat<16) { Serial.print("0"); } Serial.println(alamat,HEX); alat++; } else if (eror==4) { Serial.print("Kesalahan tidak diketahui di alamat 0x"); if (alamat<16) { Serial.print("0"); } Serial.println(alamat,HEX); } } if (alat == 0) { Serial.println("Tidak ada perangkat I2C yang ditemukan\n"); } else { Serial.println("Selesai!\n"); } delay(3000); }
Anda akan mendapatkan informasi terkait address i2c device di Serial Monitor Anda. Contoh khusus ini adalah untuk Layar LCD I2C .
ESP32 dengan Beberapa Perangkat I2C
Seperti yang telah kami sebutkan sebelumnya, setiap perangkat I2C memiliki alamatnya sendiri, sehingga dimungkinkan untuk memiliki beberapa perangkat I2C pada bus yang sama.
Beberapa perangkat I2C (bus yang sama, dengan alamat yang berbeda)
Ketika kita memiliki beberapa perangkat dengan alamat yang berbeda, cara mengaturnya merupakan hal yang mudah dengan cara :
- menyambungkan kedua periferal ke jalur ESP32 SCL dan SDA
- dalam kode, dituliskan alamat / address pada masing-masing device
- gunakan library yang sesuai, jika dibutuhkan
Lihatlah contoh berikut yang mendapatkan pembacaan sensor dari sensor AHT10 (melalui I2C) dan menampilkan hasilnya pada layar LCD 16×2 I2C.
[irp posts=”4691″ name=”Cara mengakses sensor AHT10 Sensor Suhu dan kelembaban”]
Koding program :
//www.nyebarilmu.com //2022 //Program Sensor alternatif suhu dan kelembaban AHT10 #include <Adafruit_AHT10.h> #include <LiquidCrystal_PCF8574.h> #include <Wire.h> LiquidCrystal_PCF8574 lcd(0x27); //0x27 cek setting address dan bisa juga di scanner i2c Adafruit_AHT10 aht10; byte derajat_simbol = B11011111; void setup() { Serial.begin(9600); lcd.begin(16, 2); lcd.setBacklight(255); aht10.begin(); } void loop() { sensors_event_t humidity, temp; aht10.getEvent(&humidity, &temp); lcd.setCursor(0,0); lcd.print("Temp:"); lcd.setCursor(5,0); lcd.print(temp.temperature); //hasilnya akan memiliki koma misalnya 32.50 lcd.setCursor(9,0); lcd.write(derajat_simbol); lcd.setCursor(10,0); lcd.print("C"); lcd.setCursor(12,0); lcd.print(" "); lcd.setCursor(0,1); lcd.print("Humd:"); lcd.setCursor(5,0); lcd.print(humidity.relative_humidity); lcd.setCursor(9,0); lcd.print("% rH"); delay(500); }
Contoh cara Mengubah alamat I2C
Banyak papan breakout memiliki opsi untuk mengubah alamat I2C tergantung pada sirkuitnya. Sebagai contoh, itulah tampilan layar LCD 16×2 berikut ini.
[irp posts=”742″ name=”Cara mengakses modul display LCD 16×2″]

ESP32 Menggunakan Dua Antarmuka Bus I2C dengan 2 device yang sama
Pada contoh terakhir ini, akan dibahas tentang bagaimana cara menggunakan device yang sama yang menggunakan komunikasi i2c lebih dari 2 device atau lebih.
Misal yang akan digunakan yaitu LCD 16×2 dengan driver PCF8574. Langkah pertama yaitu harus setting address dengan beda,
Contohnya seperti gambar dibawah ini, solder pada bagian A0,A1,dan A2 untuk menentukan address i2c masing-masing device.
Pada gambar diatas driver PCF8574 disetting dengan address yang berbeda yaitu 0x20 dan 0x21, sehingga memungkinkan untuk penulisan pada LCD tersebut dengan job program yang berbeda pula.
Program koding
#include <LiquidCrystal_PCF8574.h> //library LCD yang digunakan dapat dilihat di link diatas #include <Wire.h> LiquidCrystal_PCF8574 lcd1(0x20); // Address LCD 1st LiquidCrystal_PCF8574 lcd2(0x21); // Address LCD 2nd void setup() { int error; Serial.begin(9600); Serial.println("Trial 2 LCD beda adddress / alamat i2c"); lcd1.clear(); lcd2.clear(); } void loop() { //program ini menulis ditiap LCD dengan kata "HELLO LCD" dan backlight LED akan berkedip lcd1.setBacklight(255); lcd2.setBacklight(255); lcd1.print("Hello LCD 1st"); lcd2.print("Hello LCD 2nd"); delay(3000); lcd1.setBacklight(0); lcd2.setBacklight(0); delay(1000); }
Terimakasih, salam nyebarilmu.com!