1. Pinout ESP32 DevKit V1
💡 Tips
Pin yang aman digunakan: GPIO 2, 4, 5, 12-19, 21-23, 25-27, 32-33. Hindari GPIO 0, 1, 3, 6-11, 34-39 (input only / reserved).
| GPIO | Fungsi | Keterangan |
| GPIO 0 | Boot Mode | Pull HIGH saat boot, bisa output LOW setelah boot |
| GPIO 1 | TX0 (UART) | Jangan gunakan jika pakai Serial Monitor |
| GPIO 2 | LED Built-in | Output HIGH = LED menyala (DevKit) |
| GPIO 3 | RX0 (UART) | Jangan gunakan jika pakai Serial Monitor |
| GPIO 4 | ADC2_CH0 | Aman digunakan, mendukung PWM |
| GPIO 5 | SS (SPI) | Aman digunakan, pull-up default saat boot |
| GPIO 12 | ADC2_CH5 | HATI-HATI: harus LOW saat boot atau ESP32 gagal start |
| GPIO 13 | ADC2_CH4 | Aman digunakan |
| GPIO 14 | ADC2_CH6 | Aman digunakan, mendukung PWM |
| GPIO 15 | ADC2_CH3 | Debug log output saat boot |
| GPIO 16 | UART2 RX | Aman digunakan |
| GPIO 17 | UART2 TX | Aman digunakan |
| GPIO 18 | SPI CLK | Aman digunakan |
| GPIO 19 | SPI MISO | Aman digunakan |
| GPIO 21 | I2C SDA | Aman digunakan |
| GPIO 22 | I2C SCL | Aman digunakan |
| GPIO 23 | SPI MOSI | Aman digunakan |
| GPIO 25 | DAC1 | Output analog, ADC2 |
| GPIO 26 | DAC2 | Output analog, ADC2 |
| GPIO 27 | ADC2_CH7 | Aman digunakan |
| GPIO 32 | ADC1_CH4 | Aman, bisa baca analog |
| GPIO 33 | ADC1_CH5 | Aman, bisa baca analog |
| GPIO 34 | ADC1_CH6 | INPUT ONLY — tidak bisa output |
| GPIO 35 | ADC1_CH7 | INPUT ONLY — tidak bisa output |
| GPIO 36 | SVP / ADC1_CH0 | INPUT ONLY — tidak bisa output |
| GPIO 39 | SVN / ADC1_CH3 | INPUT ONLY — tidak bisa output |
2. Arduino IDE Command & Setup
Board Manager URL
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Fungsi Dasar Arduino ESP32
| Fungsi | Keterangan | Contoh |
pinMode(pin, mode) | Atur mode pin | pinMode(2, OUTPUT) |
digitalWrite(pin, val) | Tulis HIGH/LOW | digitalWrite(2, HIGH) |
digitalRead(pin) | Baca pin digital | int val = digitalRead(4) |
analogRead(pin) | Baca ADC (0-4095) | int val = analogRead(34) |
analogWrite(pin, val) | Output PWM (0-255) | analogWrite(2, 128) |
ledcSetup(ch, freq, res) | Setup LED PWM channel | ledcSetup(0, 5000, 8) |
ledcAttachPin(pin, ch) | Attach pin ke PWM channel | ledcAttachPin(2, 0) |
ledcWrite(ch, duty) | Tulis duty cycle PWM | ledcWrite(0, 128) |
delay(ms) | Tunggu dalam milidetik | delay(1000) |
millis() | Waktu sejak boot (ms) | unsigned long t = millis() |
3. WiFi Connection
#include <WiFi.h>
const char* ssid = "NamaWiFi";
const char* password = "PasswordWiFi";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Cek koneksi WiFi
if (WiFi.status() != WL_CONNECTED) {
WiFi.reconnect();
}
}
Fungsi WiFi Berguna
| Fungsi | Keterangan |
WiFi.begin(ssid, pass) | Mulai koneksi WiFi |
WiFi.status() | Cek status koneksi |
WiFi.localIP() | Dapatkan IP address |
WiFi.disconnect() | Putuskan koneksi |
WiFi.reconnect() | Sambung ulang |
WiFi.macAddress() | Dapatkan MAC address |
WiFi.scanNetworks() | Scan jaringan sekitar |
WiFi.mode(WIFI_STA) | Set mode Station |
WiFi.mode(WIFI_AP) | Set mode Access Point |
WiFi.softAP(ssid, pass) | Buat Access Point |
4. MQTT Client (PubSubClient)
#include <WiFi.h>
#include <PubSubClient.h>
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char* topic_pub = "esp32/suhu";
const char* topic_sub = "esp32/relay";
WiFiClient espClient;
PubSubClient client(espClient);
void callback(char* topic, byte* payload, unsigned int length) {
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Pesan dari ");
Serial.print(topic);
Serial.print(": ");
Serial.println(message);
}
void reconnect() {
while (!client.connected()) {
String clientId = "ESP32-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
client.subscribe(topic_sub);
Serial.println("MQTT Connected!");
} else {
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) delay(500);
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
// Publish data setiap 5 detik
static unsigned long lastMsg = 0;
if (millis() - lastMsg > 5000) {
lastMsg = millis();
float suhu = 25.5; // Ganti dengan bacaan sensor
client.publish(topic_pub, String(suhu, 1).c_str());
}
}
Fungsi PubSubClient
| Fungsi | Keterangan |
client.setServer(host, port) | Atur broker MQTT |
client.connect(id) | Hubungkan ke broker |
client.publish(topic, msg) | Kirim pesan |
client.subscribe(topic) | Subscribe topik |
client.setCallback(fn) | Atur fungsi callback |
client.loop() | Proses pesan (wajib di loop) |
client.connected() | Cek status koneksi |
client.disconnect() | Putuskan koneksi |
5. Bluetooth Low Energy (BLE)
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#define SERVICE_UUID "12345678-1234-1234-1234-123456789abc"
#define CHARACTERISTIC_UUID "abcdefab-1234-1234-1234-abcdefabcdef"
BLEServer *pServer = NULL;
BLECharacteristic *pCharacteristic = NULL;
bool deviceConnected = false;
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) { deviceConnected = true; }
void onDisconnect(BLEServer* pServer) { deviceConnected = false; }
};
void setup() {
Serial.begin(115200);
BLEDevice::init("ESP32-BLE");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->start();
Serial.println("BLE Ready! Waiting for connections...");
}
void loop() {
if (deviceConnected) {
String data = "Suhu: 25.5°C";
pCharacteristic->setValue(data.c_str());
pCharacteristic->notify();
delay(2000);
}
}
6. Sensor DHT11 / DHT22
Wiring
| Pin DHT | ESP32 | Keterangan |
| VCC (+) | 3.3V | Power supply |
| DATA | GPIO 4 | Tambah pull-up 10kΩ ke 3.3V |
| GND (-) | GND | Ground |
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11 // Ganti DHT22 jika perlu
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
if (isnan(suhu) || isnan(kelembaban)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print("°C | Kelembaban: ");
Serial.print(kelembaban);
Serial.println("%");
delay(2000);
}
7. Sensor Ultrasonic HC-SR04
Wiring
| Pin HC-SR04 | ESP32 |
| VCC | 5V (atau 3.3V tergantung modul) |
| TRIG | GPIO 5 |
| ECHO | GPIO 18 (pakai voltage divider jika 5V) |
| GND | GND |
#define TRIG_PIN 5
#define ECHO_PIN 18
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
float bacaJarak() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long durasi = pulseIn(ECHO_PIN, HIGH);
float jarak = durasi * 0.034 / 2; // cm
return jarak;
}
void loop() {
float jarak = bacaJarak();
Serial.print("Jarak: ");
Serial.print(jarak);
Serial.println(" cm");
delay(500);
}
8. Sensor LDR (Cahaya)
Wiring (Voltage Divider)
| Komponen | Koneksi |
| LDR | 3.3V → LDR → GPIO 34 |
| Resistor 10kΩ | GPIO 34 → 10kΩ → GND |
#define LDR_PIN 34
void setup() {
Serial.begin(115200);
analogReadResolution(12); // 0-4095
}
void loop() {
int nilaiLDR = analogRead(LDR_PIN);
// Konversi ke persen (terbalik: gelap = nilai tinggi)
int persenCahaya = map(nilaiLDR, 0, 4095, 100, 0);
Serial.print("Raw: ");
Serial.print(nilaiLDR);
Serial.print(" | Cahaya: ");
Serial.print(persenCahaya);
Serial.println("%");
delay(1000);
}
9. Referensi Cepat GPIO
| Kategori | Pin | Catatan |
| ADC1 (aman saat WiFi) | 32, 33, 34, 35, 36, 39 | Hanya baca analog |
| ADC2 (tidak saat WiFi) | 4, 12-15, 25-27 | Konflik dengan WiFi |
| DAC (analog output) | 25, 26 | Output 0-3.3V |
| Touch Sensor | 0, 2, 4, 12-15, 27, 32, 33 | Deteksi sentuhan kapasitif |
| I2C (default) | SDA=21, SCL=22 | Wire.begin() |
| SPI (default) | MOSI=23, MISO=19, CLK=18, CS=5 | SPI.begin() |
| UART0 (Serial) | TX=1, RX=3 | Serial Monitor |
| UART1 | TX=10, RX=9 | Internal flash |
| UART2 | TX=17, RX=16 | Serial2 |
| Input Only | 34, 35, 36, 39 | Tidak bisa jadi output |
| Boot-sensitive | 0, 2, 5, 12, 15 | Perlu level tertentu saat boot |
10. MicroPython ESP32
Flash MicroPython
# Download firmware dari micropython.org
esptool.py --chip esp32 --port COM3 erase_flash
esptool.py --chip esp32 --port COM3 write_flash -z 0x1000 firmware.bin
GPIO & LED Blink
from machine import Pin
import time
led = Pin(2, Pin.OUT)
while True:
led.value(not led.value())
time.sleep(1)
WiFi di MicroPython
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("NamaWiFi", "Password")
while not wlan.isconnected():
time.sleep(0.5)
print("IP:", wlan.ifconfig()[0])
MQTT di MicroPython
from umqtt.simple import MQTTClient
client = MQTTClient("esp32", "broker.hivemq.com")
client.connect()
client.publish(b"esp32/data", b"Hello MQTT!")
client.set_callback(lambda t, m: print(t, m))
client.subscribe(b"esp32/cmd")
while True:
client.check_msg()
time.sleep(1)
Bacaan Analog di MicroPython
from machine import ADC, Pin
adc = ADC(Pin(34))
adc.atten(ADC.ATTN_11DB) # Range 0-3.3V
adc.width(ADC.WIDTH_12BIT) # 0-4095
while True:
nilai = adc.read()
print("ADC:", nilai)
time.sleep(0.5)