ESP32 dapat berkomunikasi antar ESP32 dengan berbagai macam protokol komunikasi, bisa dengan Serial, SPI, Wifi dan sekarang saya akan menulis artikel tutorial cara komunikasi antar ESP32 dengan I2C. Jika dengan Serial kita tidak perlu menggunakan softwareserial karena esp32 memiliki dua buah hardware serial yang bisa kita gunakan selain untuk mengisi program.
Ada beberapa alasan untuk anda lebih memilih komunikasi I2C dibandingkan dengan Komunikasi Serial.
Kelebihan Komunikasi I2C
Salah satu keuntungan menggunakan komunikasi I2C adalah kita hanya memerulkan dua buah kabel untuk menghubungkan antar device, tidak seperti SPI yang membutuhkan paling tidak empat buah kabel untuk dapat melakukan komunikasi data.
Adapun jika dibandingkan serial, komunikasi I2C dapat mempararel koneksi dua kabel antar device jika kita akan menghubungkan ke perangkat dengan komunikasi I2C, dan hanya perlu membedakan alamat nya saja.
Meskipun dengan serial juga bisa, tapi tetap tidak saya rekomendasikan, karena terlalu rumit dalam membuat programnya.
Kekurangan Komunikasi Antar ESP32 dengan I2C
Sangat disesali, saat mencoba komunikasi dua ESP32 dengan menggunakan metode I2C ternyata memiliki kelemahan berupa delay dalam menerima data dari master. begitu pun sebaliknya, saat slave yang mengirim ke master.
Maka master akan membaca data dari slave sangat lama. menurut analisis delay terjadi pada program bagian SLAVE nya.
Dan sampai artikel ini ditulis, belum menemukan metode untuk mengatasi kelemahan ini, sehingga jika dibandingkan dengan komunikasi serial. maka saya pribadi lebih memilih komunikasi serial untuk komunikasi antar esp32.
Cara ESP32 Melakukan Komunikasi I2C
Karena kita membuat kode dengan Arduino IDE maka library yang kita butuhkan sama seperti library untuk arduino biasa yaitu wire.h dan ada tambahan WireSlave.h
Meskipun isi didalam library tersebut berbeda, tapi struktur code atau nama-nama class nya hampir sama dengan library yang untuk arduino.
Contoh Aplikasi Komunikasi Antar ESP32 I2C
Banyak Sekali kegunaan komunikasi dua kabel dengan I2C ESP32. Misalkan saat kita ingin mengontrol dan memonitoring sistem, dimana sistem tersebut sangat sulit menrima jaringan, maka kita bisa menggunakan komunikasi antar ESP32 dengan I2C sebagai pengganti WiFi.
Tutorial langkah-langkah Komunikasi I2C Antar ESP32 I2C
- Siapkan bahan-bahan yang diperlukan untuk uji coba tutorial ini.
- Buat rangkaian seperti pada gambar diatas, yaitu dengan menghubungkan pin SDA dan SCL pada masing-masing ESP32
- Download Library WireSlave.h untuk ESP32
- Buat program dan upload dengan software Arduino IDE
Program dibawah ini saya buat untuk ESP32 Master dan juga ESP32 Slave, namun saya kunci, dan untuk membukanya silahkan lakukan tindakan salah satu dibawah ini !
ESP32 Master I2C Sebagai Pengirim Data
#include <Arduino.h> #include <Wire.h> #include <WirePacker.h> #define SDA_PIN 21 #define SCL_PIN 22 #define I2C_SLAVE_ADDR 0x04 void setup() { Serial.begin(9600); // start serial for output Wire.begin(SDA_PIN, SCL_PIN); // join i2c bus } void loop() { static unsigned long lastWireTransmit = 0; static byte x = 0; // send data to WireSlave device every 1000 ms if (millis() - lastWireTransmit > 1000) { // first create a WirePacker that will assemble a packet WirePacker packer; // then add data the same way as you would with Wire packer.write("x is "); packer.write(x); // after adding all data you want to send, close the packet packer.end(); // now transmit the packed data Wire.beginTransmission(I2C_SLAVE_ADDR); while (packer.available()) { // write every packet byte Wire.write(packer.read()); } Wire.endTransmission(); // stop transmitting x++; lastWireTransmit = millis(); } }
ESP32 Slave I2C Sebagai Penerima Data
#include <Arduino.h> #include <Wire.h> #include <WireSlave.h> #define SDA_PIN 21 #define SCL_PIN 22 #define I2C_SLAVE_ADDR 0x04 void receiveEvent(int howMany); void setup() { Serial.begin(9600); bool success = WireSlave.begin(SDA_PIN, SCL_PIN, I2C_SLAVE_ADDR); if (!success) { Serial.println("I2C slave init failed"); while(1) delay(100); } WireSlave.onReceive(receiveEvent); } void loop() { WireSlave.update(); delay(1); } void receiveEvent(int howMany) { while (1 < WireSlave.available()) // loop through all but the last byte { char c = WireSlave.read(); // receive byte as a character Serial.print(c); // print the character } int x = WireSlave.read(); // receive byte as an integer Serial.println(x); // print the integer }
Hasil Komunikasi Master Slave I2C ESP32
Bisa di analisis, serial monitor bagian kiri adalah slave penerima, dan serial monitor bagian kanan adalah master pengirim, dari hasilnya antara slave dan master data x tidak sinkron atau ada yang hilang.
Itulah kekurangan komunikasi antar ESP32 jika menggunakan metode I2C.
Semoga dapat membantu, dan itulah cara komunikasi antar ESP32 dengan I2C dari anakkendali.com semoga membantu.