ESP32 with Multiple I2C Devices : BMP280 + LCD 1602
ESP32 Project #6
Hello fellows!
Kali ini aku mau sharing tentang Project #6 yang topiknya adalah Communcation Protocol. Terdapat 2 tipe communication protocol, yang seri dan yang paralalel.Contoh communication protocol yang seri ada I2C, SPI, UART, USB, ETHERNET, dan masih banyak lagi. Untuk yang paralel, contohnya ada ISA, PCI, dan lain-lain. Tipe yang paling banyak digunakan untuk pertukaran data antar data processing peripheral adalah serial communication protocol.
Serial communication protocol sendiri memiliki 2 variasi, sinkron (komunikasi bersama diatur dengan clock) dan asinkron (komunikasi tanpa clock sehingga butuh tanda start & end). Komunikasinya pun dapat bersifat full duplex yaitu kedua device dapat mengirimkan data secara bersamaan, atau half duplex yang pengiriman datanya harus bergantian.
Project kali ini yang akan membahas salah satu communication protocol yaitu I2C Communication dengan implementasi pada Multiple I2C Devices. I2C adalah protokol komunikasi serial yang sinkron dengan prinsip master-slave. Sebuah master dapat berkomunikasi dengan multiple slaves, baik melalui 1 bus yang sama ataupun menggunakan bus yang berbeda. Hubungan master dengan multiple slaves dapat menggunakan hanya 1 buah bus dengan syarat address slaves-nya harus berbeda. Dalam percobaan kali ini, kita akan menggunakan ESP32 sebagai master dan slave-nya adalah sensor BMP280 dan I2C LCD 1602. Oiya, by the way, LCD 1602 itu artinya LCD yang luas displaynya 16x2 yaa.
Sebenarnya, di project sebelumnya (Project #5) aku udah coba modifikasi untuk menghubungkan ESP32 dengan BMP280 serta LCD 1602. Ternyata aku jadi selangkah lebih maju daripada materi yang seharusnya. Tapi setelah mendengar penjelasan-penjelasan kuliah kemarin, aku baru sadar ternyata ada beberapa kekurangan pada Project #5:
- LCD 1602 butuh sumber tegangan 5V sehingga seharusnya dihubungkan ke pin VIN pada ESP32. Aku baru tau hal ini waktu dosen menjelaskan di kuliah. Karena aku kemarin salah menghubungkan ke pin 3V3, LCD tetap redup walau kontras sudah maksimal.
- Aku menggunakan 2 breadboard tapi ESP32-nya dipasang di salah satu breadboard saja sehingga wiring-nya sulit dan butuh jumper wire lebih banyak. Karena itu juga pin VIN ga bisa digunakan karena lebar breadboardnya tidak mencukupi (lihat Gambar 1). Sebenarnya aku tetap memasang di 1 breadboard karena jika aku pasang ESP32 di antara 2 breadboard, breadboard menjadi melengkung seperti pada Gambar 2. Namun kali ini aku tetap pindahkan ESP32 dan membiarkan breadboard melengkung karena LCD 1602 membutuhkan pin VIN.
Karena itu, di Project #6 ini, aku hanya akan memperbaiki kesalahan-kesalahan dari modifikasi aku di Project #5.
Komponen yang digunakan kali ini kurang lebih sama dengan yang dipakai sebelumnya, yaitu :
- 1 buah ESP32 Development Board
- 2 buah breadboard
- 1 helai kabel micro-USB
- 4 helai jumper wire male-to-male
- 4 helai jumper wire male-to-female
- 1 buah sensor BMP280
- 1 buah I2C LCD
- 1 buah obeng
Seperti kemarin juga, aku pake warna jumper wire yang sepasang antara male-to-male dan male-to-female untuk memudahkan wiring. Hitam untuk ground, merah untuk sumber tegangan, hijau untuk SDA, dan kuning untuk SCL. Kali ini aku cantumkan obeng juga yang nantinya akan dipakai untuk pengaturan kontras LCD.
Skema kali ini lebih simple, kaya gini aja :
Sebelum masuk ke kodenya, jangan lupa buat lakuin semua ini dulu :
- Install library Adafruit BMP280 dan Adafruit Unified Sensor di Arduino IDE
- Install library LiquidCrystal_I2C dari link ini dan import ke Arduino IDE
- Cek address I2C BMP280 dan LCD dengan kode ini
Untuk cara install library BMP280 dan cek address (untuk kedua komponen kodenya sama) bisa diliat di Story Project #4 dan untuk cara install library I2C LCD bisa dicek di Story Project #5.
Untuk kode program kali ini juga sebenernya sama dengan kode Project #5 yang bagian modifikasi. Kodenya itu :
//Include library untuk BMP280 dan I2C LCD
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include <LiquidCrystal_I2C.h>//BMP280
Adafruit_BMP280 bmp;//I2C LCD
int lcdColumns = 16;
int lcdRows = 2;
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);void setup() {
//Setup BMP280
Serial.begin(9600);
Serial.println(F("BMP280 test")); if (!bmp.begin(0x76)) {
Serial.println(F("Could not find a valid BMP280 sensor, check
wiring!"));
while (1);
} /* Default settings from datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,/* Operating Mode. */
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
Adafruit_BMP280::FILTER_X16, /* Filtering. */
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ //Setup I2C LCD
lcd.init(); //Inisiasi
lcd.backlight(); //Menyalakan backlight LCD
}void loop() {
//Set cursor ke kolom 1 baris 1
lcd.setCursor(0, 0);
//Tampilkan pesan
lcd.print("Temperature =");
//Set kursor ke kolom 1 baris 2
lcd.setCursor(0,1);
//Tampilkan temperatur
lcd.print(bmp.readTemperature());
lcd.print(" *C");
delay(2000);
}
Langkah-langkah merangkai dan eksperimennya bisa dilihat langsung di video ini yaa! Jangan lupa nyalakan CC untuk menampilkan penjelasan langkahnya~
Di video, awalnya aku masih belum mengubah kontras LCD setelah dipakai di Project #5 kemarin. Karena itu, aku harus sesuaiin lagi kontrasnya pakai obeng. Aku turunin kontrasnya supaya ga kotak-kotak di belakang karakter ga keliatan. Buat turunin kontras, kita putar obengnya ke arah kiri ya! Setelah dipasang ke pin VIN yang tegangannya 5V dan kontrasnya diatur, tampilan LCD-ku jadi bagus bangeet! Ga kaya Project #5 kemarin yang redup dan agak ga jelas. Seneng banget sih karena pas kemarin aku ngiranya LCD-ku yang emang kurang bagus karena harganya murah. Ternyata walau murah dia bagus hueheee~
Seperti biasa di video juga aku cek apakah BMP280-nya masih berfungsi dengan baik atau ga dengan memegang sensor untuk melihat responsnya, apakah temperatur naik atau tidak. Ternyata BMP280-ku masih sehat gais:D
Kesimpulannyaa…
Project 6 : Successful!
Review
Menurut aku pribadi, yang perlu diperhatikan dalam Project Multiple I2C Devices ini adalah wiring karena cukup tricky. Harus teliti apakah pin di ESP32 sudah terhubung ke pin di BMP280 dan LCD yang tepat.
Selain dengan I2C devices yang berbeda address, terdapat juga variasi Multiple I2C Devices untuk devices dengan address yang sama. Solusi rangkaiannya bisa dengan cara mengubah I2C address-nya (komponen tertentu), menggunakan I2C Multiplexer, atau menggunakan 2 buah I2C bus interface yang berbeda pada ESP32. Untuk tutorialnya dapat dilihat di website Random Nerd Tutorials.
Untuk cerita Project #6 mungkin segitu dulu yang bisa aku ceritain, semoga bisa membantu kalian yang lagi ngulik ya! Semangat terus walau mungkin sempet gagal. Tetap sabar dan teliti dalam wiring, membuat/modifikasi kode, atau mengamati komponen yang dipakai, siapa tau memang ada cacat fungsionalnya. Pokonya jangan nyerah dan banyak-banyak cari insight tentang masalah yang dihadapi ya! Good luck peeps and see you in the next project~
Adiós amigos!✨