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.
| 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) |
-
Arduino IDE
https://www.arduino.cc/en/software
-
CP210X USB Driver
https://bit.ly/CP210X_USBdriver
| Infrastruktur |
|---|
![]() |
| Diagram Blok | Diagram Ilustrasi |
|---|---|
![]() |
![]() |
| Desain Prototipe | |
|---|---|
![]() |
![]() |
| Cetak Biru Sistem Konveyor | ||
|---|---|---|
![]() |
![]() |
![]() |
| Pengkabelan |
|---|
![]() |
/*
=====================================================
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);
} |
// 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;
} |
-
Buka
Arduino IDEterlebih dahulu, kemudian buka proyek dengan cara klikFile->Open:Main.ino
-
Isi
Url Pengelola Papan Tambahandi Arduino IDEKlik
File->Preferences-> masukkanBoards Manager Urldengan menyalin tautan berikut :https://dl.espressif.com/dl/package_esp32_index.json
-
Pengaturan Boarddi Arduino IDECara mengatur board
DOIT ESP32 DEVKIT V1• Klik
Tools->Board->Boards Manager-> Instalesp32.• Kemudian pilih papan dengan mengklik:
Tools->Board->ESP32 Arduino->DOIT ESP32 DEVKIT V1.
-
Ubah Kecepatan Papandi Arduino IDEKlik
Tools->Upload Speed->115200
-
Instal Pustakadi Arduino IDEUnduh semua file zip pustaka. Kemudian tempelkan di:
C:\Users\Computer_Username\Documents\Arduino\libraries
-
Pengaturan Portdi Arduino IDEKlik
Port-> Pilih sesuai dengan port perangkat anda(anda dapat melihatnya di Device Manager)
-
Ubah
Nama WiFi,Kata Sandi WiFi, dan sebagainya sesuai dengan apa yang anda gunakan saat ini. -
Sebelum mengunggah program, silakan klik:
Verify. -
Jika tidak ada kesalahan dalam kode program, silakan klik:
Upload. -
Beberapa hal yang perlu anda lakukan saat menggunakan
board ESP32:• Jika
board ESP32tidak dapat memprosesSource Codesecara total -> Tekan tombolEN (RST)->Restart.• Jika
board ESP32tidak dapat memprosesSource Codesecara otomatis maka :-
Ketika informasi:
Uploading...telah muncul -> segera tekan dan tahan tombolBOOT. -
Ketika informasi:
Writing at .... (%)telah muncul -> lepaskan tombolBOOT.
• Jika pesan:
Done Uploadingtelah muncul ->Program yang diisikan tadi sudah bisa dioperasikan.• Jangan tekan tombol
BOOTdanENsecara bersamaan karena hal ini bisa beralih ke modeUnggah Firmware.
-
-
Jika masih ada masalah saat unggah program, maka coba periksa pada bagian
driver/port/yang lainnya.
-
Memulai Ubidots :
• Silakan Masuk agar dapat mengakses layanan
Ubidots.• Jika anda belum memiliki akun
Ubidotssilakan buat dulu.
-
Membuat dasbor :
• Pada bagian
Data-> pilih menuDashboards.• 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 menjadiDynamic (Single Device).•
Default Device-> pilih device yang ingin ditampilkan.• Pengaturan yang lain biarkan saja -> kemudian klik
SAVE.
-
Membuat widget line chart :
• Pastikan anda berada di menu
Dashboards.• Klik
+ Add new widget.• Pilih
Line chartuntuk visualisasi data.• Silakan atur variabel yang ingin anda gunakan pada widget yaitu dengan cara klik
+ ADD VARIABLE, kemudian klik✅ Checklistuntuk menyimpan.• Jika ingin mengubah isi widget, silakan klik simbol
pensil-> jika sudah, kemudian klik✅ Checklistuntuk menyimpan.
-
Membuat widget switch :
• Pastikan anda berada di menu
Dashboards.• Klik
+ Add new widget.• Pilih
Switchuntuk 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✅ Checklistuntuk menyimpan.• Jika ingin mengubah isi widget, silakan klik simbol
pensil-> jika sudah, kemudian klik✅ Checklistuntuk menyimpan.
-
Membuat widget indicator :
• Pastikan anda berada di menu
Dashboards.• Klik
+ Add new widget.• Pilih
Indicatoruntuk 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✅ Checklistuntuk menyimpan.• Jika ingin mengubah isi widget, silakan klik simbol
pensil-> jika sudah, kemudian klik✅ Checklistuntuk menyimpan.
-
Konfigurasi firmware :
• Klik bagian
Useryang ada di pojok kiri bawah -> lalu pilihAPI Credentials.• Salin
Default token-> lalu tempelkan pada kode firmware. Contohnya sebagai berikut:const String token = "BBUS-aRZvtYRMM7IWbrKFcICR30YYP7dh5Q"; // define ubidots token
-
Unduh dan ekstrak repositori ini.
-
Pastikan anda memiliki komponen elektronik yang diperlukan.
-
Pastikan komponen anda telah dirancang sesuai dengan diagram.
-
Konfigurasikan perangkat anda menurut pengaturan di atas.
-
Selamat menikmati [Selesai].
| Produk | |
|---|---|
![]() |
![]() |
| Konektivitas Wi-Fi | ||
|---|---|---|
![]() |
![]() |
![]() |
| Konektivitas IoT | |||
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Publish-Subscribe MQTT | |||
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Tampilan LCD | ||||
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
| Monitor Serial | Plotter Serial |
|---|---|
![]() |
![]() |
| Kontrol dan Indikator Ubidots | Grafik Garis Ubidots |
|---|---|
![]() |
![]() |
Informasi lebih lanjut:
|
• Skripsi : Akses 1 atau Akses 2 • Jurnal : Klik Disini |
Jika karya ini bermanfaat bagi anda, maka dukunglah karya ini sebagai bentuk apresiasi kepada penulis dengan mengklik tombol ⭐Bintang di bagian atas repositori.
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 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.






























