ESP32 I2C Communication
Project kali ini akan membahas mengenai komunikasi data menggunakan standar I2C. I2C ( Inter Integrated Circuit; dibaca I-squared-C) merupakan protokol komunikasi sinkron, multi-master, multi-slave. Protokol ini sering digunakan dengan ESP32 untuk berkomunikasi dengan external devices seperti sensor dan display. Pada project ini yang akan dilakukan adalah dengan menghubungkan multiple slaves (external devices) dengan one master (ESP32). Akan digunakan Sensor BMP280 dan OLED Display sebagai external devices.
Hardware Components:
- ESP32 development board
- USB Cable
- Breadboard
- Jumper cable
- OLED display (SSD1306 model: monocolor, 0.96 inch display dengan 128×64 pixels)
- Sensor BMP280
Software:
Arduino IDE
Langkah Pengerjaan
- Instalasi Komponen
Secara detail, Anda dapat mengikuti instalasi pada gambar di bawah ini. Penggunaan breadboard hanya untuk mempermudah peletakkan jumper cable sehingga bersifat opsional. Terakhir, jangan lupa untuk menghubungkan rangkaian ESP32 Anda dengan laptop menggunakan USB Cable.
2. Library BMP280
Sebelum melakukan pengukuran oleh sensor, diwajibkan untuk me-install library BMP280 yang tersedia di Arduino IDE. Buka Tools > Manage libraries. Lalu pada kolom pencarian, ketikkan “BMP280”. Install Adafruit BMP280 Library dengan versi terbaru dengan cara klik Install > Install All
3. Code and Compile
Gunakan code di bawah untuk mulai menjalankan project.
#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
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(115200);
// inisialisasi alamat bme280
bmp.begin(0x76);
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();
}
Di bawah ini merupakan hasil dari keseluruhan project. Jika diperhatikan, terdapat perubahan value pada display ketika sensor disentuh.
Sekian experiment saya mengenai ESP32 I2C Communication, semoga membantu dan selamat bereksplorasi <3