Pendahuluan
Pengiriman data antar mikrokontroler merupakan salah satu aspek krusial dalam pengembangan proyek berbasis Internet of Things (IoT). Dalam proyek ini, kita akan membahas penggunaan Arduino Uno dan ESP32 untuk mentransfer data menggunakan protokol RS2845. Tujuan akhir pada project kali ini adalah Arduino yang sebagai Master akan mengirimkan 3 data yaitu data Hello World, Counting dan Data Analog Potensio meter dengan format JSON, Kemudian ESP32 Yang sebagai Slave berkerja untuk mendapatkan data tersebut yang nantinya akan di tampilakan di LCD 20×4 dengan module I2C Serial supaya dapat di baca oleh pengguna, disisi lain data counting dan potensiometer berfungsi untuk menyalakan LED dan Motor Servo.
Komponen Yang Digunakan
Berikut komponen yang digunakan dalam project kali ini :
- Arduino UNO – Beli Disini
- ESP32 Dev Board – Beli Disini
- RS485 Module – Beli Disni
- RS485 UART Module – Beli Disini
- Potensiometer 10K Ohm – Beli Disini
- Motor Servo – Beli Disini
- LCD 20×4 + I2C – Beli Disini
Skema Sistem
Berikut adalah skema dari sistem Master (Arduino UNO SMD) dengan module MAX485 dengan Slave (ESP32 Dev Module) dengan MAX485 UART Version,
bisa dilihat pada bagian arduino terdapat data input yaitu pembacaan data analog dari Potensiometer 0-1023. jadi pada percobaan kali ini Arduino dengan MAX485 akan mengirimakan tiga data yaitu data String “Hello World”, data counting dan data dari potensio
dan di ESP32 terdapat aktuator seperti LCD, Servo dan beberapa led. LCD berfungsi untuk menampilkan data yang telah diterima dan di parsing dalam format JSON, Motor servo motor servo akan di gerakan berdasarkan data dari Potensio yang telah dilakukan proses mapping dari 0-1023 menjadi 0-180 supaya dapat digunakan untuk mengatur arah atau derajat putaran di Servo nya sedangkan untuk led akan menyala bergantian berdasarkan data counting yang dikirim dari Arduino
Program ESP32
#include <ArduinoJson.h> // 6.15.2 #include <ESP32Servo.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 20, 4); const int leds[] = {26, 25, 33, 32}; Servo myservo; void setup() { Serial.begin(115200); Serial2.begin(9600); // RX pin, TX pin for Serial2 lcd.init(); lcd.backlight(); for (int ledPin : leds) { pinMode(ledPin, OUTPUT); } // Turn off all LEDs for (int ledPin : leds) { digitalWrite(ledPin, 0); } ESP32PWM::allocateTimer(0); ESP32PWM::allocateTimer(1); ESP32PWM::allocateTimer(2); ESP32PWM::allocateTimer(3); myservo.setPeriodHertz(50); // standard 50 hz servo myservo.attach(13, 500, 2400); // attaches the servo on pin 18 to the servo object // using default min/max of 1000us and 2000us // different servos may require different min/max settings // for an accurate 0 to 180 sweep Serial.println("Project Ready To Use"); } void loop() { // Check if data is available on Serial2 if (Serial2.available()) { // Read the data from Serial2 String jsonString = Serial2.readStringUntil('\n'); // Print the received JSON string to Serial (for monitoring) Serial.println("Received JSON : "); Serial.println(jsonString); // Parse the JSON data StaticJsonDocument<1023> doc; DeserializationError error = deserializeJson(doc, jsonString); // Check for parsing errors if (error) { Serial.print(F("JSON Parsing Error: ")); Serial.println(error.c_str()); return; } // Access the parsed data const char* value1 = doc["data"]; int count = doc["count"]; int potensio = doc["potensio"]; // Turn off all LEDs for (int ledPin : leds) { digitalWrite(ledPin, 0); } // Turn on the specific LED based on value2 if (count >= 0 && count <= 3) { digitalWrite(leds[count], 1); } lcd.setCursor(0, 0); lcd.print("Data 1:"); lcd.print(value1); lcd.setCursor(0, 1); lcd.print("Data 2:"); lcd.print(count); lcd.setCursor(0, 2); lcd.print("Data 3:"); lcd.print(potensio); // Control the servo based on the potentiometer value int servoAngle = map(potensio, 0, 1023, 0, 180); // Map potensio value to servo angle (0 to 180 degrees) myservo.write(servoAngle); // Set the servo position } delay(100); }
Untuk programnya kamu dapat download disini.
Program Arduino Uno
#include <ArduinoJson.h> // 6.15.2 #include <SoftwareSerial.h> #define potensio A0 SoftwareSerial mySerial(2, 3); // RX, TX int count = 0; unsigned long myTimes ; void setup() { Serial.begin(115200); mySerial.begin(9600); pinMode(4, OUTPUT); pinMode(4, 1); } void loop() { if (millis() - myTimes > 100UL) { count++; if (count == 4) { count = 0; } // Create a JSON object StaticJsonDocument<200> doc; doc["data"] = "Hello World!"; doc["count"] = count; doc["potensio"] = analogRead(potensio); // Serialize JSON object to a string String jsonString; serializeJson(doc, jsonString); mySerial.println(jsonString); Serial.println("Sent JSON : "); Serial.println(jsonString); myTimes = millis(); } delay(10); }
Untuk programnya kamu dapat download disini.
Pengujian
Untuk melakukan pengujian pada percobaan ini kita dapat menggunakan Serial monitor pada masing masing perangkat,
Berikut adalah Serial monitor dari Arduino UNO yang kita jadikan sebagai Master pada percobaan kali ini , Disni kita bisa melihata Arduino telah berhasil mengirimakan data ke ESP32 dengan format data JSON per interval 100 Milidetik
Berikut adalah Serial monitor dari ESP32 yang kita jadikan sebagai Slave pada percobaan kali ini , Disini kita bisa melihat data JSON yang dikirim dari arduino sudah berhasil di dapatkan ESP32 dengan menggunakan komunikasi Serial
Kemudian untuk di LCD nya sendiri kita akan melihat data tersebut sudah di parsing dan dapat di lakukan proses Print pada LCD
Kesimpulan
Dengan program ini, Kamu dapat mengimplementasikan komunikasi antar mikrokontroler menggunakan protokol RS2845. Program ESP32 bertindak sebagai penerima data yang dapat mengendalikan perangkat fisik seperti LED dan servo motor, sedangkan Arduino Uno bertindak sebagai pengirim data yang dapat menghasilkan dan mentransfer data dalam format JSON. Dengan demikian, proyek ini dapat menjadi dasar untuk pengembangan lebih lanjut dalam pengaplikasian IoT yang melibatkan perangkat Arduino dan ESP32.
Kalau ada pertanyaan silahkan diskusikan disini yah 🙂