Skip to content
This repository was archived by the owner on Jun 10, 2026. It is now read-only.

Latest commit

 

History

History
781 lines (554 loc) · 26.6 KB

File metadata and controls

781 lines (554 loc) · 26.6 KB

Open Source Love License: MIT GitHub last commit Project Type

Motor Speed RPM - PID Ziegler Nichols 2 - IoT

Dokumentasi Proyek Skripsi - Informatika UPN Veteran Jatim

Di sektor industri, motor konveyor DC biasanya digunakan untuk memindahkan material secara efisien. Mempertahankan kecepatan yang stabil sangat penting untuk memastikan kualitas produk dan kelancaran produksi. Penelitian sebelumnya menghadapi masalah dengan pemilihan mikrokontroler dan implementasi PID yang kurang optimal. Kendali jarak jauh kurang dimanfaatkan, dan integrasi sistem tidak sepenuhnya tersinkronisasi. Kekurangan ini memengaruhi fleksibilitas dan keandalan konveyor. Proyek ini bertujuan untuk meningkatkan kontrol kecepatan dengan integrasi IoT. Mikrokontroler ESP32 mengelola fungsi ON/OFF, arah rotasi, dan setpoint RPM. Ubidots berfungsi sebagai platform pemantauan dan kontrol jarak jauh. Metode PID Ziegler-Nichols diterapkan untuk menstabilkan kecepatan motor. Proyek ini dikembangkan selama satu tahun dan diharapkan dapat meningkatkan efisiensi dan keandalan otomasi industri skala kecil.



Kebutuhan Proyek

Bagian Deskripsi
Papan Pengembangan DOIT ESP32 DEVKIT V1
Editor Kode Arduino IDE 1.8.19 (Versi Lama yang Stabil)
Driver CP210X USB Driver
Platform IoT Ubidots
Protokol Komunikasi • Inter Integrated Circuit (I2C)
• Message Queuing Telemetry Transport (MQTT)
Arsitektur IoT 3 Lapisan
Bahasa Pemrograman C/C++
Pustaka Arduino • WiFi (default)
• PubSubClient oleh Nick O'Leary (Versi: 2.8)
• LiquidCrystal_I2C oleh Frank de Brabander (Versi: 1.1.2)
• ArduinoJson oleh Benoit Blanchon (Versi: 7.4.1)
• ESP32Encoder oleh Kevin Harrington (Versi: 0.11.7)
Aktuator Motor DC JGA25-370 (x1)
Sensor Sensor Encoder (x1)
Layar LCD I2C (x1)
Komponen Lainnya • Kabel USB tipe C - USB tipe A (x1)
• Kabel jumper (1 set)
• Female DC power adapter (x1)
• Tombol tekan 12 x 12 mm (x2)
• Motor driver L298N (x1)
• Potensiometer (x1)
• Adaptor 12V 2A (x1)
• Adaptor 5V 2A (x1)
• Breadboard (x1)
• Kayu triplek 50 x 50 cm (x2)
• Beton Baja Stainless Steel 30 cm (x1)
• Pipa 1/2 Inchi 25 cm (x1)
• Kain Oscar 50 x 137 cm (x1)
• Baut spicer (1 set)
• Baut plus (1 set)
• Mur (1 set)
• Braket L (1 set)
• Isolasi listrik PVC (1 set)
• Amplas G-180 1 m (x1)
• Velg Smart Car (x1)



Unduh & Instal

  1. Arduino IDE

    https://www.arduino.cc/en/software
    

  2. CP210X USB Driver

    https://bit.ly/CP210X_USBdriver
    



Rancangan Proyek

Infrastruktur
infrastructure
Diagram Blok Diagram Ilustrasi
block-diagram pictorial-diagram
Desain Prototipe
prototype-design-1 prototype-design-2
Cetak Biru Sistem Konveyor
blueprint-1 blueprint-2 blueprint-3
Pengkabelan
wiring



Memindai Alamat I2C Yang Ada Pada LCD

/*
  =====================================================
  I2C Scanner untuk Arduino / ESP32 / ESP8266
  by: Devan Cakra Mudra Wijaya, S.Kom.
  =====================================================

  Fungsi:
  - Mendeteksi seluruh perangkat I2C yang terhubung
  - Menampilkan alamat perangkat dalam format HEX
  - Menampilkan jumlah perangkat yang ditemukan


  =====================================================
  Pin SDA dan SCL untuk Arduino / ESP32 / ESP8266
  =====================================================
  Koneksi I2C Arduino (default):
  - Arduino Uno / Nano (ATmega328P)
    SDA -> A4
    SCL -> A5

  - Arduino Mega 2560
    SDA -> D20
    SCL -> D21

  - Board Arduino lainnya
    SDA -> Pin SDA
    SCL -> Pin SCL
    (Lihat datasheet atau pinout board)

  Koneksi I2C ESP32 (default):
  SDA -> GPIO 21
  SCL -> GPIO 22

  Koneksi I2C ESP8266 (default):
  SDA -> GPIO 4 (D2)
  SCL -> GPIO 5 (D1)
*/

// Memanggil library Wire untuk komunikasi I2C
#include <Wire.h>

// Konstanta untuk menentukan jeda antar scan (5000 ms = 5 detik)
const uint32_t SCAN_INTERVAL = 5000;


// Fungsi untuk menginisialisasi komunikasi I2C
// Konfigurasi pin SDA dan SCL akan disesuaikan secara otomatis berdasarkan jenis board yang digunakan
void initI2C() {

  // Jika board yang digunakan adalah ESP32, maka:
  #if defined(ESP32)

    // Mengaktifkan komunikasi I2C
    // SDA = GPIO21
    // SCL = GPIO22
    Wire.begin(21, 22);

  // Jika board yang digunakan adalah ESP8266, maka:
  #elif defined(ESP8266)

    // Mengaktifkan komunikasi I2C
    // SDA = D2 (GPIO4)
    // SCL = D1 (GPIO5)
    Wire.begin(D2, D1);

  // Jika board yang digunakan bukan ESP32 maupun ESP8266
  // Contoh: Arduino Uno, Nano, Mega, Leonardo, dll, maka:
  #else

    // Mengaktifkan komunikasi I2C menggunakan pin hardware bawaan board
    Wire.begin();

  #endif

}


// Fungsi setup() dijalankan satu kali saat board pertama kali menyala atau reset
// Digunakan untuk inisialisasi perangkat keras, komunikasi serial, sensor, modul, dan konfigurasi awal program
void setup() {

  // Memulai komunikasi Serial dengan baud rate 115200
  Serial.begin(115200);

  // Mengecek apakah board menggunakan USB native
  // Contoh: Arduino Leonardo, Arduino Micro, beberapa ESP32-S2/S3
  #if defined(USBCON) || defined(ARDUINO_USB_CDC_ON_BOOT)

    // Jika iya, maka:
    // Program akan menunggu sampai Serial Monitor terhubung sebelum melanjutkan eksekusi program
    while (!Serial);

  #endif

  // Menunggu selama 2 detik sebelum program dimulai
  delay(2000);

  // Menampilkan header program
  Serial.println("====================================");
  Serial.println("         I2C DEVICE SCANNER         ");
  Serial.println("by: Devan Cakra Mudra Wijaya, S.Kom.");
  Serial.println("====================================");

  // Mencetak baris kosong
  Serial.println();

  // Menginisialisasi komunikasi I2C
  initI2C();
}


// Fungsi loop() dijalankan terus-menerus setelah Fungsi setup() selesai
// Seluruh logika utama program biasanya ditempatkan di dalam fungsi ini
void loop() {

  // Variabel untuk menyimpan kode error hasil komunikasi I2C
  uint8_t error;

  // Variabel untuk menyimpan alamat I2C yang sedang diperiksa
  uint8_t address;

  // Variabel penghitung jumlah device yang ditemukan
  uint8_t deviceCount = 0;

  // Menampilkan informasi bahwa proses scan dimulai
  Serial.println("------------------------------------");
  Serial.println("Scanning I2C bus...");
  Serial.println("------------------------------------");

  // Melakukan perulangan dari alamat 1 sampai 126
  // Alamat I2C valid adalah 0x01 sampai 0x7E
  for (address = 1; address < 127; address++) {

    // Memulai komunikasi ke alamat yang sedang diuji
    Wire.beginTransmission(address);

    // Mengakhiri transmisi dan menyimpan hasilnya
    // 0 = sukses
    // 1 = data terlalu panjang
    // 2 = NACK saat alamat dikirim
    // 3 = NACK saat data dikirim
    // 4 = error lain
    error = Wire.endTransmission();

    // Jika tidak ada error, maka:
    if (error == 0) {

      // Menampilkan informasi device ditemukan
      Serial.print("[FOUND] Device at address 0x");

      // Jika alamat kurang dari 16, maka:
      // Tambahkan angka 0 di depan agar format HEX rapi
      if (address < 16) {
        Serial.print("0");
      }

      // Menampilkan alamat dalam format HEX
      Serial.println(address, HEX);

      // Menambah jumlah device yang ditemukan
      deviceCount++;
    }

    // Jika terjadi error tidak dikenal, maka:
    else if (error == 4) {

      // Menampilkan pesan error
      Serial.print("[ERROR] Unknown error at address 0x");

      // Jika alamat kurang dari 16, maka:
      // Tambahkan angka 0 di depan agar format HEX rapi
      if (address < 16) {
        Serial.print("0");
      }

      // Menampilkan alamat yang bermasalah dalam format HEX
      Serial.println(address, HEX);
    }

    // Jika error selain 0 atau 4, maka:
    // Diabaikan, biasanya ini terjadi karena tidak ada perangkat pada alamat tersebut
  }

  // Mencetak baris kosong
  Serial.println();

  // Jika tidak ada device ditemukan, maka:
  if (deviceCount == 0) {

    // Tampilkan pesan tidak ada device
    Serial.println("No I2C devices found.");
  }
  else { // Jika setidaknya satu perangkat ditemukan, maka:

    // Menampilkan jumlah device yang ditemukan
    Serial.print("Total devices found: ");

    // Menampilkan nilai deviceCount
    Serial.println(deviceCount);
  }

  // Menampilkan informasi waktu scan berikutnya
  Serial.print("Next scan in ");

  // Mengubah milidetik menjadi detik
  Serial.print(SCAN_INTERVAL / 1000);

  // Menampilkan satuan detik
  Serial.println(" seconds.");

  // Baris kosong
  Serial.println("\n");

  // Menunggu selama 5 detik sebelum scan ulang
  delay(SCAN_INTERVAL);
}


Kalibrasi CPR

// Library untuk membaca Magnetic/Optical Encoder dengan ESP32
#include <ESP32Encoder.h>

// Channel A dari encoder terhubung ke pin GPIO 34
#define encoderA 34

// Channel B dari encoder terhubung ke pin GPIO 35
#define encoderB 35

// Objek encoder dari library ESP32Encoder
ESP32Encoder encoder;

// Hitungan awal encoder (saat mulai kalibrasi)
long startEncoderCount = 0;      

// Hitungan encoder sebelumnya (untuk menghitung delta)
long lastEncoderCount = 0;

// Selisih antara hitungan sekarang dan sebelumnya
long deltaEncoderCount = 0;

// Count per Revolution (jumlah hitungan dalam satu putaran penuh)
float CPR = 0;

// Pulse per Revolution (jumlah pulsa 1 channel dalam satu putaran)
float PPR = 0;

// Rasio gearbox antara motor dan output shaft
float gearRatio = 0;

// Encoder internal PPR (biasanya 11, tergantung spesifikasi motor)
const float encoderPPR_Internal = 11.0;

// Total perkiraan putaran output shaft
float totalPutaranOutput = 0;

// Target putaran output shaft untuk kalibrasi (default: 1 putaran penuh)
int putaranOutputTarget = 1;

// Status apakah kalibrasi telah selesai
bool kalibrasiSelesai = false;


// Fungsi untuk menampilkan panduan di Serial Monitor
void tampilkanPanduan() {
  Serial.println("================================================");
  Serial.println("                  KALIBRASI CPR                 ");
  Serial.println("================================================");
  Serial.println("Langkah-langkah:");
  Serial.println("1. Pastikan motor dan encoder terhubung.");
  Serial.println("2. Putar shaft OUTPUT searah jarum jam.");
  Serial.println("3. Putar 1x penuh (360 derajat) dengan stabil.");
  Serial.println("4. Tunggu hasil kalibrasi muncul.");
  Serial.println("------------------------------------------------");
}


// Fungsi setup akan dijalankan sekali saat board ESP32 dinyalakan
void setup() {
  
  // Inisialisasi komunikasi Serial dengan baudrate 115200
  Serial.begin(115200);

  // Hubungkan encoder dengan metode Full Quadrature (4x resolusi)
  encoder.attachFullQuad(encoderB, encoderA);

  // Reset hitungan encoder ke 0
  encoder.clearCount();

  // Simpan hitungan awal sebagai referensi
  lastEncoderCount = encoder.getCount();

  // Simpan juga sebagai nilai awal kalibrasi
  startEncoderCount = lastEncoderCount;

  while (!Serial) {
    ; // Tunggu hingga Serial Monitor siap
  }

  // Delay untuk memastikan Serial Monitor benar-benar siap
  delay(5000);
  
  // Tampilkan instruksi kalibrasi ke user
  tampilkanPanduan();
}


// Fungsi loop akan dijalankan berulang kali (secara terus menerus)
void loop() {
  
  // Jika kalibrasi sudah selesai, hentikan loop (tidak lakukan apa-apa)
  if (kalibrasiSelesai) return;

  // Baca nilai hitungan encoder saat ini
  long currentCount = encoder.getCount();
  
  // Hitung perubahan dari pembacaan terakhir
  deltaEncoderCount = currentCount - lastEncoderCount;

  // Estimasi pertambahan putaran output, berdasarkan perubahan hitungan encoder
  // Hanya jika terjadi putaran maju
  if (deltaEncoderCount > 0) {

    // Tambahkan ke total putaran output (500 hanya perkiraan awal)
    totalPutaranOutput += deltaEncoderCount / 500.0;

    // Jika total putaran output sudah mencapai target (misal: 1 putaran penuh)
    if (totalPutaranOutput >= putaranOutputTarget) {
      
      // Tandai kalibrasi selesai
      kalibrasiSelesai = true;

      // Hitungan total encoder selama 1 putaran
      long totalCountSelama1Putaran = currentCount - startEncoderCount;

      // Count Per Revolution
      CPR = (float)totalCountSelama1Putaran;

      // Hitungan per pulsa (karena Full Quad, dibagi 4)
      PPR = CPR / 4.0;

      // Estimasi rasio gearbox
      gearRatio = CPR / (encoderPPR_Internal * 4.0);

      // Bulatkan hasil agar lebih mudah dibaca
      int PPR_bulat = round(PPR);
      int CPR_bulat = round(CPR);
      int gearRatio_bulat = round(gearRatio);

      // Tampilkan hasil kalibrasi
      Serial.println();
      Serial.println("================ HASIL KALIBRASI ===============");
      Serial.print("PPR (Pulse/Revolusi)   =  "); Serial.println(PPR_bulat);
      Serial.print("CPR (Count/Revolusi)   =  "); Serial.println(CPR_bulat);
      Serial.print("Gear Ratio (Motor:Out) =  1:"); Serial.println(gearRatio_bulat);
      Serial.println("================================================");
      Serial.println("✅ Kalibrasi selesai. Gunakan nilai di atas.");
    }
  }

  // Update hitungan encoder terakhir
  lastEncoderCount = currentCount;
}


Pengaturan Arduino IDE

  1. Buka Arduino IDE terlebih dahulu, kemudian buka proyek dengan cara klik File -> Open :

    Main.ino


  2. Isi Url Pengelola Papan Tambahan di Arduino IDE

    Klik File -> Preferences -> masukkan Boards Manager Url dengan menyalin tautan berikut :

    https://dl.espressif.com/dl/package_esp32_index.json
    

  3. Pengaturan Board di Arduino IDE

    Cara mengatur board DOIT ESP32 DEVKIT V1

    • Klik Tools -> Board -> Boards Manager -> Instal esp32.

    • Kemudian pilih papan dengan mengklik: Tools -> Board -> ESP32 Arduino -> DOIT ESP32 DEVKIT V1.


  4. Ubah Kecepatan Papan di Arduino IDE

    Klik Tools -> Upload Speed -> 115200


  5. Instal Pustaka di Arduino IDE

    Unduh semua file zip pustaka. Kemudian tempelkan di: C:\Users\Computer_Username\Documents\Arduino\libraries


  6. Pengaturan Port di Arduino IDE

    Klik Port -> Pilih sesuai dengan port perangkat anda (anda dapat melihatnya di Device Manager)


  7. Ubah Nama WiFi, Kata Sandi WiFi, dan sebagainya sesuai dengan apa yang anda gunakan saat ini.

  8. Sebelum mengunggah program, silakan klik: Verify.

  9. Jika tidak ada kesalahan dalam kode program, silakan klik: Upload.

  10. Beberapa hal yang perlu anda lakukan saat menggunakan board ESP32 :

    • Jika board ESP32 tidak dapat memproses Source Code secara total -> Tekan tombol EN (RST) -> Restart.

    • Jika board ESP32 tidak dapat memproses Source Code secara otomatis maka :

    • Ketika informasi: Uploading... telah muncul -> segera tekan dan tahan tombol BOOT.

    • Ketika informasi: Writing at .... (%) telah muncul -> lepaskan tombol BOOT.

    • Jika pesan: Done Uploading telah muncul -> Program yang diisikan tadi sudah bisa dioperasikan.

    • Jangan tekan tombol BOOT dan EN secara bersamaan karena hal ini bisa beralih ke mode Unggah Firmware.


  11. Jika masih ada masalah saat unggah program, maka coba periksa pada bagian driver / port / yang lainnya.



Pengaturan Ubidots

  1. Memulai Ubidots :

    • Silakan Masuk agar dapat mengakses layanan Ubidots.

    • Jika anda belum memiliki akun Ubidots silakan buat dulu.


  2. Membuat dasbor :

    • Pada bagian Data -> pilih menu Dashboards.

    • Hapus dasbor demo bawaan Ubidots sebelum membuat dasbor baru.

    • Klik Add new Dashboard.

    Name, Tags, Default time range -> sesuaikan dengan kebutuhan anda.

    Dynamic Dashboard -> ubah menjadi Dynamic (Single Device).

    Default Device -> pilih device yang ingin ditampilkan.

    • Pengaturan yang lain biarkan saja -> kemudian klik SAVE.


  3. Membuat widget line chart :

    • Pastikan anda berada di menu Dashboards.

    • Klik + Add new widget.

    • Pilih Line chart untuk visualisasi data.

    • Silakan atur variabel yang ingin anda gunakan pada widget yaitu dengan cara klik + ADD VARIABLE, kemudian klik ✅ Checklist untuk menyimpan.

    • Jika ingin mengubah isi widget, silakan klik simbol pensil -> jika sudah, kemudian klik ✅ Checklist untuk menyimpan.


  4. Membuat widget switch :

    • Pastikan anda berada di menu Dashboards.

    • Klik + Add new widget.

    • Pilih Switch untuk kontrol ON/OFF dan untuk kontrol arah putaran motor DC.

    • Silakan atur variabel yang ingin anda gunakan pada widget yaitu dengan cara klik + ADD VARIABLE, kemudian klik ✅ Checklist untuk menyimpan.

    • Jika ingin mengubah isi widget, silakan klik simbol pensil -> jika sudah, kemudian klik ✅ Checklist untuk menyimpan.


  5. Membuat widget indicator :

    • Pastikan anda berada di menu Dashboards.

    • Klik + Add new widget.

    • Pilih Indicator untuk mengetahui status ON/OFF dan status arah putaran motor DC.

    • Silakan atur variabel yang ingin anda gunakan pada widget yaitu dengan cara klik + ADD VARIABLE, kemudian klik ✅ Checklist untuk menyimpan.

    • Jika ingin mengubah isi widget, silakan klik simbol pensil -> jika sudah, kemudian klik ✅ Checklist untuk menyimpan.


  6. Konfigurasi firmware :

    • Klik bagian User yang ada di pojok kiri bawah -> lalu pilih API Credentials.

    • Salin Default token -> lalu tempelkan pada kode firmware. Contohnya sebagai berikut:

    const String token = "BBUS-aRZvtYRMM7IWbrKFcICR30YYP7dh5Q"; // define ubidots token



Memulai

  1. Unduh dan ekstrak repositori ini.

  2. Pastikan anda memiliki komponen elektronik yang diperlukan.

  3. Pastikan komponen anda telah dirancang sesuai dengan diagram.

  4. Konfigurasikan perangkat anda menurut pengaturan di atas.

  5. Selamat menikmati [Selesai].



Sorotan

Produk
product-1 product-2
Konektivitas Wi-Fi
wifi-connectivity-1 wifi-connectivity-2 wifi-connectivity-3
Konektivitas IoT
iot-connectivity-1 iot-connectivity-2 iot-connectivity-3 iot-connectivity-4
Publish-Subscribe MQTT
pubsub-mqtt-1 pubsub-mqtt-2 pubsub-mqtt-3 pubsub-mqtt-4
Tampilan LCD
lcd-view-1 lcd-view-2 lcd-view-3 lcd-view-4 lcd-view-5
Monitor Serial Plotter Serial
serial-monitor serial-plotter
Kontrol dan Indikator Ubidots Grafik Garis Ubidots
control-indicators line-chart



Informasi lebih lanjut:

• Skripsi : Akses 1 atau Akses 2

• Jurnal : Klik Disini



Apresiasi

Jika karya ini bermanfaat bagi anda, maka dukunglah karya ini sebagai bentuk apresiasi kepada penulis dengan mengklik tombol ⭐Bintang di bagian atas repositori.



Penafian

Aplikasi ini merupakan hasil kerja keras rekan saya yang bernama Hawin, bukan merupakan hasil plagiat dari penelitian atau karya orang lain, kecuali yang berkaitan dengan layanan pihak ketiga yang meliputi: library, framework, dan lain sebagainya. Dalam proyek ini saya hanya bertindak sebagai mentor. Publikasi karya ini telah mendapatkan ijin dari pihak yang bersangkutan sesuai dengan yang telah disepakati di awal, yaitu untuk pengembangan ilmu pengetahuan.



LISENSI

LISENSI MIT - Hak Cipta © 2025 - Moch Hawin Hamami & Devan C. M. Wijaya, S.Kom

Dengan ini diberikan izin tanpa biaya kepada siapa pun yang mendapatkan salinan perangkat lunak ini dan file dokumentasi terkait perangkat lunak untuk menggunakannya tanpa batasan, termasuk namun tidak terbatas pada hak untuk menggunakan, menyalin, memodifikasi, menggabungkan, mempublikasikan, mendistribusikan, mensublisensikan, dan/atau menjual salinan Perangkat Lunak ini, dan mengizinkan orang yang menerima Perangkat Lunak ini untuk dilengkapi dengan persyaratan berikut:

Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus menyertai semua salinan atau bagian penting dari Perangkat Lunak.

DALAM HAL APAPUN, PENULIS ATAU PEMEGANG HAK CIPTA DI SINI TETAP MEMILIKI HAK KEPEMILIKAN PENUH. PERANGKAT LUNAK INI DISEDIAKAN SEBAGAIMANA ADANYA, TANPA JAMINAN APAPUN, BAIK TERSURAT MAUPUN TERSIRAT, OLEH KARENA ITU JIKA TERJADI KERUSAKAN, KEHILANGAN, ATAU LAINNYA YANG TIMBUL DARI PENGGUNAAN ATAU URUSAN LAIN DALAM PERANGKAT LUNAK INI, PENULIS ATAU PEMEGANG HAK CIPTA TIDAK BERTANGGUNG JAWAB, KARENA PENGGUNAAN PERANGKAT LUNAK INI TIDAK DIPAKSAKAN SAMA SEKALI, SEHINGGA RISIKO ADALAH MILIK ANDA SENDIRI.