Memahami perangkat keras dasar IoT: perbedaan MCU dan SoC, memilih ESP32 atau STM32, cara kerja GPIO, ADC, sensor digital dan analog, aktuator, serta praktik membaca sensor suhu dan kelembapan pertama dengan ESP32.

Setelah di episode 2 kita memahami arsitektur end-to-end, pada episode ini kita turun ke lapisan paling bawah: hardware dan sensor. Ini adalah lapisan yang berhubungan langsung dengan dunia fisik — membaca suhu ruangan, mendeteksi gerakan, atau menyalakan relay.
Mengapa hardware penting dipahami seorang IoT Engineer? Karena di sinilah konsep abstrak berubah menjadi tegangan nyata. Ketika firmware membaca nilai dari ADC, kalian harus paham kenapa nilai 2048 berarti 1,65V, dan kenapa sensor tertentu butuh pull-up resistor. Kesalahan di lapisan ini paling sulit didiagnosis dari jarak jauh — hardware tidak pernah mengirimkan log error.
Kata "chip" di papan IoT sebenarnya merujuk dua hal berbeda:
| Karakteristik | MCU (Microcontroller) | SoC (System-on-Chip) |
|---|---|---|
| CPU | 1–2 core, ratusan MHz | Multi-core, bisa GPU/Neural unit |
| RAM | Puluhan–ratusan KB | Ratusan MB–GB |
| OS | Bare-metal / RTOS | Linux/Android |
| Contoh | STM32, ATmega, ESP32 | Raspberry Pi, i.MX8, ESP32-S3 (SoC) |
| Konsumsi daya | Sangat rendah (µA–mA) | Tinggi (Watt) |
ESP32 sebenarnya hibrida: ia punya MCU cores plus WiFi/BLE radio dan cukup RAM (520 KB) — menjadikannya pilihan ideal untuk belajar. STM32 adalah MCU murni yang dominan di industri karena deterministik dan hemat daya.
Note
ESP32 cocok untuk prototype dan produk konsumen bervolume kecil-menengah. STM32 dipakai saat butuh ketepatan real-time, konsumsi daya sangat rendah, atau jalur produksi jutaan unit. Untuk series ini, ESP32 cukup untuk semua praktik.
Perangkat lunak berkomunikasi dengan hardware lewat pin. Empat jenis pin yang wajib kalian pahami:
| Jenis Pin | Fungsi | Analogi |
|---|---|---|
| GPIO digital | Membaca/menulis nilai 0 atau 1 | Saklar: nyala/mati |
| ADC | Mengubah tegangan analog menjadi angka | Timbangan digital |
| PWM | Menghasilkan sinyal dengan lebar pulsa bervariasi | Mengatur kecerahan lampu |
| Komunikasi | UART, I2C, SPI — berbicara dengan sensor | Obrolan antar perangkat |
GPIO adalah pin serbaguna: bisa jadi input (membaca button) atau output (menyalakan LED). ADC hanya ada di pin tertentu — di ESP32, pin GPIO34 sampai GPIO39 adalah input-only ADC. PWM mengatur duty cycle sinyal untuk mensimulasikan nilai analog.
Sensor mengubah besaran fisik menjadi sinyal listrik. Ada dua kategori utama:
| Tipe | Cara Baca | Contoh | Output |
|---|---|---|---|
| Analog | ADC — nilai tegangan proporsional | LDR (cahaya), potensiometer | Tegangan kontinu |
| Digital | Bus komunikasi (I2C/SPI/1-Wire) atau GPIO | DHT22, BME280, DS18B20 | Angka siap pakai |
Sensor analog menghasilkan tegangan yang harus diinterpretasi firmware. Sensor digital melakukan konversi di dalam chip dan mengirim hasil lewat protokol komunikasi — lebih akurat dan lebih mudah diprogram. BME280 misalnya mengirim data mentah (raw) yang diubah firmware menjadi suhu, tekanan, dan kelembapan.
Mari membaca sensor DHT22 dengan ESP32. Wiring: VCC ke 3.3V, GND ke GND, DATA ke GPIO4 — dengan resistor pull-up 10k antara DATA dan VCC.
#include <Arduino.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Gagal membaca sensor");
} else {
Serial.print("Suhu: ");
Serial.print(t);
Serial.print(" C, Kelembapan: ");
Serial.println(h);
}
delay(2000);
}Suhu: 30.40 C, Kelembapan: 62.10
Suhu: 30.50 C, Kelembapan: 62.00dht.readTemperature() memicu komunikasi 1-Wire ke sensor, menunggu bit data, lalu mengubahnya menjadi float. Jika sensor tidak merespons, isnan() menangkap kegagalan dan mencetak pesan alih-alih menampilkan angka sampah.
Sensor analog seperti LDR (light dependent resistor) dibaca lewat ADC:
#include <Arduino.h>
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(34); // GPIO34 (input-only ADC)
float volt = raw * (3.3f / 4095.0f); // ESP32 ADC 12-bit
Serial.printf("raw=%d volt=%.2f\n", raw, volt);
delay(500);
}ADC ESP32 12-bit menghasilkan nilai 0–4095. Dengan referensi 3.3V, nilai mentah dikonversi dengan rumus volt = raw * (3.3 / 4095). Ruangan terang memberikan nilai kecil (LDR resistansinya turun), ruangan gelap nilai besar.
Sensor membaca dunia, aktuator mengubah dunia. Contoh paling dasar: LED dan relay.
#include <Arduino.h>
#define BUTTON_PIN 15
#define RELAY_PIN 2
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
}
void loop() {
bool pressed = digitalRead(BUTTON_PIN) == LOW; // aktif-low
digitalWrite(RELAY_PIN, pressed ? HIGH : LOW);
delay(50);
}INPUT_PULLUP mengaktifkan resistor pull-up internal — saat button ditekan, pin terhubung ke GND dan membaca LOW. Relay adalah saklar elektromagnetik yang mengizinkan perangkat bertegangan tinggi (lampu 220V) dikontrol sinyal 3.3V.
delay(2000) menghentikan seluruh program; di episode 4 kita ganti dengan pola non-blocking dan RTOS.Warning
Bekerja dengan listrik 220V (relay, lampu rumah) bisa mematikan. Selama belajar, uji dengan LED dan rangkaian bertegangan rendah. Jika harus menyentuh tegangan tinggi, gunakan modul relay berisolasi dan pelajari safety dasar kelistrikan terlebih dahulu.
Inti yang harus dibawa pulang:
Di episode 4 selanjutnya, kita akan naik satu tingkat: embedded firmware dasar — menulis C/C++ yang benar untuk mikrokontroler, memahami batasan memori flash dan RAM, serta pengenalan RTOS agar firmware bisa menjalankan banyak tugas sekaligus. Pastikan sensor kalian sudah terbaca, karena kita akan membangun di atasnya!