Pendahuluan — Dari Sketch Tunggal ke Project Profesional
Seri 1 dan Seri 2 sejauh ini memakai Arduino IDE — cocok untuk belajar cepat. Tapi saat proyek bertambah (MQTT #7, gateway LoRa #28, multi-file), kamu butuh struktur folder, dependency terkelola, dan build yang konsisten.
PlatformIO adalah ekosistem development embedded berbasis VS Code (atau IDE lain) yang mengelola board ESP32, library, dan upload lewat file platformio.ini. Artikel Jalur E ini memandu migrasi dari Arduino IDE (#2) ke workflow modern — tanpa mengubah logika sketch yang sudah kamu paham.
Prasyarat: Sudah bisa flash ESP32 di Arduino IDE (#2), paham dasar MQTT (#7), dan pernah buat project multi-sketch seperti gateway LoRa (#28).
Mengapa PlatformIO?
| Aspek | Arduino IDE | PlatformIO |
|---|---|---|
| Struktur project | Satu folder sketch | src/, lib/, include/ |
| Library | Library Manager global | lib_deps per project (versi pinned) |
| Multi-board | Ganti menu Tools manual | Environment di platformio.ini |
| CI / tim | Sulit direproduksi | pio run di terminal identik di mana saja |
| IntelliSense | Terbatas | Autocomplete kuat di VS Code |
PlatformIO bukan pengganti pemahaman ESP32 — kamu tetap menulis setup() / loop(). Yang berubah adalah cara mengelola project, terutama sebelum OTA (#15) dan project capstone nanti.
Instalasi — VS Code + PlatformIO
- Download Visual Studio Code dari code.visualstudio.com
- Buka Extensions (Ctrl+Shift+X) → cari PlatformIO IDE → Install
- Restart VS Code — ikon alien PlatformIO muncul di sidebar kiri
- Pastikan driver USB CH340/CP2102 sudah terpasang (sama seperti #2)
Di Windows, PlatformIO mengunduh toolchain sendiri — pertama kali build bisa 5–15 menit. Sabar, ini sekali saja per versi board.
Buat Project ESP32 Baru
- PlatformIO Home → New Project
- Name:
kindo-esp32-mqtt - Board: Espressif ESP32 Dev Module
- Framework: Arduino
- Finish — tunggu scaffold selesai
Struktur default:
kindo-esp32-mqtt/
├── platformio.ini ← konfigurasi board & library
├── src/
│ └── main.cpp ← setup() / loop() kamu
├── lib/ ← library lokal (opsional)
└── include/ ← header custom
platformio.ini — Jantung Project
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
lib_deps =
knolleary/PubSubClient @ ^2.8
bblanchon/ArduinoJson @ ^7.0
build_flags =
-D CORE_DEBUG_LEVEL=1
lib_deps menggantikan Library Manager Arduino — versi library terkunci di project, sehingga sketch MQTT kamu tidak rusak saat library global ter-update.
Migrasi Sketch MQTT dari Arduino IDE
Salin isi sketch MQTT #7 ke src/main.cpp. Pastikan placeholder Seri 2 tetap:
- SSID:
GANTI_NAMA_WIFI - Password WiFi:
GANTI_PASSWORD_WIFI - Broker:
192.168.1.50· userkindo_esp32 - MQTT pass:
GANTI_PASSWORD_MQTT - Topic:
kodingindonesia/esp32/dht22/data
#include <Arduino.h>
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "GANTI_NAMA_WIFI";
const char* password = "GANTI_PASSWORD_WIFI";
// ... sisa sketch MQTT #7
Build: ikon ✓ di status bar atau terminal pio run. Upload: pio run --target upload. Serial: pio device monitor.
Pro tip: Tambahkan
.gitignoredengan folder.pio/— jangan commit build cache ke GitHub.
Multi-Environment (Dev vs Produksi)
Pisahkan board di meja kerja vs node lapangan:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
lib_deps = knolleary/PubSubClient @ ^2.8
[env:esp32cam]
platform = espressif32
board = esp32cam
framework = arduino
lib_deps = knolleary/PubSubClient @ ^2.8
build_flags = -DBOARD_HAS_PSRAM
Upload ke environment tertentu: pio run -e esp32cam --target upload — berguna saat kamu punya ESP32-CAM (#27) dan DevKit biasa dalam satu repo monorepo.
Memecah Kode — src vs lib
Project gateway #28 bisa dirapikan:
src/main.cpp— setup WiFi + MQTT + loop LoRalib/lora_packet/packet.h— structlora_packet_tbersamalib/mqtt_publish/mqtt_publish.cpp— fungsi publish JSON
Pola ini memudahkan unit test dan review kode sebelum modul FreeRTOS (#31).
Serial Monitor & Debug
# Monitor dengan filter timestamp
pio device monitor --filter time
# Build + upload + monitor satu baris
pio run --target upload --target monitor
Untuk debug MQTT, subscribe paralel di broker Mosquitto pribadi (#16):
mosquitto_sub -h 192.168.1.50 -u kindo_esp32 -P GANTI_PASSWORD_MQTT \
-t kodingindonesia/esp32/dht22/data -v
PlatformIO vs ESPHome / Arduino IDE
| Tool | Cocok untuk |
|---|---|
| Arduino IDE | Belajar pertama, sketch kecil (#3 Blink) |
| PlatformIO | Project besar, tim, CI, multi-board |
| ESPHome (#22) | Smart home YAML tanpa C++ |
Keamanan & Git
- Jangan commit
GANTI_PASSWORD_*— gunakanbuild_flags+ file lokalsecrets.ini(gitignored) - Contoh:
-DWIFI_SSID=\"\\\"GANTI_NAMA_WIFI\\\"\"atau env var di CI - Untuk produksi cloud, lihat MQTT TLS (#17)
Estimasi Biaya
| Item | Biaya |
|---|---|
| VS Code + PlatformIO | Gratis (open source) |
| ESP32 DevKit (sudah punya) | Rp 0 tambahan |
| Waktu setup pertama | ±30–60 menit (download toolchain) |
Checklist: Siap Migrasi?
- Sketch MQTT #7 sudah jalan di Arduino IDE? → port ke
src/main.cpp - Butuh dua board berbeda? → tambah
[env:...] - Library bentrok versi? → pin di
lib_deps - Gateway LoRa #28 makin besar? → pecah ke
lib/ - Butuh OTA dari PlatformIO? → plugin espota / artikel #15
Uji Coba
- Buat project
kindo-esp32-mqttdi PlatformIO - Salin sketch publish DHT22/MQTT — build sukses
- Upload — Serial menampilkan IP + connected MQTT
mosquitto_submenerima payload JSON- Tambah environment kedua — verifikasi
pio run -ekeduanya compile
Workflow Harian dengan PlatformIO
Setelah migrasi pertama, kebiasaan kerja di VS Code biasanya seperti ini:
- Buka folder project — File → Open Folder → pilih root yang berisi
platformio.ini - Edit
src/main.cpp— sama seperti sketch Arduino, dengan autocomplete header - Build (
pio run) — tangkap error compile sebelum upload - Upload — tombol panah atau
pio run -t upload - Monitor —
pio device monitoruntuk log Serial - Commit Git — hanya source (
src/,lib/,platformio.ini), bukan.pio/
Untuk project yang sudah pakai MQTT (#7), alur debug tetap: Serial untuk status WiFi, mosquitto_sub untuk payload broker. PlatformIO tidak mengubah protokol — hanya mempercepat iterasi saat kamu menambah library atau environment baru.
Integrasi dengan Tooling Seri 2
PlatformIO melengkapi artikel infrastruktur yang sudah kamu baca:
- Mosquitto (#16) — broker tetap di Raspberry Pi/VPS; ESP32 hanya client MQTT
- Grafana (#19) — data dari topic
kodingindonesia/esp32/dht22/datatidak berubah - Gateway LoRa (#28) — refactor ke
lib/agar packet LoRa dan publish MQTT terpisah - OTA (#15) — upload awal via USB, update berikutnya bisa lewat WiFi
Saat tim bertambah, platformio.ini menjadi kontrak: semua developer memakai versi board dan library yang sama — mengurangi bug “di laptop saya jalan”.
Contoh platformio.ini Lengkap (MQTT + JSON)
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
lib_deps =
knolleary/PubSubClient @ ^2.8
bblanchon/ArduinoJson @ ^7.0
build_flags =
-D CORE_DEBUG_LEVEL=1
-D WIFI_SSID=\"GANTI_NAMA_WIFI\"
-D WIFI_PASS=\"GANTI_PASSWORD_WIFI\"
; Opsional: monitor filter
monitor_filters = time, esp32_exception_decoder
Dengan build_flags, credential bisa diinjeksi saat compile tanpa menulis literal di main.cpp — praktik yang disarankan sebelum deploy ke lapangan atau sebelum integrasi MQTT TLS (#17).
FAQ Singkat
- Bisa pakai PlatformIO tanpa VS Code?
- Ya — CLI
piostandalone; ekstensi VS Code paling populer untuk pemula. - Sketch Arduino IDE lama masih bisa dibuka?
- Ya — copy-paste ke
src/main.cpp, tambahkan#include <Arduino.h>. - Harus migrasi semua project?
- Tidak — Arduino IDE tetap OK untuk eksperimen cepat; PlatformIO untuk project yang disimpan & di-deploy.
Migrasi Step-by-Step dari Folder Arduino IDE
Anggap kamu punya sketch mqtt_dht22.ino di Arduino IDE yang sudah jalan. Berikut urutan migrasi tanpa mengubah logika:
- Di PlatformIO, buat project baru
kindo-esp32-mqtt(framework Arduino) - Buka
src/main.cpp— hapus template default - Salin seluruh isi
.inokemain.cpp - Tambahkan baris pertama:
#include <Arduino.h>(wajib di PlatformIO, tidak di .ino) - Pindahkan library dari Library Manager ke
lib_depsdiplatformio.ini— contoh PubSubClient:knolleary/PubSubClient @ ^2.8 - Jalankan
pio run— perbaiki error include atau nama fungsi - Upload dan bandingkan output Serial dengan versi Arduino IDE
- Subscribe MQTT di broker #16 — pastikan topic dan JSON identik
Jika sketch memakai banyak file tab di Arduino IDE, buat file tambahan di src/ (misalnya wifi_connect.cpp + header di include/) atau pindahkan ke lib/nama_modul/ untuk reuse di project gateway #28.
Folder .pio/libdeps/ dihasilkan otomatis — jangan edit manual; selalu ubah lib_deps lalu pio run ulang.
PlatformIO di CI/CD (Opsional)
Salah satu keunggulan PlatformIO adalah perintah pio run yang deterministik — cocok untuk GitHub Actions atau pipeline internal tim. Pola minimal:
- name: Build ESP32 firmware
run: |
pip install platformio
pio run -e esp32dev
Build di CI tidak menggantikan uji di hardware nyata, tapi menangkap error compile dini — terutama saat lib_deps di-update atau saat menambah environment esp32cam untuk modul kamera. Simpan firmware binary dari .pio/build/ sebagai artefak release jika kamu mendistribusikan OTA ke banyak node lapangan.
Untuk proyek pribadi, cukup build lokal; langkah CI ini opsional sampai kamu punya puluhan device seperti rencana capstone greenhouse (#39).
Tips & Troubleshooting
- Build gagal lib not found: Cek ejaan
lib_depsdi Registry PlatformIO - Upload timeout: Tahan BOOT seperti di #2; turunkan
upload_speed - IntelliSense merah tapi build OK:
pio runsekali, lalu Reload Window VS Code - Port tidak muncul: Driver CH340/CP2102 — ulangi langkah #2
Langkah Selanjutnya (Jalur E)
- ESP32 + Firebase Realtime Database (#30): backend cloud tanpa server sendiri
- OTA (#15) — update firmware dari PlatformIO
- Gateway LoRa (#28) — refactor ke struktur
lib/ - FreeRTOS (#31) — task terpisah sensor/WiFi/MQTT
- Capstone greenhouse (#39) — monorepo sensor + gateway + dashboard
PlatformIO membawa project ESP32 kamu ke level berikutnya — struktur rapi, dependency aman, siap kolaborasi. Lanjutkan Seri 2 di halaman artikel Koding Indonesia.