6th Embedded System Project: Communication Protocol and Bus Interface
Halo, teman-teman! Kembali lagi di project sistem embedded! Pada project yang keenam ini, kita akan membuat rangkaian gabungan BME280 (yang aku kerjakan pada project keempat) dan OLED SSD1306 (yang aku kerjakan pada project kelima) sebagai implementasi dari communication protocol dan bus interface.
Communication protocol didefinisikan sebagai seperangkat aturan yang ditetapkan antara node untuk bertukar informasi dengan cara yang andal dan aman. Terdapat tiga jenis communication protocol yang paling umum digunakan, yaitu Inter-Integrated Circuit (I2C), Serial Peripheral Interface (SPI), dan Universal Asynchronous Receiver-Transmitter (UART). Ketiganya memiliki metode yang berbeda-beda dalam menerima dan mengirim data.
Sementara itu, bus interface diartikan sebagai sekumpulan pin dan sinyal yang digunakan untuk menghubungkan mikrokontroler ke perangkat eksternal. Pada project ini, perangkat eksternal yang akan digunakan adalah OLED SSD1306 dan sensor BME280. Keduanya memiliki communication protocol berjenis I2C yang memiliki 2 pin interface, yaitu SDA (Serial Data) dan SCL (Serial Clock).
Project Description
Project ini dilakukan untuk memindai alamat I2C pada perangkat eksternal dan juga bereksperimen dengan beberapa perangkat I2C. Seperti yang disampaikan sebelumnya, project ini akan bereksperimen dengan OLED SSD1306 dan sensor BME280 yang merupakan perangkat I2C. Seperti yang sudah pernah dilakukan pada dua project sebelumnya, kombinasi dua perangkat ini akan mengukur suhu lingkungan di sekitar sensor BME280 dan menunjukkannya pada display OLED.
Tools and Software
Alat yang dibutuhkan untuk project ini merupakan gabungan antara project 4 dan 5, yaitu
- ESP32
- OLED SSD1306
- BME280
- Breadboard
- Jumper Cable
- Arduino IDE
Steps and Result
Untuk rangkaian, kalian perlu menyambungkan pin pada ESP32, OLED, dan BME280 menggunakan jumper cable. Untuk mempermudah penyambungan, kalian dapat mengikuti ilustrasi rangkaian di bawah ini.
Pada breadboard, kalian perlu memastikan jumper cable yang terpasang menghubungkan pin yang tepat. Apabila pin pada OLED terhubung langsung dengan ESP32, maka pastikan jumper cable yang menyambungkan pin pada OLED dan pin pada BME280 paralel dengan jumper cable yang menyambungkan pin pada OLED dan pin pada ESP32.
Setelah rangkaian selesai dibuat, sekarang kita akan berlanjut ke kode program. Karena project ini merupakan gabungan antara project 4 dan lima, maka kita perlu menggabungkan kode program yang digunakan pada project 4 dan kode program yang digunakan pada project 5.
Berikut ini adalah kode program yang telah dibuat untuk megeksekusi eksperimen pada project 6
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
bool status = bmp.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
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: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(String(bmp.readTemperature()));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display Altitude
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Altitude: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(String(bmp.readAltitude()));
display.print(" m");
display.display();
delay(1000);
}
Dari kode di atas, aku membuat sedikit modifikasi dengan menambahkan fitur perubahan warna latar dan font pada layar ketika suhu mencapai di atas 30 derajat
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS (10)
Adafruit_BMP280 bmp; // I2C
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
bool status = bmp.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
while (1);
}
delay(2000);
display.clearDisplay();
}
void loop() {
display.clearDisplay();
int temp = bmp.readTemperature();
if (temp < 30) {
display.setTextColor(WHITE);
} else {
display.fillScreen(WHITE);
display.setTextColor(BLACK);
}
// display temperature
display.setTextSize(1);
display.setCursor(0,0);
display.print("Temperature: ");
display.setTextSize(2);
display.setCursor(0,10);
display.print(String(bmp.readTemperature()));
display.print(" ");
display.setTextSize(1);
display.cp437(true);
display.write(167);
display.setTextSize(2);
display.print("C");
// display Altitude
display.setTextSize(1);
display.setCursor(0, 35);
display.print("Altitude: ");
display.setTextSize(2);
display.setCursor(0, 45);
display.print(String(bmp.readAltitude()));
display.print(" m");
display.display();
delay(1000);
}
Pada kode yang aku buat di atas, nantinya tampilan pada OLED akan berubah seiring bertambahnya suhu. Berikut ini merupakan hasil display pada OLED ketika BME280 disentuh.
Terlihat pada hasil di atas suhu akan naik ketika BME280 disentuh.
Sementara itu, pada kode modifikasiku, warna latar layar pada OLED akan berubah menjadi warna putih dan warna font berubah menjadi warna hitam ketika suhu yang dibaca mencapai lebih dari 30 derajat celcius.
Terlihat pada hasil di atas warna layar dan font yang asalnya berwarna putih (latar) dan hitam (font) akan menjadi hitam (latar) dan putih (bumi} ketika suhu menurun dan berada di bawah 30 derajat celcius.
Conclusion
Project ini dapat dibilang cukup menantang apabila dibandingkan dengan project-project sebelumnya. Hal ini disebabkan kode yang aku buat perlu menggabungkan kode yang digunakan pada project 4 dan 5 sehingga aku perlu memastikan urutan pengeksekusian kode benar. Di samping itu, aku masih senang dapat mengerjakan project ini karena aku menjadi tahu cara kerja perangkat I2C yang terhubung dengan ESP32.
See you on the next project!