Project: BMP280 with OLED with multiple I2C Interface

Tugus Ibram
4 min readMar 8, 2021

A II2260 Project!

Halo semua! Balik lagi bersama aku, Tugus! Jadi pada project ini, aku bakal nge-recreate project aku di post ini. Sebenarnya pada dasarnya, project ini sama banget kayak yang aku udah sempat post kemarin, cuma saat ini aku mau coba implementasi baru, bisa gak sih BMP280 dan OLED pake interface I2C yang berbeda??

Oke jadi tanpa basa-basi, alat-alat yang kita butuhkan:

  1. ESP32
  2. Arduino IDE
  3. Male to Female jumper cables sebanyak 6 buah
  4. Male to male jumper cables sebanyak 4 buah

Skemanya gimana??

Oke mungkin aku jelasin dulu tentang apa yang kita sebenarnya akan coba lakukan

Jadi, pada project sebelumnya yaitu OLED dan BMP280, aku menggunakan satu I2C interface yaitu GPIO 21(SDA) dan GPIO 22 (SCL) karena merupakan pin default untuk I2C. GPIO 21 dan 22 saya lakukan paralel kepada BMP280 dan OLED. Namun untuk project ini, kita akan menggunakan default I2C interface untuk OLED display dan custom I2C interface pada GPIO 32 dan GPIO 33

Sebelumnya mohon maaf karena saya tidak bisa membuat skema digital, namun berikut fotonya:

Jadi sekiranya mungkin seperti itu skemanya.

Source Code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define I2C_SDA 33
#define I2C_SCL 32
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
TwoWire I2COLED = TwoWire(0);
Adafruit_BMP280 bmp; // I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &I2COLED, -1);
void setup() {
Serial.begin(115200);
I2COLED.begin(I2C_SDA, I2C_SCL, 400000);
// inisialisasi alamat bmp280
if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed or couldn't find a valid bme280"));
for(;;);
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}
void loop() {
delay(5000);
//read temperature and humidity
float t = bmp.readTemperature();
float h = bmp.readPressure();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from bmp sensor!");
}
// clear display
display.clearDisplay();

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

// display pressure
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Pressure: ");
display.setTextSize(2);
display.setCursor(30, 45);
display.print(h/1000);
display.print("kPa");

display.display();
}

Seperti kita lihat diatas, kita melakukan defining custom I2C_SDA dan I2C_SCL dengan kode

#define I2C_SDA 33
#define I2C_SCL 32

Setelah itu, kita membuat sebuah objek Wire, dimana objek wire itu akan menjadi parameter setup OLED display dan Wire

TwoWire I2COLED = TwoWire(0);
Adafruit_BMP280 bmp; // I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &I2COLED, -1);
void setup() {
Serial.begin(115200);
I2COLED.begin(I2C_SDA, I2C_SCL, 400000);

Sisa dari kode dijelaskan dalam post saya di sini.

Analisis & Kendala

Pada project ini, telah banyak tweak yang saya lakukan dan sangat banyak kendala yang terjadi

  1. Tidak ada tutorial yang sesuai dengan project ini

Sebenarnya ada tutorial di randomnerdtutorials yang membicarakan tentang OLED display dengan BME280(bukan BMP280). Namun ternyata, kode program pada BME280 tidak kompatibel dengan BMP280, sehingga saya berusaha mengulik sendiri source code yang compatible di BMP280.

2. Source code yang cukup membingungkan

Pada BME280, kita bisa menggunakan

bme.begin(0x76, &I2CBME);

Untuk mapping I2C kepada sebuah device

Namun di BMP, saya harus mengubahnya menjadi

#define I2C_SDA 33
#define I2C_SCL 32
TwoWire I2CBMP = TwoWire(0);
Adafruit_BMP280 bmp(&I2CBMP); // I2C
void setup() {
Serial.begin(115200);
I2CBMP.begin(I2C_SDA, I2C_SCL, 400000);

Namun saat saya coba untuk upload kode program tersebut, ESP32 tidak mengenali I2C interface tersebut. Saya berulangkali mencoba menjalankan I2C detector, namun hasilnya selalu tidak terdeteksi. Saya sudah coba perbaiki wiring, namun hasilnya nihil. Berikut penampakannya:

OLED menyala, namun tidak dapat membaca hasil pembacaan BMP280 karena tidak terdeteksi sebagai I2C device.

3. Mencoba menukar BMP280 dan OLED display

Akhirnya saya mencoba mengubah GPIO untuk OLED menjadi GPIO 33 dan 32, dan 21 dan 22 untuk BMP dengan harapan saya tidak perlu mengubah kode untuk bmp dari kode yyang ada di post saya sebelumnya. Saya melakukan perubahan dengan:

TwoWire I2COLED = TwoWire(0);
Adafruit_BMP280 bmp; // I2C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &I2COLED, -1);
void setup() {
Serial.begin(115200);
I2COLED.begin(I2C_SDA, I2C_SCL, 400000);

Namun hasilnya sama saja, bahkan lebih parah. Sekarang, OLED display tidak mau menyala.

OLED display tidak menyala karena ditukar GPIO nya

Kesimpulan

Saya gagal untuk menyelesaikan projectnya. Hal ini disebabkan oleh kode program saya yang belum bisa mendeteksi I2C pin yang baru, atau mungkin kesalahan hardware yang saya tidak perhatikan.Mungkin ada hal yang belum saya coba, namun saya cukup lelah karena saya menghabiskan seharian hanya untuk mencoba mengulik kode program pada BMP dan OLED display. Mungkin jika pembaca memiliki saran, akan saya coba. Terima kasih!

--

--