Project 6 — ESP32 Communication Protocol : Integrating Multiple Devices
Halo teman-temann!!
Kembali lagi pada proyek percobaanku menggunakan ESP32. Walaupun dua percobaan sebelumnya sudah membahas sensor dan display, kali ini aku akan bermain-main lagi dengan keduanya. Sensor dan display, keduanya digunakan dalam satu rangkaian.
Percobaan ini sebetulnya ditujukan untuk mendalami protokol komunikasi yang telah digunakan pada percobaan 1 hingga 5. Mungkin, protokol komunikasi yang sudah familiar sejak projek 1 dilakukan adalah UART, I2C, dan SPI. Sejauh ini, protokol yang paling sering digunakan adalah I2C.
ESP32 memiliki dua buah bus untuk melaksanakan protokol I2C, yaitu SCL dan SDA. SCL adalah Serial Clock Line dan SDA adalah Serial Data Line. Kedua jalur ini harus dihubungkan dengan resistor pull-up. Protokol ini mudah diatur karena hanya membutuhkan 2 kabel untuk menghubungkan sebuah perangkat baru. Kedua Mekanisme dari I2C ini adalah master-slave.
Percobaan yang dilakukan adalah berkomunikasi dengan lebih dari satu device dengan protokol komunikasi I2C. Kali ini akan dicoba menghubungkan 3 buah sensor yang dapat mendeteksi temperatur dan menampilkan hasilnya pada OLED.
Komponen yang dibutuhkan pada percobaan ini adalah sebagai berikut.
- ESP32
- Breadboard
- Kabel Jumper
- Sensor BME280
- Sensor BMP180
- Sensor MPU-6050
- OLED Display tipe SSD1306, 0.96 inch, 128x64 pixel
Rangkaian dalam bentuk gambar, kurang lebih adalah seperti berikut.
Rangkaian yang dibuat adalah sebagai berikut.
Setiap pin VCC/VIN/VDD terhubung dengan kabel berwarna merah. Pin GND terhubung dengan kabel berwarna hitam. Pin SDA terhubung dengan kabel berwarna biru, dan SCL dengan kabel berwarna hijau. Terdapat 4 buah device yang perlu disambungkan. BMP180 dan BME280 dapat sekaligus disambungkan seperti pada gambar, pinnya juga saling keterbalikan. Pin yang terhubung pada BMP180 dan BME280 dihubungkan pada OLED. MPU juga dihubungkan dengan OLED. OLED-lah yang akan menghubungkan keempat device dengan ESP32. Sehingga, pada ESP32 hanya ada 4 pin yang digunakan, yaitu pin 3V3, GND, GPIO21, dan GPIO 22.
Program yang dijalankan adalah sebagai berikut.
#include <Wire.h>#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_MPU6050.h>#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixelsAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);Adafruit_BME280 bme;
Adafruit_BMP085 bmp;
Adafruit_MPU6050 mpu;void setup() {
Serial.begin(115200);if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}//BME280
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
// BMP180
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085/BMP180 sensor, check wiring!");
while (1) {}
}
//MPU
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) {}
}
delay(2000);
display.clearDisplay();
display.setTextColor(WHITE);
}void loop() {display.clearDisplay();
// display temperature
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature BME 280: ");
display.setTextSize(1);
display.setCursor(0,10);
display.print(String(bme.readTemperature()));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(1);
display.print("C");display.setTextSize(1);
display.setCursor(0,20);
display.print("Temperature BMP 180: ");
display.setTextSize(1);
display.setCursor(0,30);
display.print(String(bmp.readTemperature()));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(1);
display.print("C");sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
display.setTextSize(1);
display.setCursor(0,40);
display.print("Temperature MPU6050: ");
display.setTextSize(1);
display.setCursor(0,50);
display.print(temp.temperature);
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(1);
display.print("C");display.display();delay(1000);
}
Pada dasarnya, kode di atas merupakan hasil gabungan dari kode-kode yang sudah pernah digunakan pada percobaan sebelumnya. Kode diawali dengan menginclude library dari device yang digunakan, menginisialisasi ukuran OLED, dan membuat objek untuk masing-masing device.
Pada bagian setup, dibuat inisialisasi alamat dari masing-masing device. Untuk BME280, alamat 0x76 didapatkan dari hasil scanning alamat I2C. Tahapan scanning dapat dilihat pada percobaan 4 mengenai external sensor.
https://fathiyyated.medium.com/project-4-external-sensor-b20c0839b2ca
Setelah itu, dilakukan clearDisplay yang berfungsi untuk menghapus apapun yang sudah pernah ditampilkan pada layar.
Pada bagian loop, diset terlebih dahulu ukuran dan posisi dari tulisan. Kemudian, sensor mendeteksi temperatur dan ditampilkan pada layar.
Hasil dari percobaan ini adalah sebagai berikut.
Pada percobaan di atas, semuanya berjalan lancar. Rangkaian dan kode program dapat memunculkan hasil pembacaan sensor. Kendalanya ada pada saat membuat rangkaian, tapi masih bisa tertangani dengan cepat karena saya menggunakan warna kabel yang sama. Sebelum melakukan percobaan diatas, dilakukan terlebih dahulu percobaan dengan 2 sensor. Karena kode dan rangkaiannya sangat mirip, tidak saya masukkan pada laporan. Namun, hasilnya dapat dilihat pada tautan di bawah inii.
Pada percobaan kali ini tidak seperti sebelumnya. Biasanya banyak percobaan yang bisa dilakukan. Sebenarnya sebagian besar percobaan yang ada pada tutorial dapat dilakukan, tapi untuk percobaan dengan menggunakan 2 buah sensor yang sama, tidak dapat dilakukan karena saya hanya punya sensor masing-masing satu buah. Dua buah sensor yang sama bisa digunakan untuk melakukan percobaan dengan alamat I2C yang sama. Sebagai alternatifnya, saya menggunakan sensor BME280 dan BMP280 karena menurut hasil scanning, keduanya memiliki alamat di 0x76. Pada saat mencoba persis seperti yang ada pada https://randomnerdtutorials.com/esp32-i2c-communication-arduino-ide/#1, berhasil dimunculkan pembacaan sensor. Kemudian, saya mencoba melanjutkan percobaan. Percobaan yang ingin saya lakukan adalah menampilkan hasil baca tersebut pada OLED. Hasil akhirnya percobaan ini gagal. Kendala yang dihadapi adalah
- Tidak berhasil untuk memunculkannya pada layar OLED. Walaupun kodenya berhasil di-compile, tidak muncul apapun pada layar OLED.
- Kendala lainnya adalah, pada tutorial disebutkan jika pin SCL dan SDA dapat diganti dengan cara TwoWire, namun, ternyata TwoWire tidak dapat digunakan pada BMP. Akan muncul error ‘invalid conversion from TwoWire* to uint8_t esp32’. Untuk mengakali, akhirnya SCL, SDA pada BMP280 dibuat tetap pada pin 21, 22 dan mengubah SCL, SDA pada BME280, sesuai dengan arahan tutorial bahwa BME dapat menggunakan TwoWire. Tapi hal ini tetap tidak bisa memunculkan hasil pada OLED, walaupun tidak terjadi error pada kode.
- Dibuat juga alternatif lain yaitu membedakan seluruh GPIO SCL SDA dengan menempatkan BMP280 pada pin 21, 22, BME280 pada 33, 32, dan OLED pada 27, 26. Tetap saja belum bisa.
Akhir dari percobaan menggunakan 2 buah device dengan alamat yang sama dengan sebuah display adalah gagal karena saat percobaan, ESP32 sudah tidak bisa terdeteksi oleh komputer.
Sekian percobaanku kali ini, sampai bertemu pada percobaan selanjutnyaa!! :D