← Back to list

Project 5 : ESP32 Serial Communication

Halo semua! Kenalin aku Muhammad Azikra Wira Pratama dengan NIM 18224089. Aku saat ini sedang berkuliah di ITB dengan prodi Sistem dan…

Muhammad Azikra Wira Pratama · 2026-03-17 04:27 · 0 claps · 5.2 min read
#esp32 #bmp280 #ssd1306
Open on Medium ↗
Wiki topics: 🥊 · Combat Sports

Project 5 : ESP32 Serial Communication

Halo semua! Kenalin aku Muhammad Azikra Wira Pratama dengan NIM 18224089. Aku saat ini sedang berkuliah di ITB dengan prodi Sistem dan Teknologi Informasi. Tujuan ini dibuat untuk sharing seputar project yang aku kerjakan pada ESP32 untuk tugas Mata Kuliah Internet Of Things II2260.

Kita bertemu lagi, jadi disini akan membahas proses untuk menyelesaikan project serial communication pada ESP32. Pada project ini saya melakukan eksperimen komunikasi I2C menggunakan ESP32 dengan dua bagian utama, yaitu melakukan scan alamat I2C dan mencoba menghubungkan lebih dari satu device I2C pada bus yang sama.

Lanjut, disini kita akan menyiapkan alat-alatnya yaitu:

  • ESP32 30 Pin
  • Laptop/PC
  • Breadboard
  • Jumper Wire Male to Male
  • Arduino IDE (Software)
  • OLED SSD1306
  • Sensor BMP280

Progress dan Cara Kerja

Disini saya memfokuskan project ini pada komunikasi I2C. Alasan saya memilih I2C karena pada project sebelumnya saya sudah sempat menggunakan OLED SSD1306 dan BMP280 yang sama-sama dapat berkomunikasi dengan I2C. Maka pada project ini saya lanjutkan dengan mempelajari bagaimana ESP32 membaca alamat I2C dan bagaimana dua device I2C bisa dipasang pada jalur yang sama.

1. Melakukan scan I2C address

Pertama, saya mulai dengan eksperimen scan alamat I2C. Tujuan dari tahap ini adalah untuk mengetahui alamat dari device yang terhubung ke ESP32. Dari project sebelumnya, saya sudah mengetahui bahwa OLED SSD1306 biasanya menggunakan alamat 0x3C, sedangkan BMP280 yang saya gunakan menggunakan alamat 0x76. Hal seperti ini cukup penting, karena jika alamat I2C tidak sesuai maka device tidak akan terbaca atau tidak akan bekerja dengan baik. Hal yang sama juga saya temui pada project OLED dan BMP280 sebelumnya.

Saya mulai dengan menyusun kedua device I2C ke ESP32. Berikut adalah inspirasi rangkaian yang saya gunakan untuk project ini.

Berikut adalah hasil rangkaian yang saya susun pada breadboard.

Untuk scan alamat I2C, saya menggunakan kode sederhana berikut.

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

Setelah kode di-upload ke ESP32, saya membuka Serial Monitor dengan baud rate 115200. Jika komunikasi berjalan dengan baik, maka alamat dari device I2C yang terhubung akan muncul pada Serial Monitor.

Dengan berhasilnya alamat device muncul pada Serial Monitor, menandakan bahwa ESP32 berhasil melakukan pendeteksian alamat I2C dari device yang terhubung.

2. Mempelajari pin I2C default dan mengganti pin I2C

Pada ESP32, pin I2C default yang umum digunakan adalah:

  • SDA = GPIO 21
  • SCL = GPIO 22

Pada project-project sebelumnya, saya menggunakan pin tersebut agar OLED dan BMP280 dapat langsung terbaca. Namun pada project ini saya juga mempelajari bahwa ESP32 cukup fleksibel, sehingga pin I2C bisa dipindahkan ke GPIO lain menggunakan inisialisasi manual.

Contoh kode yang dapat digunakan adalah seperti berikut.

#include <Wire.h>

#define SDA_PIN 18
#define SCL_PIN 19

void setup() {
  Serial.begin(115200);
  Wire.begin(SDA_PIN, SCL_PIN);
  Serial.println("Custom I2C pins started");
}
void loop() {
}

Melalui kode ini, saya jadi memahami bahwa I2C pada ESP32 tidak selalu harus menggunakan GPIO 21 dan GPIO 22. Selama kode dan wiring disesuaikan, komunikasi tetap dapat berjalan.

3. Menghubungkan beberapa device I2C pada bus yang sama

Setelah mencoba scan alamat, saya lanjut ke eksperimen utama yaitu menghubungkan lebih dari satu device I2C pada bus yang sama. Disini saya menggunakan dua device I2C, yaitu:

  • OLED SSD1306 dengan alamat 0x3C
  • BMP280 dengan alamat 0x76

Karena keduanya memiliki alamat yang berbeda, maka keduanya dapat dipasang pada jalur SDA dan SCL yang sama. Untuk koneksinya, kedua device dihubungkan ke:

  • VCC ke 3.3V ESP32
  • GND ke GND ESP32
  • SDA ke GPIO 21
  • SCL ke GPIO 22

Berikut adalah hasil rangkaian yang saya susun pada breadboard.

Setelah semua tersambung dengan baik, saya menggunakan kode untuk membaca data dari BMP280 dan menampilkannya ke OLED. Jadi pada project ini ESP32 bukan hanya mendeteksi alamat, tetapi juga langsung menggunakan dua device I2C secara bersamaan.

Berikut adalah kode yang saya gunakan.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BMP280 bmp;

void setup() {
  Serial.begin(115200);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (1);
  }

  bool status = bmp.begin(0x76);
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }

  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

void loop() {
  display.clearDisplay();

  float temperature = bmp.readTemperature();
  float pressure = bmp.readPressure() / 100.0F; // hPa
  float altitude = bmp.readAltitude(1013.25);   // sesuaikan jika perlu

  // Temperature
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print("Temperature:");
  display.setTextSize(2);
  display.setCursor(0, 10);
  display.print(temperature, 1);
  display.print(" ");
  display.cp437(true);
  display.write(167);
  display.print("C");

  // Pressure
  display.setTextSize(1);
  display.setCursor(0, 35);
  display.print("Pressure:");
  display.setTextSize(1);
  display.setCursor(0, 45);
  display.print(pressure, 1);
  display.print(" hPa");

  display.display();

  delay(1000);
}

Perlu diingat bahwa bagian alamat I2C pada program harus tetap disesuaikan. Dari pengalaman saya sebelumnya, bagian alamat seperti 0x3C pada OLED dan 0x76 pada BMP280 adalah hal yang krusial agar project bisa berjalan dengan baik.

Setelah kode di-upload, BMP280 akan membaca suhu dan tekanan, lalu hasilnya akan ditampilkan pada OLED.

Dengan berhasilnya OLED menampilkan data dari BMP280 juga menunjukkan pembacaan yang sama, menandakan bahwa ESP32 berhasil melakukan komunikasi serial I2C menggunakan lebih dari satu device dalam satu bus yang sama.

Catatan tambahan

Pada tugas ini juga disebutkan kemungkinan jika beberapa device I2C memiliki alamat yang sama. Dari yang saya pelajari, jika dua device memiliki alamat I2C yang sama, maka keduanya tidak bisa langsung dipasang bersamaan pada bus yang sama tanpa solusi tambahan. Salah satu solusi yang biasa digunakan adalah I2C multiplexer seperti TCA9548A, sehingga tiap device bisa dipisahkan ke channel yang berbeda.

Walaupun pada project yang saya kerjakan alamat OLED dan BMP280 berbeda, saya jadi memahami konsep bahwa alamat I2C harus diperiksa terlebih dahulu sebelum menggabungkan beberapa device.

Penutup

Dari project ini, saya jadi memahami bagaimana komunikasi serial I2C bekerja pada ESP32. Mulai dari melakukan scan alamat I2C, mengenali pin default SDA dan SCL, mencoba mengganti pin I2C, sampai menghubungkan dua device I2C pada satu bus yang sama.

Project ini juga membuat saya lebih paham bahwa alamat I2C adalah bagian penting dalam komunikasi antar device. Jika alamat sesuai dan wiring benar, maka ESP32 dapat membaca dan mengelola beberapa device sekaligus dengan baik.

Sumber belajar :

  • Random Nerd Tutorials untuk ESP32 I2C Communication
  • Pengalaman dari project OLED SSD1306 sebelumnya
  • Pengalaman dari project BMP280 sebelumnya

Terimakasih atas perhatiannya.


메타데이터
post_id
0d8f4541daf5
slug
project-5-esp32-serial-communication-0d8f4541daf5
url
https://medium.com/@9j.muhammadazikra/project-5-esp32-serial-communication-0d8f4541daf5
canonical_url
https://medium.com/@9j.muhammadazikra/project-5-esp32-serial-communication-0d8f4541daf5
author_url
https://medium.com/@9j.muhammadazikra
status
ok
fetched_at
2026-07-11 22:26:39