ESP 32: PART 6— COMMUNICATION PROTOCOL AND BUS INTERFACE ESP32
Hai temen-temen semua! Kenalin lagi nih namaku Fahrel. Selamat datang kembali di tulisanku. Kali ini aku mau ngajak kalian untuk bereksperimen dengan Communication Protocol dan Bus Interface ESP32. Oiyaa, sebelumnya buat temen-temen yang mau lihat keseluruhan eksperimenku bisa banget untuk melihat videonya di link berikut ini
Oke jadi secara keseluruhan kita akan membuat 3 eksperimen, yaitu:
- Menampilkan hasil pembacaan sensor BMP280 ke OLED
- Menampilkan hasil pembacaan sensor MPU6050 ke OLED
- Menggabungkan sensor BMP280 dan MPU6050 dan membacanya di serial monitor
EKSPERIMEN
Nah, tanpa terlalu banyak panjang lebar, kita langsung aja masuk ke bagian yang paling ditunggu-tunggu yaitu bagian eksperimen!
1. Menampilkan Hasil Pembacaan Sensor BMP280 ke OLED
Komponen
Daftar komponen dan perangkat yang digunakan adalah sebagai berikut.
- ESP32
- Sensor BMP-280
- Breadboard
- Kabel jumper (male-male dan male-female)
- Kabel USB
Diagram Skema
Gambar diagram skema perangkat keras/ rangkaian sebagai berikut
Kita hubungkan pin GND ESP32 dengan GND pada OLED dan sensor BMP280 dengan menggunakan kabel jumper. Kemudian hubungkan juga pin 3V3 pada ESP32 dengan pin VDD pada OLED dan VCC pada sensor BMP280. Kita hubungkan juga pin SCK pada sensor BMP280 dan OLED dengan pin GPIO 22 pada ESP32. Terakhir, kita hubungkan pin SDA pada sensor BMP280 dan OLED dengan pin GPIO 21 pada ESP32.
Kode Program
Nah, di bagian ini kita akan membuat kode programnya nih! Kode program yang dibuat bisa dilihat seperti ini
// Mengimpor library yang dibutuhkan#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#include <Adafruit_Sensor.h>#include <Adafruit_BMP280.h>#define SCREEN_WIDTH 128 // lebar display OLED#define SCREEN_HEIGHT 64 // tinggi display OLEDAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);Adafruit_BMP280 bmp;void setup() {Serial.begin(115200);// menginisialisasi address bmp280bmp.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);//membaca suhu dan kelembapanfloat t = bmp.readTemperature();float h = bmp.readPressure();if (isnan(h) || isnan(t)) {Serial.println(“Failed to read from bmp sensor!”);}display.clearDisplay();// display suhudisplay.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 tekanandisplay.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();}
Karena OLED dan BMP280 memiliki address yang berbeda, kita dapat menggunakan jalur SDA dan SCL yang sama tanpa masalah. Address OLED adalah 0x3C dan alamat BMP280 adalah 0x76.
Untuk kode program address OLED seperti ini
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println(F(“SSD1306 allocation failed”));for(;;);}
Sedangkan untuk kode program address sensor BMP280 seperti ini
bool status = bmp.begin(0x76);if (!status) {Serial.println(“Could not find a valid BMP280 sensor, check wiring!”);while (1);}
Untuk penjelasan kode program lebih detailnya dan gimana caranya mencari address sensor yang digunakan sudah pernah aku buat di project sebelumnya. Kalian bisa melihatnya di https://fahrelmu.medium.com/esp-32-part-4-external-sensor-9725eaee6085
Eksperimen dan Demo
Nah, setelah kita menulis kode program yang dibuat, kemudian kita compile program yang telah kita buat.
Kita compile atau verify dulu kode program yang kita buat untuk memastikan apakah ada yang error atau enggak.
Last, kita upload deh kode programnya ke ESP32 dengan menghubungkannya dengan connector USB.
Hasil dan Analisis
Dari percobaan di atas bisa kita lihat bahwa sensor mampu membaca parameter suhu dan tekanan dari lingkungan sekitar dan mengirimkan hasilnya untuk ditampilkan ke OLED. Proses komunikasi ini bisa terjadi karena ESP32 sendiri memiliki kemampuan Multiple I2C Devices sehingga dimungkinkan untuk memiliki beberapa perangkat I2C pada bus yang sama.
2. Menampilkan Hasil Pembacaan Sensor MPU6050 ke OLED
Komponen
Daftar komponen dan perangkat yang digunakan adalah sebagai berikut.
- ESP32
- Sensor MPU-6050
- Breadboard
- Kabel jumper (male-male dan male-female)
- Kabel USB
Diagram Skema
Gambar diagram skema perangkat keras/ rangkaian sebagai berikut
Untuk diagram skema percobaan ini, kita hubungkan pin GND ESP32 dengan GND pada OLED dan sensor MPU6050 dengan menggunakan kabel jumper. Kemudian hubungkan juga pin 3V3 pada ESP32 dengan pin VDD pada OLED dan VCC pada sensor MPU6050. Kita hubungkan juga pin SCK pada sensor MPU6050 dan OLED dengan pin GPIO 22 pada ESP32. Terakhir, kita hubungkan pin SDA pada sensor MPU6050 dan OLED dengan pin GPIO 21 pada ESP32.
Kode Program
Nah, di bagian ini kita akan membuat kode programnya nih! Kode program yang dibuat bisa dilihat seperti ini
#include <Adafruit_MPU6050.h>#include <Adafruit_SSD1306.h>#include <Adafruit_Sensor.h>Adafruit_MPU6050 mpu;Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);void setup() {Serial.begin(115200);// while (!Serial);Serial.println(“MPU6050 OLED demo”);if (!mpu.begin()) {Serial.println(“Sensor init failed”);while (1)yield();}Serial.println(“Found a MPU-6050 sensor”);if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C untuk 128x64Serial.println(F(“SSD1306 allocation failed”));for (;;); // loop}display.display();delay(500);display.setTextSize(1);display.setTextColor(WHITE);display.setRotation(0);}void loop() {sensors_event_t a, g, temp;mpu.getEvent(&a, &g, &temp);display.clearDisplay();display.setCursor(0, 0);Serial.print(“Accelerometer “);Serial.print(“X: “);Serial.print(a.acceleration.x, 1);Serial.print(“ m/s², “);Serial.print(“Y: “);Serial.print(a.acceleration.y, 1);Serial.print(“ m/s², “);Serial.print(“Z: “);Serial.print(a.acceleration.z, 1);Serial.println(“ m/s²”);display.println(“Accelerometer — m/s²”);display.print(a.acceleration.x, 1);display.print(“, “);display.print(a.acceleration.y, 1);display.print(“, “);display.print(a.acceleration.z, 1);display.println(“”);Serial.print(“Gyroscope “);Serial.print(“X: “);Serial.print(g.gyro.x, 1);Serial.print(“ rps, “);Serial.print(“Y: “);Serial.print(g.gyro.y, 1);Serial.print(“ rps, “);Serial.print(“Z: “);Serial.print(g.gyro.z, 1);Serial.println(“ rps”);display.println(“Gyroscope — rps”);display.print(g.gyro.x, 1);display.print(“, “);display.print(g.gyro.y, 1);display.print(“, “);display.print(g.gyro.z, 1);display.println(“”);display.display();delay(100);}
Kode program pada eksperimen ini sebetulnya mirip dengan eksperimen yang sudah aku lakukan sebelumnya di project sensor eksternal. Namun, kali ini aku menggunakan OLED untuk menampilkan hasilnya, bukan menggunakan serial monitor lagi. Untuk detail penjelasan kode programnya bisa kalian lihat di https://fahrelmu.medium.com/esp-32-part-4-external-sensor-9725eaee6085
Kode program untuk menginisialisasi sensor MPU-6050 seperti ini.
if (!mpu.begin()) {Serial.println(“Sensor init failed”);while (1)yield();}
Sedangkan kode program untuk menginisialisasi OLED seperti ini.
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internallyif (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x64Serial.println(F(“SSD1306 allocation failed”));for (;;); // loop}display.display();
Eksperimen dan Demo
Hasil dan Analisis
Dari eksperimen ini bisa kita lihat bahwa sensor mampu membaca parameter akselerometer dan giroskop dari lingkungan sekitar dan mengirimkan hasilnya untuk ditampilkan ke OLED. Proses komunikasi ini bisa terjadi karena ESP32 sendiri memiliki kemampuan Multiple I2C Devices sehingga dimungkinkan untuk memiliki beberapa perangkat I2C pada bus yang sama.
3. Menggabungkan Sensor BMP280 dan MPU6050 dan Membacanya di Serial Monitor
Komponen
Daftar komponen dan perangkat yang digunakan adalah sebagai berikut.
- ESP32
- Sensor BMP-280
- Sensor MPU-6050
- Breadboard
- Kabel jumper (male-male dan male-female)
- Kabel USB
Diagram Skema
Gambar diagram skema perangkat keras/ rangkaian sebagai berikut
Skema diagram eksperimen ini kita hubungkan pin SCK dan SDA sensor BMP280 dengan GPIO 32 dan 33 pada ESP32. Kita juga hubungkan pin SCK dan SDA sensor MPU6050 dengan GPIO 22 dan 21 pada ESP32. Lalu kita hubungkan pin GND dan VCC pada kedua sensor dengan pin GND dan 3V3 pada ESP32.
Kode Program
Nah, di bagian ini kita akan membuat kode programnya nih! Kode program yang dibuat bisa dilihat seperti ini
#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_BMP280.h>#include <Adafruit_MPU6050.h>#define SDA_2 33#define SCL_2 32Adafruit_BMP280 bmp;Adafruit_MPU6050 mpu;void setup() {Serial.begin(115200);Serial.println(F(“BMP280 test”));Wire.begin();Wire1.begin(SDA_2, SCL_2);bool status1 = bmp.begin(0x76);if (!status1) {Serial.println(“Could not find a valid BMP sensor, check wiring!”);while (1);}bool status2 = mpu.begin(0x3C);if (!status2) {Serial.println(“Failed to find MPU6050 chip”);while (1) {delay(10);}}Serial.println(“MPU6050 Found!”);mpu.setAccelerometerRange(MPU6050_RANGE_8_G);Serial.print(“Accelerometer range set to: “);switch (mpu.getAccelerometerRange()) {case MPU6050_RANGE_2_G:Serial.println(“+-2G”);break;case MPU6050_RANGE_4_G:Serial.println(“+-4G”);break;case MPU6050_RANGE_8_G:Serial.println(“+-8G”);break;case MPU6050_RANGE_16_G:Serial.println(“+-16G”);break;}mpu.setGyroRange(MPU6050_RANGE_500_DEG);Serial.print(“Gyro range set to: “);switch (mpu.getGyroRange()) {case MPU6050_RANGE_250_DEG:Serial.println(“+- 250 deg/s”);break;case MPU6050_RANGE_500_DEG:Serial.println(“+- 500 deg/s”);break;case MPU6050_RANGE_1000_DEG:Serial.println(“+- 1000 deg/s”);break;case MPU6050_RANGE_2000_DEG:Serial.println(“+- 2000 deg/s”);break;}mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);Serial.print(“Filter bandwidth set to: “);switch (mpu.getFilterBandwidth()) {case MPU6050_BAND_260_HZ:Serial.println(“260 Hz”);break;case MPU6050_BAND_184_HZ:Serial.println(“184 Hz”);break;case MPU6050_BAND_94_HZ:Serial.println(“94 Hz”);break;case MPU6050_BAND_44_HZ:Serial.println(“44 Hz”);break;case MPU6050_BAND_21_HZ:Serial.println(“21 Hz”);break;case MPU6050_BAND_10_HZ:Serial.println(“10 Hz”);break;case MPU6050_BAND_5_HZ:Serial.println(“5 Hz”);break;}Serial.println(“”);delay(100);}void loop() {// membaca BMP280Serial.print(“Temperature from BMP= “);Serial.print(bmp.readTemperature());Serial.println(“ *C”);Serial.print(“Pressure from BMP = “);Serial.print(bmp.readPressure() / 100.0F);Serial.println(“ hPa”);Serial.println(“ — — — — — — — — — — “);// Membaca MPU6050sensors_event_t a, g, temp;mpu.getEvent(&a, &g, &temp);/* Print out the values */Serial.print(“Acceleration X: “);Serial.print(a.acceleration.x);Serial.print(“, Y: “);Serial.print(a.acceleration.y);Serial.print(“, Z: “);Serial.print(a.acceleration.z);Serial.println(“ m/s²”);Serial.print(“Rotation X: “);Serial.print(g.gyro.x);Serial.print(“, Y: “);Serial.print(g.gyro.y);Serial.print(“, Z: “);Serial.print(g.gyro.z);Serial.println(“ rad/s”);Serial.print(“Temperature: “);Serial.print(temp.temperature);Serial.println(“ degC”);Serial.println(“”);delay(500);Serial.println(“ — — — — — — — — — — “);delay(5000);}
Untuk bisa menjalankan kode program di atas, kita membutuhkan beberapa fungsi seperti di bawah ini.
Wire(): untuk menciptakan I2C bus pada default pin GPIO 21 (SDA) and GPIO 22 (SCL)
Wire1(SDA_2, SCL_2): untuk menciptakan I2C bus pada pin SDA_2 and SCL_2
Eksperimen dan Demo
Setelah mengcompile dan mengupload kode program tersebut, tiba-tiba hal yang tak terduga pun terjadi. Tiba-tiba ESP32 yang aku gunakan dalam eksperimen ini menjadi sangat panas dan timbul bau menyengat seperti bau terbakar. Kemudian tiba-tiba ESP32 ku sudah tidak terhubung lagi dengan kabel USB dan ternyata ESP32 ku tidak bisa digunakan lagi.
Sebetulnya, dengan diagram skema dan kode program tersebut, eksperimen ini bisa dijalankan dengan baik sehingga kedua sensor mampu membaca parameter yang ditangkapnya pada waktu yang bersamaan. Namun, sangat disayangkan keadaan yang tidak terduga ini terjadi. Sehingga dengan sangat berat hati, aku tidak bisa menampilkan hasil pada eksperimen ini.
Sebetulnya eksperimen ini bisa dilakukan karena ESP32 memiliki kemampuan menggunakan dua I2C Bus Interfaces. Sehingga pada satu rangkaian, kita bisa menggunakan dua sensor sekaligus.
PERMASALAHAN DAN TROUBLESHOOT
- ESP32 terasa panas dan bau terbakar yang menyengat
Segera cabut ESP32 tersebut dan biarkan selama beberapa waktu hingga tidak panas lagi. Jika sudah tidak panas, coba kita hubungkan lagi dengan menggunakan kabel USB apakah masih panas atau tidak. Satu hal yang penting, coba cek led internal pada ESP32 apakah menyala atau tidak. Jika masih menyala, maka kemungkinan besar ESp32 kalian masih aman dan bisa digunakan lagi. namun, jika LED internalnya sudah mati, maka kemungkinan besar ESP32 tersebut sudah rusak dan tidak bisa dipakai lagi.
2. Langkah yang dilakukan sudah benar tapi OLED belum bisa menampilkan hasilnya.
Solusinya kalian bisa cek lagi wiring yang digunakan apakah sudah benar atau belum dan jangan sampai salah pasang karena bisa jadi berakibat rusaknya ESP32.
3. Muncul error “Could not find a valid bmp 280 sensor, check wiring.”
Kita bisa mencari address I2C yang digunakan kode program seperti pada project sebelumnya. Kalian bisa melihatnya di https://fahrelmu.medium.com/esp-32-part-4-external-sensor-9725eaee6085
Kemudian kita mengatur address dari I2C yang digunakan pada kode BMP280 seperti ini.
if (!bmp.begin(0x76)) {Serial.println(F(“Could not find a valid BMP280 sensor, check wiring!”));while (1);}
Oiya, temen-temen juga bisa melihat troubleshoot dari permasalahan lain di llnk https://randomnerdtutorials.com/esp32-troubleshooting-guide/ dan forum Arduino di https://forum.arduino.cc/
Referensi yang digunakan dalam eksperimen ini adalah
https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/
https://randomnerdtutorials.com/esp32-mpu-6050-accelerometer-gyroscope-arduino/
https://randomnerdtutorials.com/esp32-mpu-6050-accelerometer-gyroscope-arduino/
Jadi, itulah proses pembuatan eksperimen terkait Communication Protocol dan Bus Interface ESP32 dengan menggunakan board microcontroller ESP32. Mudah bukan? Terima kasih buat teman-teman yang sudah menyempatkan waktunya untuk membaca. Jangan lupa untuk jaga kesehatan dan sampai jumpa di tulisan-tulisanku berikutnya! See you next time! #StudyWithFahrel
Penulis,
M. Fahrel Naufal A.
18219067