Communication Protocol adalah bagian penting dari komunikasi data. Protocol ini memungkinkan perangkat untuk berkomunikasi satu sama lain dengan cara yang terstruktur dan efisien. ada beberapa jenis serial communication protocol diantaranya adalah I2C, SPI, UART, USB, dan Ethernet Masing-masing memiliki kelebihan dan penggunaannya sendiri:

I2C (Inter-Integrated Circuit):

  • Protokol sederhana dan hemat biaya, ideal untuk komunikasi jarak pendek dan kecepatan rendah antar chip terpadu (IC) pada perangkat elektronik.
  • Memiliki dua kabel sinyal (Serial Clock (SCL) dan Serial Data (SDA)) untuk komunikasi dua arah. Digunakan untuk menghubungkan mikrokontroler dengan peripheral seperti sensor, memori, dan display.

SPI (Serial Peripheral Interface):

  • Protokol sinkron lebih cepat dari I2C, cocok untuk transfer data moderat antar perangkat.
  • Membutuhkan lebih banyak kabel sinyal dibanding I2C (biasanya 4) untuk komunikasi penuh.
  • Digunakan untuk antarmuka LCD, kartu SD, dan konverter Analog-to-Digital (ADC).

UART (Universal Asynchronous Receiver Transmitter):

  • Protokol komunikasi serial asynchronous sederhana untuk transmisi data byte-by-byte.
  • Biasanya digunakan untuk komunikasi dengan perangkat eksternal seperti komputer atau terminal melalui port serial.
  • Digunakan pada modul GPS, modul Bluetooth, dan komunikasi dengan mikrokontroler pada board pengembangan.

USB (Universal Serial Bus):

  • Protokol yang kompleks dan serbaguna untuk menghubungkan dan memberi daya ke berbagai perangkat periferal ke komputer.
  • Menyediakan transfer data berkecepatan tinggi dan dukungan untuk berbagai jenis perangkat.
  • Digunakan untuk menghubungkan mouse, keyboard, flash drive, printer, dan banyak lagi.

Ethernet:

  • Protokol jaringan area lokal (LAN) yang memungkinkan perangkat untuk berkomunikasi satu sama lain melalui jaringan kabel.
  • Standar untuk komunikasi internet dan jaringan area lokal berkecepatan tinggi.
  • Digunakan untuk menghubungkan komputer, printer, router, dan perangkat lain ke jaringan.

I2C, yang diucapkan sebagai "eye-squared-see" atau "eye-two-see", bisa juga ditulis sebagai I2C atau IIC, adalah protokol komunikasi serial sinkron, multi-master/multi-slave (controller/target), single-ended yang ditemukan pada tahun 1982 oleh Philips Semiconductors.

Singkatnya, I2C adalah antarmuka yang memungkinkan chip untuk berkomunikasi satu sama lain. Ini berguna untuk menghubungkan sirkuit terpadu (IC) dengan mudah ke motherboard, sistem tertanam, dan perangkat lain yang membutuhkan komunikasi data antar chip.

Beberapa hal penting tentang I2C:
Serial: Data ditransmisikan satu bit pada satu waktu, tidak seperti transfer paralel di mana beberapa bit dikirim secara bersamaan.
Multi-master/multi-slave: Beberapa perangkat (master) dapat memulai komunikasi dengan perangkat lain (slave) pada bus I2C. Namun, pada umumnya hanya satu master yang aktif pada satu waktu untuk menghindari tabrakan data.
Single-ended: Hanya menggunakan dua kabel sinyal, yaitu Serial Clock (SCL) dan Serial Data (SDA), untuk komunikasi dua arah. Master dan slave berbagi kedua jalur ini.<br? I2C banyak digunakan untuk menghubungkan mikrokontroler dengan peripheral seperti sensor, memori, dan display.

Beberapa contoh penggunaan I2C termasuk:

  • Membaca data dari sensor seperti sensor suhu atau accelerometer.
  • Mengontrol aktuator seperti LED atau motor Mengkonfigurasi perangkat seperti RTC (real-time clock) atau display.
  • Membaca dan menulis data dari memori eksternal.

I2C adalah protokol yang cukup sederhana dan hemat biaya, menjadikannya pilihan yang baik untuk komunikasi antar chip pada jarak pendek dan kecepatan rendah.

So,... Pada project ke 6 ini kita akan mencoba menghubungkan lebih dari 1 perangkat yang menggunakan protokol komunikasi I2C, yaitu Sensor BMP280 dan Display OLED 1306, selain itu kita gabungkan dengan project sebelumnya yaitu dengan menambahkan LED. Dimana kita akan menampilkan Temperatur ruangan ke Display OLED, dan akan kita berikan indikator melalui LED, dimana bila suhu melebihi 30 oC, maka LED Warna merah akan menyala, bila suhu kembali normal (dibawah 30 derajat), maka LED warna Hijau yang akan menyala.

Perangkat

  • Breadboard
  • ESP32 Devkit V1
  • Sensor BMP280
  • Display OLED 1306
  • 2 buah LED (warna merah dan hijau)
  • 2 buah resistor 330 ohm
  • Jumper Male to Male

Skema

Untuk rangkaian kita bisa mengikuti seperti yang ada pada gambar berikut :

enter image description here

dan jangan lupa kita perlu menginstal Adafruit BMP280 dan Adafruit Unified Sensor seperti yang telah kita bahas pada project-04 dan juga kita harus mengeCek address I2C BMP280 dan OLED Display, cara mengeceknya bisa mengikuti artikel i2c Scanning

Kode

Kode berikut silahkan di copy paste pada Arduino IDE, compiling dan upload.

#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

//deklarasi LED Pin1 dan Pin2
const int ledPin1 = 16;
const int ledPin2 = 17;

void setup() {
  Serial.begin(115200);
// inisialisasi alamat bmp280
  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);

// set pin LED Indikator
pinMode (16, OUTPUT); //LED Warna Merah
pinMode (17, OUTPUT); // LED Warna Hijau

}
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();
  //Set If Logic LED
  if (bmp.readTemperature() > 30 ) {
    digitalWrite (16, HIGH);
    digitalWrite (17, LOW);
  } else {
    digitalWrite (16, LOW);
    digitalWrite (17, HIGH);  
  }
  // 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(); 
}

compiling done! upload done!

Demo

berikut video demo hasil ujicoba : pada suhu masih dibawah 30 derajat, LED yang menyala warna Hijau, coba kita menyentuh sensornya agar suhu (temperature) bisa naik, kita perhatikan pada OLED saat suhu menunjukan 30 derajat keatas, maka LED warna Merah akan menyala.


Communication Protocol SPI

Disini saya mencoba menghubungkan 2 buah devices yang sama untuk melakukan komunikasi secara bersama sama. saya menggunakan 2buah BMP280 dihubungkan ke ESP32 langsung saja kita lihat rangkaiannya sebagaimana ditunjukan oleh gambar berikut : enter image description here

dimana koneksivitas pinnya ditunjukan oleh tabel berikut : enter image description here

Kode yang akan gunakan adalah :

/***************************************************************************
  This is a test code for two pressure sensors connected to one Arduino 
  Nano. The code measures the pressure of each sensor and prints the
  difference as P(S2)-P(S1).
 ***************************************************************************/

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>

#define S1_SCK 14
#define S1_MISO 12
#define S1_MOSI 13
#define S1_CS 15

#define S2_SCK 18
#define S2_MISO 19
#define S2_MOSI 23
#define S2_CS 5

//Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
Adafruit_BMP280 bmp1(S1_CS, S1_MOSI, S1_MISO,  S1_SCK);
Adafruit_BMP280 bmp2(S2_CS, S2_MOSI, S2_MISO,  S2_SCK);

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));

  if (!bmp1.begin()) {  
    Serial.println("Could not find a valid BMP280 sensor (Sensor 1), check wiring!");
    while (1);
  }
  if (!bmp2.begin()) {  
    Serial.println("Could not find a valid BMP280 sensor (Sensor 2), check wiring!");
    while (1);
  }
}

void loop() {
  Serial.print(F("Temperature sensor 1 = "));
  Serial.print(bmp1.readTemperature());
  Serial.println(" *C");

  Serial.print(F("Pressure sensor 1 = "));
  Serial.print(bmp1.readPressure());
  Serial.println(" Pa");

  Serial.print(F("Approx altitude sensor 1 = "));
  Serial.print(bmp1.readAltitude(1013.25)); /* Adjusted to local forecast! */
  Serial.println(" m");

  Serial.println();
  delay(2000);

  Serial.print(F("Temperature sensor 2 = "));
  Serial.print(bmp2.readTemperature());
  Serial.println(" *C");

  Serial.print(F("Pressure sensor 2 = "));
  Serial.print(bmp2.readPressure());
  Serial.println(" Pa");

  Serial.print(F("Approx altitude sensor 2 = "));
  Serial.print(bmp2.readAltitude(1013.25)); /* Adjusted to local forecast! */
  Serial.println(" m");

  Serial.println();
  delay(2000);
}

Setelah berhasil kita upload kode diatas, kita pantau hasilnya melalui serial monitor

Troubleshooting

untuk menghubungkan 2 devices atau lebih sebenarnya bisa dilakukan dengan beberapa alternatif, seperti menggunakan alat bantu yang namanya multiplexer, alternatif berikutnya adalah agak extrim yaitu melakukan switch pada komponen sensornya, yaitu dengan melakukan penyolderan), berhubung saya tidak mempunyai hal tersebut dan juga tidak mahir dalam hal penyolderan, maka ada alternatif ketika yaitu dengan membedakan pin masing masing sensor. untuk SPI, tidak bermasalah, karna pada dasarnya komunikasi menggunakan SPI tdk memerlukan identifikasi address dari devices yang digunakan, tidak seperti halnya pada komunkasi I2C, hanya pada I2C untuk sensor BMP280 saat saya melakukan percobaan ini, mengalami kegagalan, sy mencoba melakukan modifikasi kode yang telah jalan pada BME280 sesuai tutorial pada RandomTutorial, tidak berhasil, dimana variabel TwoWire tidak berfungsi seperti halnya pada BME.

Hope

Semoga catatan ini bisa bermanfaat untuk kita, terutama untuk saya juga, agar saya juga bisa mengingat apa yang pernah saya kerjakan di hari mendatang.