Panduan · 19 mnt baca

Cara Mengatasi ESP32 Brownout Detector Was Triggered dan Guru Meditation

ESP32 brownout detector was triggered dan restart tanpa henti: perbaiki catu daya, kabel, dan kapasitor, baca kode rst, Guru Meditation, Task WDT, dan backtrace.

Pesan ESP32 brownout detector was triggered berarti tegangan suplai board sempat turun sekejap di bawah batas aman, lalu chip me-restart dirinya sendiri demi keamanan. Masalahnya hampir tidak pernah ada di kodemu, melainkan di sisi daya: port USB yang lemah, kabel yang tipis dan panjang, regulator yang terlalu kecil, atau servo dan LED strip yang mengambil daya dari jalur yang sama dengan ESP32. Penyebab besar kedua ESP32 terus restart adalah crash perangkat lunak; dalam kasus ini Serial Monitor menampilkan baris seperti Guru Meditation Error, task_wdt, atau Stack canary.

Kabar baiknya: ESP32 sendiri memberi tahu kenapa ia restart, asalkan kamu tahu cara membaca pesannya. Di panduan ini kamu akan lebih dulu belajar mengenali kode rst di baris boot dan pesan-pesan error, lalu mengatasi brownout untuk selamanya dengan catu daya, kabel, dan kapasitor yang tepat. Setelah itu kita bahas error Guru Meditation seperti LoadProhibited dan StoreProhibited, stack overflow, null pointer, dan timeout watchdog, dan kamu akan melacak crash sampai ke baris kode yang tepat dengan ESP Exception Decoder. Terakhir, kita lihat pin strapping (GPIO0, 2, 12, dan 15) yang bisa merusak proses boot.

Board pengembangan ESP32 DevKit
Board pengembangan ESP32: 5 V dari USB diturunkan ke 3,3 V oleh regulator di board. Sebagian besar masalah brownout berasal dari penurunan singkat di jalur 3,3 V ini.

Kenapa ESP32 terus restart? Baca pesannya dulu

Sebelum mulai mencari masalah, buka Serial Monitor di 115200 baud dan tekan tombol EN di board. Di setiap boot, bootloader ROM di dalam ESP32 lebih dulu mencetak baris tanggal seperti “ets Jun 8 2016 00:22:57”, lalu baris seperti rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT). Bagian rst memberi tahu kenapa board restart, bagian boot menunjukkan mode yang dipakai ketika board menyala. Kalau board terjebak dalam loop, kamu akan menemukan pesan error, yaitu “kata-kata terakhir” dari eksekusi sebelumnya, tepat di atas baris-baris ini. Tabel di bawah merangkum pesan yang akan kamu lihat dan dari mana harus mulai:

Yang terlihat di Serial MonitorArtiYang perlu dicek
“Brownout detector was triggered”Tegangan suplai turun di bawah ambangCatu daya, kabel, kapasitor
“Guru Meditation Error: Core 1 panic'ed (LoadProhibited)”Kode mencoba membaca dari alamat yang tidak validNull pointer, batas array
“Guru Meditation Error: Core 1 panic'ed (StoreProhibited)”Kode mencoba menulis ke alamat yang tidak validNull pointer, buffer yang meluap (overflow)
“Stack canary watchpoint triggered (loopTask)”Stack sebuah task penuhArray lokal yang besar, rekursi
“task_wdt: Task watchdog got triggered”Sebuah task tidak melepas CPU lebih dari 5 detikLoop tanpa jeda, task yang macet
“Interrupt wdt timeout on CPU0 / CPU1”Handler interrupt atau bagian dengan interrupt dimatikan berjalan lebih dari 300 msISR yang panjang, Serial di dalam ISR
“boot:0x3 (DOWNLOAD_BOOT...) waiting for download”Board menyala dalam mode pemrogramanGPIO0 LOW ketika boot
“invalid header” atau “flash read err”Memori flash tidak bisa dibacaGPIO12 HIGH ketika boot, upload yang terputus

Apa itu “Brownout detector was triggered” dan kenapa terjadi?

Brownout adalah penurunan tegangan singkat tanpa daya benar-benar hilang. ESP32 punya brownout detector yang terus mengawasi jalur suplai, dan di core Arduino ambangnya disetel ke level terendah, sekitar 2,43 V. Begitu tegangan turun di bawah nilai ini, chip melindungi radio dan memori flash, mencetak “Brownout detector was triggered” ke Serial Monitor, lalu me-restart dirinya sendiri. Alasannya sederhana: pada tegangan rendah, flash bisa salah dibaca, data yang tersimpan bisa rusak, dan CPU bisa menjalankan instruksi acak. Detector ini membuat board melakukan reset yang bersih alih-alih berperilaku tak terduga. Modul ESP32-WROOM-32 dirancang untuk bekerja di antara 3,0 dan 3,6 V, jadi ketika jalur suplai mencapai 2,43 V, kondisinya sudah jauh di luar zona aman.

Setelah pesan brownout, baris boot menampilkan rst:0xc (SW_CPU_RESET) atau rst:0x3 (SW_RESET), tergantung versi core Arduino-mu, karena interrupt milik detector mencetak pesan lalu me-restart chip lewat perangkat lunak. Jangan sampai ini menyesatkanmu: kode yang sama mencatat di memori chip bahwa penyebabnya brownout, dan esp_reset_reason() mengembalikan ESP_RST_BROWNOUT. Kalau yang bekerja adalah reset brownout milik hardware sendiri, barisnya justru berbunyi rst:0xf (RTCWDT_BROWN_OUT_RESET). Di core 3.x, yang berbasis ESP-IDF 5, baris ini menjadi log level info (I BOD: Brownout detector was triggered). Karena library Arduino yang sudah dikompilasi hanya mencetak log level error, pesan ini biasanya tidak muncul sama sekali dan board restart diam-diam; kalau kamu melihat rst:0x3 atau rst:0xc yang tidak jelas penyebabnya ketika boot, cek alasan reset dengan sketch diagnostik di bawah. Untuk memahami kenapa tegangan turun, lihat berapa besar arus yang ditarik ESP32:

Kondisi kerjaArus tipikal (chip ESP32)
Deep sleep (timer RTC aktif)Sekitar 10 µA
Light sleepSekitar 0,8 mA
Wi-Fi mati, CPU di 240 MHz30–68 mA
Wi-Fi menerima (RX)95–100 mA
Wi-Fi mengirim, 802.11b, 19,5 dBmSekitar 240 mA
Kalibrasi radio ketika boot dan momen terhubungBisa melewati 400 mA dalam lonjakan selama beberapa mikrodetik

Selisih di tabel ini adalah inti masalah brownout: sampai kodemu menyalakan Wi-Fi, board hanya menarik sekitar 50 mA ketika diam, tapi di baris WiFi.begin() arusnya melonjak lima sampai enam kali lipat dalam beberapa mikrodetik. Kalau catu daya, kabel, dan regulator tidak bisa mengikuti permintaan mendadak itu, tegangannya ambruk. Karena itulah Espressif menyarankan catu daya yang mampu memberi minimal 500 mA untuk ESP32. Gejalanya sangat familiar: board menyala, mencetak beberapa baris ke Serial Monitor, reset begitu Wi-Fi atau Bluetooth mulai, dan ini berubah menjadi loop tanpa akhir. Hal yang sama bisa terjadi ketika servo bergerak, relay berpindah, atau LED strip menyala putih.

Penyebab brownout yang paling umum

  • Kabel USB yang tipis atau panjang: kabel daya tipis di kabel murah bisa menambah hambatan sampai 0,5 Ω untuk jalur pergi-pulang. Menurut hukum Ohm, lonjakan 400 mA kehilangan 0,2 V di kabel seperti itu.
  • Port USB atau hub yang lemah: port di keyboard dan monitor, hub tanpa adaptor daya, dan port depan beberapa laptop membiarkan tegangan turun ketika arus puncak.
  • Dropout regulator: AMS1117 yang ada di sebagian besar board butuh selisih 1,0–1,3 V antara input dan output-nya. Kalau tegangan di pin 5V turun di bawah kira-kira 4,3 V, output-nya tidak bisa bertahan di 3,3 V.
  • Menyambung baterai langsung: menghubungkan sel Li-ion 3,7 V ke pin 5V menurunkan output di bawah 3 V karena dropout regulator; dua baterai AA cepat turun di bawah tegangan minimum ESP32 ketika diberi beban.
  • Pin 3.3V Arduino Uno: pin ini hanya disarankan untuk sekitar 50 mA; jauh dari cukup untuk ESP32 dengan Wi-Fi menyala.
  • Beban di jalur yang sama: kalau servo, relay, buzzer, motor DC, atau strip WS2812B memakai 5 V yang sama dengan ESP32, setiap gerakan menarik tegangan turun.
  • Breadboard dan kabel jumper: kontak yang longgar dan jumper yang tipis menambah sedikit hambatan di setiap sambungan; mengalirkan daya lewat breadboard membuat keadaan makin buruk.
  • ESP32-CAM: ketika kamera, Wi-Fi, dan LED flash bekerja bersamaan, arusnya jadi sangat tinggi; board ini suka 5 V dan minimal 2 A. Lihat panduan ESP32-CAM untuk detailnya.
Melihat 3,3 V di multimeter tidak berarti suplainya stabil. Multimeter hanya mengambil beberapa pembacaan per detik dan menampilkan sesuatu yang mendekati rata-rata, sedangkan penurunan yang menyebabkan brownout berlangsung dari beberapa mikrodetik sampai beberapa milidetik dan tidak pernah muncul di layarnya. Hanya osiloskop yang bisa memperlihatkannya. Kalau kamu tidak punya, terapkan solusi di bawah secara berurutan dan cek setelah setiap langkah apakah error-nya hilang. Dasar-dasar pengukuran ada di Cara Memakai Multimeter.

Solusi 1: perbaiki catu daya dan kabel

Langkah pertama dan paling efektif adalah suplai yang lebih kuat. Hubungkan board dengan kabel data yang pendek, tebal, dan terbukti bagus, langsung ke port USB di belakang komputer atau ke adaptor 5 V dengan rating minimal 1 A. Port USB 2.0 dirancang untuk memberi 500 mA dan port USB 3.0 900 mA; 500 mA yang disarankan Espressif tepat berada di batas port USB 2.0, jadi begitu rugi-rugi kabel ditambahkan, masalah pun mulai. Kalau mengganti kabel saja sudah menghilangkan error, kemungkinan besar hambatan kabel itulah biangnya. Kamu bisa menghitung berapa tegangan yang hilang di kabel dengan V = I × R memakai alat kalkulator hukum Ohm.

Regulator tegangan AMS1117 3,3 V
AMS1117-3.3: regulator di sebagian besar board ESP32. Butuh selisih 1,0–1,3 V antara input dan output; kalau pin 5V turun di bawah kira-kira 4,3 V, output-nya tidak bisa bertahan di 3,3 V.
Susunan dayaRisiko brownoutCatatan
Kabel pendek dan tebal, port USB belakangRendahSolusi termudah selama pengembangan
Kabel panjang dan tipis, port depan atau hubTinggiHambatan kabel menarik tegangan turun ketika arus puncak
Adaptor 5 V minimal 1 A, ke pin 5V atau VINRendahDisarankan untuk proyek permanen
Suplai 3,3 V siap pakai langsung ke pin 3V3Tergantung suplainyaHarus memberi minimal 500 mA dan tidak boleh melewati 3,6 V
Sel Li-ion 3,7 V lewat AMS1117TinggiDi bawah sekitar 4 V pada sel, output turun di bawah 3 V
Sel Li-ion dengan regulator 3,3 V low-dropout (LDO) atau buck-boostRendahMemberi 3,3 V yang stabil walaupun sel makin kosong
Dua baterai AA langsung ke pin 3V3Sangat tinggiKetika diberi beban, tegangan cepat turun di bawah minimum ESP32

Proyek bertenaga baterai butuh perhatian ekstra. Sel Li-ion seperti 18650 memberi 4,2 V ketika penuh dan sekitar 3,0 V ketika kosong. Rentang ini tidak cocok untuk sambungan langsung ke pin 3V3 (4,2 V melewati batas 3,6 V), juga tidak cocok untuk pin 5V dengan AMS1117-nya. Solusi yang benar adalah memberi daya dari sel lewat modul boost 5 V ke pin 5V, atau menyuplai jalur 3V3 langsung lewat regulator low-dropout dengan rating minimal 500 mA (misalnya ME6211 atau HT7833) plus sebuah kapasitor. Kamu bisa memperkirakan berapa lama proyekmu bertahan dengan baterai memakai alat kalkulator umur baterai, dan mempelajari rangkaian pengisian di panduan modul charger TP4056.

Solusi 2: tambahkan kapasitor di antara 3V3 dan GND

Kapasitor bekerja seperti tandon kecil yang menyuplai energi sendiri ketika ada lonjakan arus, sampai regulator dan kabel bisa menyusul. Tambahkan kapasitor elektrolit 100–470 µF di antara pin 3V3 dan GND board, sedekat mungkin dengan board, plus kapasitor keramik 100 nF di sebelahnya. Kapasitor elektrolit menangani penurunan selama milidetik, yang keramik menangani riak berfrekuensi tinggi yang sangat singkat. Efeknya bisa kamu lihat kasar dengan ΔV = I × Δt / C: bahkan kalau kapasitor 470 µF sendirian menyuplai tambahan 200 mA selama 200 µs, tegangan hanya turun 0,085 V. Tanda 104 di kapasitor keramik berarti 100 nF; tanda lain bisa kamu baca dengan alat kode kapasitor.

Jenis-jenis kapasitor
Pada kapasitor elektrolit, kaki yang panjang adalah positif (+) dan masuk ke 3V3; kaki di sisi badan yang bergaris masuk ke GND. Komponen dengan rating 6,3 V atau 10 V sudah cukup untuk jalur 3,3 V.
Jangan pernah memasang kapasitor elektrolit terbalik: ia akan panas, menggembung, dan bisa meledak. Kalau kamu memasang kapasitor di jalur 5V, pilih yang ber-rating minimal 10 V. Kapasitor yang sangat besar (1000 µF ke atas) menarik arus pengisian yang besar ketika daya dinyalakan, yang bisa sejenak membebani port USB dan memperlambat naiknya jalur 3,3 V; 470 µF di jalur 3V3 sudah cukup untuk sebagian besar proyek. Cara kerja kapasitor ada di Apa Itu Kapasitor?

Solusi 3: beri daya terpisah untuk servo, motor, dan LED strip

Walaupun ESP32 sendiri sudah mendapat daya dengan benar, beban di jalur yang sama bisa menarik tegangan turun. Bahkan servo kecil seperti SG90 menarik beberapa ratus mA ketika mulai bergerak; satu LED WS2812B memakai sekitar 60 mA ketika putih penuh, jadi strip 30 LED bisa mencapai 1,8 A. Beri daya beban ini bukan dari pin 5V atau 3V3 ESP32, tapi dari suplai 5 V terpisah; misalnya, kamu bisa menurunkan adaptor 12 V ke 5 V dengan modul buck LM2596. Aturan terpentingnya adalah menyambungkan GND kedua suplai; tanpa ground bersama, jalur sinyal tidak punya referensi dan servo atau strip berperilaku acak. Kami membahasnya secara detail di Kenapa Arduino-ku terus reset? dan Ground Bersama (GND).

Modul step-down (buck) LM2596
Modul buck LM2596: menurunkan 12 V ke 5 V secara efisien dan ideal untuk memberi daya beban seperti servo, relay, atau LED strip secara terpisah dari ESP32. Output-nya diatur dengan trimmer; setel ke 5 V dengan multimeter sebelum menyambungkan apa pun.
Kamu juga bisa meredam lonjakan arus lewat perangkat lunak. Nyalakan Wi-Fi sebelum menggerakkan servo atau menyalakan LED strip; batasi kecerahan strip dengan setBrightness(); nyalakan servo dan relay dengan selang beberapa ratus milidetik, jangan sekaligus. Menurunkan daya pancar Wi-Fi dengan WiFi.setTxPower() juga mengurangi arus puncak; detailnya di ESP32 tidak mau terhubung ke Wi-Fi.

Apakah mematikan brownout detector itu solusi?

“Solusi” paling umum di internet adalah mematikan detector dengan satu baris. Kode di bawah menonaktifkan detector dengan mengosongkan register brownout ESP32, dan pesan error-nya hilang. Tapi penurunan tegangannya tetap terjadi; hanya saja tidak ada lagi yang memperingatkanmu. Pakai kode ini hanya untuk diagnosis: kalau board berjalan normal dengan detector mati, kamu sudah memastikan bahwa masalahnya pasti di catu daya. Setelah itu hapus barisnya dan perbaiki suplainya.

C++ (Arduino IDE)
1#include "soc/soc.h"
2#include "soc/rtc_cntl_reg.h"
3
4void setup() {
5  // YALNIZ TEŞHİS İÇİN: brownout dedektörünü kapat / DIAGNOSIS ONLY: disable the brownout detector
6  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
7
8  Serial.begin(115200);
9  Serial.println("Brownout dedektoru kapali / brownout detector disabled");
10}
11
12void loop() {
13}
Jangan biarkan detector mati selamanya. WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0) bukan hanya membungkam peringatan; ia juga mematikan reset hardware milik detector dan tugasnya mematikan flash dan radio pada tegangan rendah, sehingga chip terus berjalan tanpa perlindungan jauh di bawah minimum 3,0 V-nya. Ketika tegangan turun di bawah 2,4 V, data yang ditulis ke flash (Preferences, EEPROM, LittleFS), bahkan programnya sendiri selama pembaruan OTA, bisa rusak, Wi-Fi bisa putus tanpa sebab yang jelas, dan board sekarang bisa crash dengan error Guru Meditation atau macet total. Pengaturan ini tidak permanen: chip menyalakan lagi detector di setiap boot, jadi baris itu harus jadi baris pertama setup(), dan begitu kamu menghapusnya, perlindungan kembali. Register ini ada di ESP32 klasik, S2, S3, dan C3; model yang lebih baru seperti ESP32-C6 tidak punya dan kodenya tidak akan terkompilasi. Solusi sebenarnya selalu memperbaiki catu daya.

Kode penyebab rst: ESP32 memberi tahu kenapa ia restart

Nilai rst: yang dicetak ROM di setiap boot menunjukkan bagaimana eksekusi sebelumnya berakhir. Pada boot normal, nilai boot-nya 0x13 (SPI_FAST_FLASH_BOOT), artinya board menjalankan programnya dari flash. Tabel di bawah mendaftar kode yang paling sering akan kamu lihat. Kode ROM tidak selalu cukup sendirian: ESP.restart() dan restart setelah Guru Meditation sama-sama muncul sebagai 0xc, sedangkan brownout muncul sebagai 0xc atau 0x3 tergantung versi core. Untuk membedakannya, pakai sketch esp_reset_reason() di bagian berikutnya.

Kode rstNamaArtinya
0x1POWERON_RESETDaya baru pertama kali diberikan atau tombol EN ditekan
0x3SW_RESETPerangkat lunak me-reset seluruh sistem digital; versi core yang lebih baru juga menampilkannya setelah brownout
0x5DEEPSLEEP_RESETBoard bangun dari deep sleep (normal)
0x7 / 0x8TG0WDT_SYS_RESET / TG1WDT_SYS_RESETWatchdog timer group me-reset sistem lewat hardware; interrupt terlalu lama dimatikan atau bahkan panic handler tidak bisa berjalan
0x9RTCWDT_SYS_RESETWatchdog RTC me-reset core digital
0xcSW_CPU_RESETRestart perangkat lunak: ESP.restart(), setelah Guru Meditation, atau setelah brownout di core Arduino
0xfRTCWDT_BROWN_OUT_RESETReset brownout hardware: tegangan suplai tidak stabil
0x10RTCWDT_RTC_RESETWatchdog RTC me-reset seluruh chip termasuk RTC; paling sering terlihat di board yang macet selama boot

Sketch diagnostik: cetak alasan reset, memori, dan stack

Upload kode di bawah sebagai sketch terpisah, atau tambahkan baris-barisnya ke setup() dan loop() proyekmu yang bermasalah. Setiap kali board menyala, ia mencetak alasan reset dalam teks yang mudah dibaca, sudah berapa kali ia boot, dan status memori ke Serial Monitor. Penghitung yang ditandai RTC_DATA_ATTR tinggal di memori RTC, jadi ia bertahan melewati reset perangkat lunak dan deep sleep, dan hanya terhapus ketika daya benar-benar dicabut. Kalau penghitungnya naik setiap beberapa detik, kamu langsung tahu bahwa board terjebak dalam loop reset.

C++ (Arduino IDE)
1#include <esp_system.h>
2
3RTC_DATA_ATTR uint32_t bootCount = 0;   // yazılım resetinde korunur / survives software resets
4
5// Reset nedenini okunabilir yazıya çevir / turn the reset reason into readable text
6const char* reasonText(esp_reset_reason_t r) {
7  switch (r) {
8    case ESP_RST_POWERON:   return "POWERON: guc acilisi ya da EN / power-on or EN button";
9    case ESP_RST_SW:        return "SW: ESP.restart()";
10    case ESP_RST_PANIC:     return "PANIC: Guru Meditation";
11    case ESP_RST_INT_WDT:   return "INT_WDT: kesme watchdog'u / interrupt watchdog";
12    case ESP_RST_TASK_WDT:  return "TASK_WDT: gorev watchdog'u / task watchdog";
13    case ESP_RST_WDT:       return "WDT: diger watchdog / other watchdog";
14    case ESP_RST_DEEPSLEEP: return "DEEPSLEEP: derin uykudan uyanma / deep sleep wake-up";
15    case ESP_RST_BROWNOUT:  return "BROWNOUT: gerilim dusmesi / supply voltage dropped";
16    default:                return "UNKNOWN: bilinmiyor / unknown";
17  }
18}
19
20void setup() {
21  Serial.begin(115200);
22  delay(1000);                          // Seri Monitör'ün açılmasını bekle / wait for the Serial Monitor
23  bootCount++;
24  Serial.printf("Acilis sayisi / boot count: %u\n", (unsigned)bootCount);
25  Serial.printf("Reset nedeni / reset reason: %s\n", reasonText(esp_reset_reason()));
26}
27
28void loop() {
29  // Bellek durumu / memory status
30  Serial.printf("Bos heap / free heap: %u B, en dusuk / minimum: %u B, en buyuk blok / largest block: %u B\n",
31                (unsigned)ESP.getFreeHeap(), (unsigned)ESP.getMinFreeHeap(), (unsigned)ESP.getMaxAllocHeap());
32  // loopTask yığınında hiç kullanılmamış en küçük alan / smallest unused space on the loopTask stack
33  Serial.printf("loopTask bos yigin / free stack: %u B\n", (unsigned)uxTaskGetStackHighWaterMark(NULL));
34  delay(5000);
35}

Nilai yang dicetak di loop juga membongkar masalah yang diam-diam. Kalau free heap turun sedikit di setiap putaran, programmu mengalami memory leak dan cepat atau lambat board akan crash. Kalau blok terbesar jauh lebih kecil daripada free heap, memorinya terfragmentasi; ini biasanya berasal dari objek String yang terus membesar dan mengecil di dalam loop. Kalau sisa stack loopTask turun di bawah beberapa ratus byte, stack overflow sudah di depan mata. Kalau alasan reset-nya BROWNOUT, fokuslah ke bagian tentang daya; kalau PANIC, TASK_WDT, atau INT_WDT, fokuslah ke bagian perangkat lunak di bawah.

Apa itu Guru Meditation Error? Baca output crash baris demi baris

Guru Meditation Error adalah laporan crash yang dicetak panic handler ketika CPU ESP32 menemui error yang tidak bisa dipulihkan; namanya berasal dari layar error komputer Amiga zaman dulu. Laporannya terlihat menakutkan pada awalnya, tapi hanya beberapa baris yang penting. Core 1 memberi tahu di core mana error terjadi: di Arduino, setup() dan loop() berjalan di core 1, sedangkan stack Wi-Fi berjalan di core 0. Nama di dalam kurung adalah jenis exception-nya. Ketika laporan selesai, board mencetak “Rebooting...” lalu restart; kamu akan melihat rst:0xc di baris boot.

BarisArti
“Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.”Kode di core 1 mencoba membaca dari alamat yang tidak valid dan error-nya tidak ditangani
PC : 0x400d1a2cAlamat instruksi yang crash; kalau diawali 0x400d, kodemu atau sebuah library sedang berjalan dari flash
EXCCAUSE: 0x0000001cKode exception; 0x1c, yaitu 28, berarti LoadProhibited
EXCVADDR: 0x00000000Alamat yang diakses; 0 atau angka yang sangat kecil menunjuk ke null pointer
Backtrace: 0x400d1a29:0x3ffb2270 0x400d0f6e:0x3ffb2290 ...Rantai pemanggilan; setiap pasangan adalah PC:SP dan bisa diubah menjadi baris kode dengan decoder
ELF file SHA256: ...Sidik jari program yang crash; decoder butuh build yang persis sama
Rebooting...Panic handler me-restart chip lewat perangkat lunak

LoadProhibited, StoreProhibited, dan jenis exception lainnya

ExceptionEXCCAUSEApa yang terjadi?Penyebab umum
LoadProhibited28 (0x1c)Membaca dari alamat yang tidak validPointer null atau belum diinisialisasi, objek yang sudah dihapus
StoreProhibited29 (0x1d)Menulis ke alamat yang tidak validMenulis lewat null pointer, buffer yang melewati batas array
InstrFetchProhibited20 (0x14)Mengambil instruksi dari alamat yang tidak validPointer fungsi atau callback yang belum diisi
IllegalInstruction0 (0x0)Instruksi tidak validStack rusak, return yang hilang di fungsi yang wajib mengembalikan nilai
LoadStoreAlignment9 (0x9)Akses memori yang tidak sejajar (unaligned)Meng-cast array byte ke tipe seperti uint32_t*
IntegerDivideByZero6 (0x6)Pembagian bilangan bulat dengan nolMembagi dengan penghitung yang bisa bernilai nol
“Unhandled debug exception”-Exception debug“Stack canary watchpoint triggered”: stack overflow
“Interrupt wdt timeout on CPU0/CPU1”-Watchdog interrupt habis waktunyaISR yang panjang, Serial atau delay di dalam ISR
“Cache disabled but cached memory region accessed”-Kode di flash diakses ketika flash sedang sibukHandler interrupt tanpa IRAM_ATTR

Yang paling umum dari error ini adalah memakai null pointer. NULL adalah alamat 0, dan di ESP32 tidak ada memori yang bisa dibaca di sekitar alamat 0, jadi membaca dari tempat yang ditunjuk pointer kosong menghasilkan LoadProhibited, dan menulis ke sana menghasilkan StoreProhibited. Di kasus ini EXCVADDR adalah petunjuk yang sempurna: 0x00000000 menunjuk ke pointer itu sendiri, sedangkan nilai kecil seperti 0x00000004 atau 0x00000010 menunjuk ke sebuah field di dalam pointer kosong (NULL ditambah offset field itu). Di proyek Arduino, penyebab paling umum adalah fungsi yang mengembalikan NULL untuk berarti “tidak ditemukan”, lalu nilai itu dipakai tanpa dicek. Di contoh di bawah, strstr() mengembalikan NULL kalau tidak menemukan teksnya; tanpa pengecekan, board crash dengan EXCVADDR 0x00000005.

C++ (Arduino IDE)
1const char* response = "temp=23.5;hum=40";   // sunucudan gelen yanıt / reply from a server
2
3void setup() {
4  Serial.begin(115200);
5  delay(500);
6
7  // YANLIŞ: "pres=" yoksa strstr NULL döner ve kart çöker (EXCVADDR 0x00000005)
8  // WRONG: if "pres=" is missing strstr returns NULL and the board crashes (EXCVADDR 0x00000005)
9  // float pressure = atof(strstr(response, "pres=") + 5);
10
11  // DOĞRU: işaretçiyi kullanmadan önce NULL kontrolü yap / RIGHT: check for NULL before using the pointer
12  const char* found = strstr(response, "pres=");
13  if (found != nullptr) {
14    float pressure = atof(found + 5);
15    Serial.println(pressure);
16  } else {
17    Serial.println("pres alani bulunamadi / pres field not found");
18  }
19}
20
21void loop() {
22}
Bangun beberapa kebiasaan untuk melawan null pointer: inisialisasi pointer dengan nullptr ketika kamu mendeklarasikannya, cek nilai kembalian fungsi begin() milik library, setel pointer ke nullptr setelah kamu menghapus sebuah objek, dan pastikan indeks lebih kecil dari ukuran array ketika menulis ke array. Kalau kamu menyetel compiler warnings ke All di File > Preferences pada Arduino IDE, kamu akan melihat return yang hilang dan bug serupa ketika kompilasi.

Stack overflow: error “Stack canary watchpoint triggered”

Di ESP32 setiap task punya stack berukuran tetap, tempat variabel lokal, pemanggilan fungsi, dan alamat kembali disimpan. Di Arduino, loopTask yang menjalankan setup() dan loop() punya stack 8192 byte. Mendeklarasikan array lokal 10.000 byte di dalam loop(), fungsi yang memanggil dirinya sendiri (rekursi), atau fungsi library dengan banyak variabel lokal akan melewati batas ini. Di ujung stack ada area penjaga (canary); ketika stack mencapainya, board mencetak Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception) dan tepat di bawahnya Debug exception reason: Stack canary watchpoint triggered (loopTask). Nama di dalam kurung adalah task yang stack-nya meluap. Masalah yang sama kadang muncul sebagai ***ERROR*** A stack overflow in task loopTask has been detected. Begini cara mengatasinya:

  • Pindahkan array besar keluar dari stack: deklarasikan array secara global atau tambahkan static di depannya; dengan begitu ia tinggal di RAM permanen, bukan di stack.
  • Perbesar stack loopTask: taruh SET_LOOP_TASK_STACK_SIZE(16 * 1024); di bagian atas sketch-mu untuk menaikkan stack loop() ke 16 KB.
  • Beri task-mu sendiri ruang yang cukup: di ESP32, ukuran stack yang diberikan ke xTaskCreate dan xTaskCreatePinnedToCore dalam satuan byte, bukan word seperti di FreeRTOS pada platform lain. 1024 byte terlalu kecil bahkan untuk task yang memakai Serial.printf; mulailah dengan 4096.
  • Ukur: uxTaskGetStackHighWaterMark(NULL) mengembalikan, dalam byte, jumlah stack terkecil yang belum pernah dipakai task sejauh ini; kalau turun di bawah beberapa ratus byte, perbesar stack-nya.
  • Hindari rekursi: ubah fungsi yang memanggil dirinya sendiri menjadi perulangan atau batasi kedalamannya.

Task watchdog: error “task_wdt: Task watchdog got triggered”

Watchdog adalah timer yang menyadari program yang macet lalu menyelamatkan board. Task Watchdog (Task WDT) milik ESP32 mengharapkan task yang terdaftar padanya memberi sinyal “aku masih hidup” secara berkala. Di core Arduino, secara default ia mengawasi task idle (IDLE) milik core 0, dengan timeout 5 detik. Kalau task yang berjalan di core 0 tidak melepas CPU selama 5 detik, task IDLE tidak bisa berjalan dan Serial Monitor menampilkan pesan yang diawali E (10257) task_wdt: Task watchdog got triggered. Setelahnya ada daftar task yang tidak me-reset watchdog tepat waktu (biasanya - IDLE (CPU 0)) dan, di bawah Tasks currently running:, task yang sedang berjalan pada momen itu. Di core Arduino ini memicu panic dengan baris task_wdt: Aborting. dan board restart.

Penyebab paling umum: loop yang dipasang di core 0 dengan xTaskCreatePinnedToCore yang tidak pernah memanggil vTaskDelay(), perulangan while yang menunggu balasan sensor tanpa timeout, atau delay() dan operasi panjang di dalam callback library seperti AsyncWebServer. Pada kasus terakhir kamu akan melihat task async_tcp di daftar, bukan IDLE. Solusinya adalah memecah pekerjaan panjang menjadi potongan kecil dan menambahkan jeda singkat seperti vTaskDelay(1) di loop-mu. Fungsi loop() sendiri tidak diawasi secara default; kalau mau, panggil enableLoopWDT() di setup() supaya board juga restart ketika loop() macet lebih dari 5 detik. Mematikan watchdog dengan disableCore0WDT() menyembunyikan error-nya tapi tidak memperbaiki kode yang macet. Untuk lebih lanjut tentang task dan core, lihat FreeRTOS dan dua inti ESP32. Kode di bawah menunjukkan struktur task yang benar sekaligus langkah pencegahan stack overflow:

C++ (Arduino IDE)
1SET_LOOP_TASK_STACK_SIZE(16 * 1024);   // loop() yığını 8 KB yerine 16 KB / loop() stack 16 KB instead of 8 KB
2
3volatile uint32_t sampleCount = 0;
4
5// 0. çekirdekte çalışan görev / task running on core 0
6void sensorTask(void* parameter) {
7  for (;;) {
8    sampleCount = sampleCount + 1;       // sensörünü burada oku / read your sensor here
9    vTaskDelay(pdMS_TO_TICKS(10));       // IDLE görevine sıra ver, task_wdt tetiklenmez / let IDLE run, no task_wdt
10  }
11}
12
13void setup() {
14  Serial.begin(115200);
15  // Yığın boyutu bayt cinsindendir: 4096 bayt / stack size is in bytes: 4096 bytes
16  xTaskCreatePinnedToCore(sensorTask, "sensorTask", 4096, NULL, 1, NULL, 0);
17}
18
19void loop() {
20  static uint8_t buffer[10000];          // static: yığında değil kalıcı RAM'de / static: in RAM, not on the stack
21  memset(buffer, 0, sizeof(buffer));
22
23  Serial.printf("Ornek / samples: %u, loopTask bos yigin / free stack: %u B\n",
24                (unsigned)sampleCount, (unsigned)uxTaskGetStackHighWaterMark(NULL));
25  delay(1000);
26}

Interrupt wdt timeout dan IRAM_ATTR: crash di dalam interrupt

Interrupt Watchdog (Interrupt WDT) jauh lebih tidak sabar: kalau handler interrupt (ISR) atau bagian kode dengan interrupt dimatikan berjalan lebih dari 300 ms, board crash dengan Guru Meditation Error: Core 1 panic'ed (Interrupt wdt timeout on CPU1). Memakai Serial.print, delay(), I2C, atau Wi-Fi di dalam ISR adalah penyebab paling umum. Memori flash adalah jebakan lain: ketika Preferences, EEPROM, atau LittleFS menulis ke flash, cache flash dimatikan sejenak. Kalau ada interrupt datang di waktu itu dan handler-nya tinggal di flash, board melaporkan Cache disabled but cached memory region accessed. Solusinya adalah menandai ISR dengan IRAM_ATTR supaya tinggal di RAM, dan di dalamnya hanya menyetel flag; pekerjaan sebenarnya dilakukan loop(). Variabel yang dipakai bersama oleh ISR dan loop() harus volatile.

C++ (Arduino IDE)
1const int BUTTON_PIN = 27;              // buton GPIO 27 ile GND arasında / button between GPIO 27 and GND
2volatile bool buttonPressed = false;    // ISR ile loop arasında paylaşılan bayrak / flag shared by the ISR and loop
3uint32_t pressCount = 0;
4
5void IRAM_ATTR onButton() {             // IRAM_ATTR: fonksiyon flaşta değil RAM'de durur / the function lives in RAM, not flash
6  buttonPressed = true;                 // yalnızca bayrak kaldır, Serial yok / only set a flag, no Serial
7}
8
9void setup() {
10  Serial.begin(115200);
11  pinMode(BUTTON_PIN, INPUT_PULLUP);
12  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), onButton, FALLING);
13}
14
15void loop() {
16  if (buttonPressed) {
17    buttonPressed = false;
18    pressCount++;
19    Serial.printf("Butona basildi / button pressed: %u\n", (unsigned)pressCount);   // yavaş iş burada / slow work here
20  }
21}

Mengubah Backtrace menjadi baris kode dengan ESP Exception Decoder

Alamat di baris Backtrace tidak memberi tahu apa-apa sendirian; alat yang mengubahnya menjadi file, fungsi, dan nomor baris di kode sumbermu bernama ESP Exception Decoder. Di Arduino IDE 1.8 yang lama, ini adalah plugin yang ditambahkan ke menu Tools. Di Arduino IDE 2 kamu memakai ekstensi buatan komunitas dengan nama yang sama:

  1. Unduh file .vsix dari bagian Releases proyek dankeboy36/esp-exception-decoder di GitHub. Untuk Arduino IDE 2, pilih rilis 1.x; rilis 2.x yang lebih baru dibuat untuk VS Code.
  2. Tutup Arduino IDE dan salin file-nya ke %UserProfile%\.arduinoIDE\plugins di Windows atau ~/.arduinoIDE/plugins di macOS dan Linux; buat folder-nya kalau belum ada.
  3. Buka IDE, buka sketch yang crash, kompilasi dengan Verify, lalu upload ke board.
  4. Buka Serial Monitor dan tunggu sampai crash terjadi lagi.
  5. Buka command palette dengan Ctrl+Shift+P (Cmd+Shift+P di macOS) dan jalankan ESP Exception Decoder: Show Decoder Terminal.
  6. Salin blok Guru Meditation dari Serial Monitor, termasuk baris Backtrace, lalu tempel ke terminal yang terbuka; alat ini menampilkan setiap alamat beserta nama file, fungsi, dan nomor barisnya.

Kalau kamu tidak bisa menginstal ekstensinya, pekerjaan yang sama bisa dilakukan secara manual. Menu Sketch > Export Compiled Binary meninggalkan file berekstensi .elf di folder build di dalam folder sketch-mu. Perintah xtensa-esp32-elf-addr2line -pfiaC -e sketch.ino.elf 0x400d1a29 0x400d0f6e dari toolchain ESP32 mengubah alamat-alamat ini menjadi nama fungsi dan nomor baris. Kalau kamu memakai PlatformIO, cukup tambahkan baris monitor_filters = esp32_exception_decoder ke platformio.ini; output crash lalu otomatis di-decode di serial monitor.

Decoder hanya memberi hasil yang benar dengan file .elf dari build yang persis sama dengan yang crash. Kalau kamu mengubah satu baris saja lalu mengompilasi ulang, alamatnya bergeser dan output-nya menunjuk ke baris yang salah. Kalau baris Backtrace diakhiri CORRUPTED, stack-nya rusak; itu biasanya tanda stack overflow atau buffer yang melewati batasnya.

Pin strapping: bagaimana GPIO0, GPIO2, GPIO12, dan GPIO15 bisa merusak boot

Ketika ESP32 menyala, ia melihat level pin tertentu untuk memutuskan cara boot. Pin ini disebut pin strapping, dan hanya level-nya pada momen reset yang penting; setelah boot selesai, pin ini bisa dipakai sebagai GPIO biasa. Masalahnya muncul ketika sensor, tombol, atau modul yang kamu sambungkan ke salah satunya menarik pin ke level yang salah ketika boot. Akibatnya board sama sekali tidak menjalankan programnya, masuk ke mode pemrograman, atau tidak bisa membaca flash; dari luar ini juga terlihat seperti “ESP32 tidak mau boot” atau “terus reset”. Peta pin lengkap board-mu bisa kamu lihat di alat diagram pin.

PinResistor internalPeran ketika bootApa yang terjadi di level yang salah?
GPIO0Pull-upLOW memilih mode pemrograman (download), HIGH boot normalboot:0x3 (DOWNLOAD_BOOT) dan “waiting for download”; program tidak berjalan
GPIO2Pull-downHarus LOW atau mengambang untuk masuk ke mode pemrograman; tidak berpengaruh untuk boot normalRangkaian yang menariknya ke HIGH menghalangi upload
GPIO12 (MTDI)Pull-downMemilih tegangan suplai flash: LOW 3,3 V, HIGH 1,8 VKalau HIGH, flash 3,3 V tidak mendapat daya dengan benar; board tidak mau boot atau masuk ke loop reset
GPIO15 (MTDO)Pull-upLOW membungkam pesan boot ROMBaris boot tidak muncul di Serial Monitor, diagnosis jadi lebih sulit
GPIO5Pull-upMengatur timing SDIOJarang menimbulkan masalah di board pengembangan
Resistor pull-up, relay, atau modul sensor di GPIO12 yang menarik pin ke HIGH ketika boot adalah alasan paling tersembunyi kenapa ESP32 sama sekali tidak mau menyala. Kalau kamu harus memakai pin ini, pastikan modulnya membiarkannya LOW pada momen boot. Sebagai alternatif, perintah espefuse.py set_flash_voltage 3.3V yang ikut bersama esptool menulis tegangan flash secara permanen ke eFuse dan menghilangkan pengaruh GPIO12 ketika boot; tapi ini tidak bisa dibatalkan dan hanya boleh dilakukan pada modul dengan flash 3,3 V (seperti ESP32-WROOM-32).

Board yang lebih baru punya pin strapping yang berbeda: di ESP32-S3 yaitu GPIO0, GPIO3, GPIO45, dan GPIO46, dan di ESP32-C3 yang memengaruhi boot adalah GPIO2, GPIO8, dan GPIO9. ESP32-S3 memakai nama exception Xtensa yang sama dengan ESP32 klasik. Tapi di ESP32-C3 yang berbasis RISC-V, kamu akan melihat Load access fault alih-alih LoadProhibited dan Store access fault alih-alih StoreProhibited, dan register MTVAL mengambil alih peran EXCVADDR. Pesan brownout-nya sama di semua model.

ESP32 dan Raspberry Pi Pico di MicroPython

Kalau kamu memprogram ESP32 dengan MicroPython, brownout terjadi dengan cara yang persis sama, karena masalahnya ada di hardware, bukan di perangkat lunak. Sebaliknya, error di kode Python muncul sebagai Traceback yang mudah dibaca, bukan Guru Meditation, dan board jarang crash. Alasan reset bisa kamu baca dengan machine.reset_cause(), tapi hati-hati: port ESP32 MicroPython tidak mengembalikan brownout sebagai nilai tersendiri, melainkan melaporkannya sebagai PWRON_RESET bersama dengan power-on. Kalau board terus menyala dengan PWRON_RESET padahal tidak kamu sentuh, curigai lagi catu dayanya. Kode di bawah untuk ESP32; di Raspberry Pi Pico, modul machine mengenal lebih sedikit jenis reset. Di Pico, regulator buck-boost di input VSYS bekerja dengan tegangan berapa pun dari 1,8 sampai 5,5 V, jadi masalah brownout jauh lebih jarang; untuk mengenal board-nya, lihat Apa Itu Raspberry Pi Pico?

MicroPython
1import machine, gc, time
2
3# Reset nedenleri (ESP32 için) / reset causes (for ESP32)
4causes = {
5    machine.PWRON_RESET: "PWRON: guc acilisi ya da brownout / power-on or brownout",
6    machine.HARD_RESET: "HARD: cokme ya da machine.reset() / crash or machine.reset()",
7    machine.WDT_RESET: "WDT: watchdog",
8    machine.DEEPSLEEP_RESET: "DEEPSLEEP: derin uykudan uyanma / deep sleep wake-up",
9    machine.SOFT_RESET: "SOFT: Ctrl+D ile yazilim reseti / soft reset with Ctrl+D",
10}
11print("Reset nedeni / reset cause:", causes.get(machine.reset_cause(), "bilinmiyor / unknown"))
12
13while True:
14    gc.collect()                                     # çöp toplayıcıyı çalıştır / run the garbage collector
15    print("Bos RAM / free RAM:", gc.mem_free(), "bayt / bytes")
16    time.sleep(5)

Kesalahan umum dan solusinya

GejalaKemungkinan penyebabSolusi
“Brownout detector was triggered” ketika Wi-Fi mulaiKabel, port, atau regulator tidak bisa mengikuti arus puncakKabel pendek dan tebal, adaptor 1 A, 470 µF + 100 nF di antara 3V3 dan GND
Reset ketika servo berputar atau relay berpindahBeban berbagi jalur suplai dengan ESP32Beri daya beban dari suplai 5 V terpisah dan sambungkan GND-nya
Reset mulai terjadi begitu baterai sedikit berkurangDropout AMS1117Pakai LDO atau konverter buck-boost
Guru Meditation, EXCVADDR 0x00000000Null pointerCek pointer sebelum memakainya
“Stack canary watchpoint triggered (loopTask)”Stack loop() penuhJadikan array besar static atau pakai SET_LOOP_TASK_STACK_SIZE
“task_wdt: - IDLE (CPU 0)”Loop tanpa jeda di core 0Tambahkan vTaskDelay ke loop
“Interrupt wdt timeout on CPU1”ISR berjalan terlalu lamaDi ISR cukup setel flag, pakai IRAM_ATTR
Board diam, boot:0x3 dan “waiting for download”GPIO0 LOW ketika bootLepas rangkaian di GPIO0, tekan EN
Board sama sekali tidak mau boot, error membaca flashGPIO12 HIGH ketika bootPindahkan pull-up atau modul di GPIO12 ke pin lain
“Failed to connect to ESP32” ketika uploadGPIO2 HIGH atau board tidak bisa masuk ke mode pemrogramanKosongkan GPIO2, tahan BOOT ketika upload mulai
Jaga urutannya ketika mencari masalah: pertama ganti kabel dan catu daya, lalu tambahkan kapasitor, lalu beri daya terpisah untuk servo dan LED. Kalau reset masih terjadi setelah pesan brownout hilang, cek alasan reset di sketch diagnostik dan lanjut ke bagian perangkat lunak. Kalau kamu menyetel Tools > Core Debug Level ke Verbose, core ESP32 mencetak pesan yang jauh lebih detail tentang Wi-Fi dan event sistem. Untuk masalah upload, lihat juga kode Arduino gagal di-upload.

Board-mu sudah stabil: selanjutnya apa?

  • Perangkat hemat baterai: dengan deep sleep ESP32, tidurkan board di antara pengukuran dan tarik arus di kisaran mikroampere.
  • Pembaruan nirkabel: upload kode tanpa kabel USB memakai pembaruan OTA ESP32.
  • Dasbor real-time: pantau data sensor secara langsung di browser dengan WebSocket ESP32.
  • Kirim notifikasi: dengan bot Telegram ESP32, terima alasan reset di ponselmu setiap kali board restart.
  • Pertunjukan cahaya: kendalikan strip WS2812B NeoPixel dengan aman memakai suplai terpisah.

Sebagian besar masalah restart ESP32 adalah masalah daya atau beberapa baris kode yang bermasalah; begitu kamu membaca pesannya dengan benar, keduanya cepat beres. Untuk menyegarkan dasar-dasar board ini, lihat Apa Itu ESP32? Di aplikasi BlueGrays kamu akan menemukan proyek ESP32 dengan LED, servo, strip NeoPixel, koneksi Wi-Fi, web server, pembaruan OTA, dan deep sleep, masing-masing dengan skema rangkaian dan kode langkah demi langkah, jadi kamu bisa mencoba teknik daya dan diagnostik yang kamu pelajari di sini pada proyek sungguhan.

Pertanyaan umum

Bagaimana cara mengatasi ESP32 brownout detector was triggered?

Error ini berarti tegangan suplai ESP32 sempat turun di bawah sekitar 2,43 V. Pertama, pakai kabel USB yang pendek dan tebal dengan suplai 5 V ber-rating minimal 1 A, lalu tambahkan kapasitor elektrolit 100–470 µF dan kapasitor keramik 100 nF di antara 3V3 dan GND. Beri daya beban seperti servo, relay, dan LED strip dari suplai terpisah dan sambungkan GND-nya.

Kenapa ESP32-ku terus restart?

Penyebab paling umum adalah catu daya yang kurang (brownout), crash perangkat lunak (Guru Meditation), timeout watchdog, dan pin strapping yang tertahan di level yang salah ketika boot. Buka Serial Monitor di 115200 baud dan tekan EN; pesan terakhir sebelum reset dan kode rst ketika boot menunjukkan penyebabnya. Fungsi esp_reset_reason() juga memungkinkanmu membacanya dari kode.

Apa arti Guru Meditation Error LoadProhibited?

Artinya kode di ESP32 mencoba membaca dari alamat memori yang tidak valid. Kalau EXCVADDR bernilai 0 atau angka yang sangat kecil, hampir pasti ada null pointer yang dipakai. Tempel baris Backtrace ke ESP Exception Decoder untuk menemukan file dan baris tempat error terjadi.

Bolehkah aku mematikan brownout detector ESP32?

Bisa, baris WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0) mematikannya, tapi itu hanya membungkam peringatannya. Karena penurunan tegangan tetap terjadi, data di flash bisa rusak dan board bisa crash dengan error lain. Pakai ini hanya sebentar untuk memastikan bahwa masalahnya berasal dari catu daya.

Bagaimana cara mengatasi ESP32 Task watchdog got triggered?

Pesan ini berarti sebuah task yang diawasi tidak melepas CPU selama 5 detik; di Arduino daftarnya biasanya menunjukkan task IDLE milik core 0. Tambahkan vTaskDelay() ke loop di task-mu sendiri, pakai timeout ketika menunggu sensor, dan hindari delay() atau operasi panjang di callback web server. Mematikan watchdog menyembunyikan error-nya tapi tidak memperbaiki penyebabnya.

Catu daya seperti apa yang dibutuhkan ESP32?

Espressif menyarankan catu daya yang mampu memberi minimal 500 mA untuk ESP32; dalam praktiknya adaptor 5 V 1 A memberi margin yang aman. Kalau kamu memakai ESP32-CAM atau menambahkan beban seperti servo atau LED strip, pilih suplai dengan rating 2 A atau lebih dan kalau bisa beri daya beban itu dari jalur terpisah.

Lihat semua proyek
LED Berkedip dengan ESP32
#103Pemula

LED Berkedip dengan ESP32

Mengajarkan penggunaan output GPIO dasar dengan ESP32. Kita membuat efek berkedip dengan menyalakan dan mematikan LED dari pin digital. Versi ESP32 dari proyek blink klasik di Arduino UNO; perintah blink dasar di lingkungan Arduino sama, tetapi susunan pin ESP32 dan level GPIO 3,3 V-nya berbeda dengan Arduino UNO.

4.7(37)
99
Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)
#127Mahir

Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)

Di proyek ini, kita menyambungkan ESP32 ke jaringan Wi-Fi rumah dalam mode Station (STA) dengan cara yang aman dan tahan gangguan. Kita menyimpan SSID dan kata sandi di file secrets.h terpisah agar tidak bocor ke Git, menyiapkan mekanisme sambung ulang otomatis, dan menampilkan tingkat sinyal RSSI dan alamat IP di layar LCD I2C. LED bawaan bekerja sebagai indikator status. Ini adalah pengelola koneksi kelas produksi.

4.4(21)
34
Motor Servo ESP32 (Kendali Potensiometer)
#118Menengah
Premium

Motor Servo ESP32 (Kendali Potensiometer)

Di proyek ini, kita mengendalikan motor servo SG90 memakai potensiometer. Kita mengatur sudut servo dengan memetakan nilai analog yang dibaca dari potensiometer ke rentang 0–180 derajat. Library ESP32Servo menghasilkan sinyal servo di pin GPIO ESP32 yang sesuai dan bisa menjadi output; proyek ini memakai GPIO 18. Ini metode kendali dasar untuk lengan robot, gimbal kamera, dan mekanisme pintu otomatis.

4.3(29)
42
Kendali Strip NeoPixel WS2812B ESP32
#126Menengah
Premium

Kendali Strip NeoPixel WS2812B ESP32

LED addressable WS2812B (NeoPixel) adalah LED RGB pintar yang bisa dikendalikan secara berantai lewat satu pin data. Di proyek ini, kita mengendalikan strip WS2812B 8 LED dengan library Adafruit_NeoPixel untuk membuat animasi pelangi yang halus. Meskipun level logika 3,3V ESP32 bekerja lancar dengan sebagian besar komponen WS2812B, kita menunjukkan solusi dengan resistor seri 470Ω dan kapasitor 1000µF untuk berjaga-jaga jika tidak stabil. Animasinya dibuat dengan menggeser nilai hue.

4.9(19)
30
Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)
#129Mahir

Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)

Di proyek ini, kita mengubah ESP32 menjadi web server asinkron yang bisa kamu kendalikan dari ponsel atau komputer di jaringan Wi-Fi yang sama. Berkat library ESPAsyncWebServer, server bisa memproses beberapa permintaan bersamaan (berbeda dengan WebServer.h klasik, yang memblokir pada satu permintaan). Kamu bisa membuka alamat IP ESP32 di browser dan mengklik tombol ON/OFF (rute /on dan /off) untuk menyalakan dan mematikan LED yang tersambung ke GPIO 5.

4.8(16)
26
Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)
#135Mahir
Premium

Deep Sleep ESP32: Hemat Baterai (OLED + Penghitung RTC RAM)

Mode Deep Sleep ESP32 menurunkan konsumsi arus hingga ~10 µA dengan mematikan CPU dan sebagian besar periferal, sehingga sangat penting untuk perangkat IoT bertenaga baterai. Di proyek ini, kita memakai tiga sumber bangun yang berbeda: timer (15 detik), pin eksternal (EXT0, tombol GPIO 33), dan sentuhan (T0/GPIO 4). Variabel yang ditandai RTC_DATA_ATTR dipertahankan selama deep sleep; penghitung boot, penghitung bangun karena timer, dan penghitung bangun karena tombol terus dilacak.

4.3(10)
16
Pembaruan OTA ESP32: Instal Firmware Tanpa Kabel (dengan Layar LCD)
#132Mahir
Premium

Pembaruan OTA ESP32: Instal Firmware Tanpa Kabel (dengan Layar LCD)

Di proyek ini, kamu belajar cara meng-upload firmware baru ke ESP32 lewat Wi-Fi tanpa kabel USB. Dengan library ArduinoOTA, ESP32 terlihat di jaringan dan otomatis tercantum sebagai bluegrays-ota di tab "Network port" Arduino IDE. Upload pertama dilakukan lewat USB, dan semua pembaruan berikutnya tanpa kabel; fitur penting untuk perangkat di lapangan. Layar LCD I2C menampilkan status Wi-Fi, alamat IP, nama host, persentase upload OTA, dan pesan error.

4.6(14)
22
Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
#145Mahir
Premium

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)

Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

0.0(0)
9