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 :

 

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);
}

Penjelasan Program:

  1. Library dan Objek:
    • Program menggunakan library ArduinoJson untuk parsing JSON, ESP32Servo untuk mengendalikan servo pada ESP32, Wire untuk komunikasi I2C, dan LiquidCrystal_I2C untuk mengendalikan LCD 20×4 melalui I2C.
    • Objek lcd dan myservo digunakan untuk berinteraksi dengan LCD dan servo.
  2. Variabel dan Konfigurasi Pin:
    • Array leds menyimpan pin LED yang akan dikendalikan.
    • Inisialisasi pin dan konfigurasi Serial2 untuk komunikasi dengan Arduino UNO
    • Konfigurasi pin dan timer untuk mengendalikan servo.
  3. Setup Function:
    • Inisialisasi Serial untuk komunikasi dengan Serial Monitor.
    • Inisialisasi LCD dan backlight.
    • Konfigurasi pin LED sebagai output dan matikan semua LED.
    • Alokasi timer PWM untuk mengendalikan servo.
    • Inisialisasi servo dengan parameter tertentu.
  4. Loop Function:
    • Mengecek apakah ada data yang tersedia di Serial2.
    • Jika ada, membaca string JSON dari Serial2.
    • Melakukan parsing JSON menggunakan ArduinoJson.
    • Jika parsing berhasil, mengakses data yang diparse seperti value1, count, dan potensio.
    • Mematikan semua LED.
    • Menghidupkan LED tertentu berdasarkan nilai count.
    • Menampilkan data pada LCD.
    • Mengendalikan

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);
}

Penjelasan Program:

  1. Library dan Objek:
    • Program menggunakan library ArduinoJson untuk mengolah data dalam format JSON dan SoftwareSerial untuk komunikasi serial melalui pin software.
  2. Variabel dan Konfigurasi Pin:
    • potensio adalah pin analog untuk membaca nilai potensiometer.
    • mySerial adalah objek untuk komunikasi serial software yang menggunakan pin 2 sebagai RX dan pin 3 sebagai TX.
    • count untuk menyimpan nilai hitungan.
    • myTimes untuk menyimpan waktu terakhir kali pengiriman data.
  3. Setup Function:
    • Inisialisasi komunikasi serial dengan baud rate 115200 untuk Serial
    • Inisialisasi komunikasi serial dengan ESP32 dengan baud rate 9600 untuk SoftwareSerial.
    • Konfigurasi pin 4 sebagai output dan aktifkan sumber daya (1) untuk enable module RS485
  4. Loop Function:
    • Setiap 100 milidetik, increment nilai count dan jika mencapai 4, reset ke 0.
    • Membuat objek JSON dengan menggunakan library ArduinoJson.
    • Mengisi objek JSON dengan data “Hello World!”, nilai count, dan nilai potensiometer yang dibaca.
    • Mengubah objek JSON menjadi string menggunakan serializeJson.
    • Mengirim string JSON melalui SoftwareSerial untuk dikirim ke ESP32.
    • Menampilkan string JSON pada Serial Monitor untuk pemantauan.
    • Memperbarui waktu terakhir pengiriman.

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.

One thought on “Pengiriman Data Menggunakan Arduino Uno ke ESP32 dengan Protokol Serial RS485”

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *






Hubungi Kami

Hubungi Kami

Kami menyediakan jasa proyek Arduino, Electrical, dan IoT (Internet of Things):
- Penyediaan komponen.
- Perancangan hardware dan software.
- Pemrograman.
- Hingga deploy server.


Cocok untuk hobi, edukasi (skripsi atau tugas akhir), dan industri.
Serahkan kepada kami, Anda tinggal terima hasil jadi!



Hubungi via WhatsApp



Ikuti Kami di TikTok (Inspirasi Project IoT)



Kunjungi YouTube Kami (Tutorial Project IoT)



Temukan Kami di Facebook



Beli Komponen Di GoLite Store