Sistem Embedded Project 11: ESP32 Communication with Two I2C Modules

Justin
4 min readMar 19, 2023

--

Pada project kali ini dalam mengoperasikan ESP32, saya menyambungkan dua modul I2C berupa LCD Display 16x2 dan BMP280 Sensor Module. BMP280 Sensor Module akan membaca temperatur, tekanan, serta ketinggian kemudian akan menampilkannya pada LCD Display 16x2. Referensi yang saya gunakan untuk project ini dapat dilihat pada ESP32 I2C Communication: Set Pins, Multiple Bus Interfaces and Peripherals (Arduino IDE) dan ESP32 and BMP280 sensor example.

I2C (Inter Integrated Circuit) atau biasa dibaca I-squared-C, merupakan protokol komunikasi yang digunakan ESP32 untuk berkomunikasi dengan modul eksternal. ESP32 memiliki 2 I2C bus interface yang dapat berperan sebagai master atau slave. I2C menggunakan dua kabel untuk bertukar informasi, SCL dan SDA. Menyambungkan perangkat I2C ke ESP32 biasanya semudah menyambungkan GND ke GND, SCL ke SCL, SDA ke SDA, dan suatu power supply seperti 3.3V atau 5V. Tabel dibawah dapat digunakan sebagai referensi.

Tabel Referensi Pins Koneksi I2C

Dengan komunikasi I2C, setiap slave memiliki address khusus yang merupakan nomor hexadecimal. Cara mengetahui address perangkat yang digunakan adalah sebagai berikut:

1. Sambungkan kabel USB ke ESP32.
2. Masukkan kode di bawah ini ke Arduino IDE.

#include <Wire.h>

void setup() {
Wire.begin();
Serial.begin(115200);
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.println(address,HEX);
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);
}

3. Pilih board dan port yang sesuai dengan ke kolom Tools Board dan Tools Port kemudian tekan Upload.
4. Bersamaan dengan proses Upload, tekan tombol BOOT pada ESP32.
5. Setelah proses Upload selesai, buka Serial Monitor
6. Address perangkat(-perangkat) I2C akan muncul!

Apabila Anda tidak dapat menemukan address perangkat I2C yang digunakan, coba perhatikan lagi rangkaian Anda apakah sudah sesuai atau belum.

Alat-alat yang dibutuhkan untuk project ini antara lain sebagai berikut:

1. ESP32 (30 pin/38 pin, saya menggunakan yang 38 untuk project ini)
2. Breadboard
3. Laptop dengan Arduino IDE
4. Kabel USB
5. LCD Display
6. BMP280 Sensor
7. Kabel-kabel jumper (Male to Male)
8. Kabel-kabel jumper (Male to Female)

Setelah mempersiapkan barang-barang diatas, buatlah rangkaian project ini dengan mengikuti skema berikut dengan gambar dibawahnya sebagai skema referensi pins pada ESP32 yang saya gunakan.

Rangkaian Komunikasi Dua Perangkat I2C
Skema Referensi Pins ESP32 38 Pin

Setelah merangkai alat-alat yang diperlukan, saya melakukan langkah-langkah berikut agar LCD dapat menampilkan hasil BMP280 Sensor Module:

1. Sambungkan kabel USB ke ESP32 pertama.
2. Masukkan kode di bawah ini ke Arduino IDE.

#include <Adafruit_BMP280.h>
#include <LiquidCrystal_I2C.h>

#define SEA_LEVEL_PRESSURE_HPA 1013.25

// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;

Adafruit_BMP280 bmp280;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

void setup() {
// initialize LCD
lcd.init();
// turn on LCD backlight
lcd.backlight();

// initialize serial for bmp280
Serial.begin(9600);
Serial.println("Initializing BMP280");
boolean status = bmp280.begin(0x76);
if (!status) {
Serial.println("Not connected");
}
}

void loop() {
float temp = bmp280.readTemperature();
float press = bmp280.readPressure() / 100;
float alt = bmp280.readAltitude(SEA_LEVEL_PRESSURE_HPA);

// values on lcd
lcd.setCursor(0,0);
lcd.print("Temperature:");
lcd.setCursor(0,1);
lcd.print(temp);
lcd.print(" C");

delay(2000);
lcd.clear();

lcd.setCursor(0,0);
lcd.print("Pressure:");
lcd.setCursor(0,1);
lcd.print(press);
lcd.print(" Pa");

delay(2000);
lcd.clear();

lcd.setCursor(0,0);
lcd.print("Altitude:");
lcd.setCursor(0,1);
lcd.print(alt);
lcd.print(" m");

delay(2000);
lcd.clear();
}

3. Pilih board dan port yang sesuai dengan ke kolom Tools → Board dan Tools → Port kemudian tekan Upload.
4. Bersamaan dengan proses Upload, tekan tombol BOOT pada ESP32.
5. Setelah proses Upload selesai, LCD akan menampilkan hasil BMP280 Sensor Module!

Project ini bagi saya cukup tricky karena sulit untuk mencari referensi penggunaan modul BMP280. Pada akhirnya, saya menemukan referensi website kedua yang dicantumkan pada awal blog. Kendala yang saya alami berupa Serial Monitor tidak menampilkan hasil BMP280 Sensor Module. Setelah mengetahui website referensi kedua, akhirnya Serial Monitor menampilkan temperatur, tekanan, serta ketinggian dengan BMP280 Sensor Module.

18221016 - Justin Yusuf Abidjoko

--

--