Arduino Terus Reset? Solusi Masalah Servo, Relay, dan Arduino Macet
Arduino terus reset atau macet? Atasi langkah demi langkah: arus servo dan relay, penurunan tegangan, GND bersama, kapasitor 470 µF, RAM yang meluap, dan watchdog.
Kalau Arduino-mu terus reset atau macet setelah berjalan beberapa lama, board-nya hampir tidak pernah rusak. Dalam kebanyakan kasus penyebabnya adalah catu daya: ketika servo mulai bergerak, motor mulai berputar, atau relay menarik kontaknya, lonjakan arus yang tiba-tiba membuat jalur 5 V anjlok sekejap dan proteksi tegangan rendah prosesor (brown-out) me-restart board. Pada kasus sisanya, biang keroknya adalah derau listrik dari relay dan motor, kabel yang panjang, RAM yang penuh, watchdog yang terlupakan, atau port USB komputer yang tidak sanggup memberi arus cukup.
Di panduan ini kamu akan belajar dulu membedakan apakah board benar-benar reset atau hanya macet. Setelah itu kami jelaskan cara kerja setiap penyebab dengan nilai arus dan tegangan yang nyata, lalu menunjukkan solusinya beserta kode: catu daya terpisah dan GND bersama, kapasitor 100–470 µF, dioda flyback, buffer berukuran tetap sebagai pengganti String, dan watchdog. Kamu juga akan menemukan sketch diagnostik yang mengukur tegangan catu Arduino sendiri dan RAM yang masih kosong, tabel pemecahan masalah langkah demi langkah dari gejala sampai solusi, serta contoh membaca penyebab reset di ESP32 dan Raspberry Pi Pico.

Reset atau macet? Kenali gejalanya dulu
Arduino yang reset menjalankan program dari awal, seolah-olah kamu mencabut lalu menancapkan lagi kabel USB-nya: setup() berjalan lagi, servo kembali ke sudut awalnya, LCD menampilkan lagi teks pembukanya, dan pesan awal muncul lagi di Serial Monitor. Sebaliknya, Arduino yang macet tidak merespons apa pun; LED tetap di keadaan terakhirnya, output serial berhenti, dan board diam seperti itu sampai kamu menekan tombol reset. Karena penyebab dan solusinya berbeda, mulailah dengan mencari tahu mana yang kamu alami. Cara paling mudah adalah menambahkan baris Serial.println("STARTED") ke setup() dan membiarkan Serial Monitor tetap terbuka.
| Gejala | Reset | Macet |
|---|---|---|
| Apakah setup() berjalan lagi? | Ya, pesan awal muncul lagi | Tidak |
| Output serial | Berhenti, lalu mulai lagi dengan pesan awal | Berhenti dan tidak pernah kembali |
| Output dan LED | Padam sebentar, lalu kembali ke keadaan awal | Tertahan di keadaan terakhir |
| Penyebab paling umum | Penurunan tegangan, derau, watchdog | Loop tanpa akhir, bus I2C yang terkunci, RAM yang rusak |
| Cek dulu | Catu daya, GND, dan pengkabelan | Kode, pemakaian memori, dan pengkabelan sensor |
Kenapa Arduino me-reset dirinya sendiri? Sumber reset
Hanya ada sedikit sumber yang bisa me-restart prosesor ATmega328P di Arduino Uno dan Nano, dan masing-masing punya pemicunya sendiri. Ketika tegangan catu turun di bawah ambang tertentu, brown-out detector (BOD) mulai bekerja; di Uno dan Nano, pengaturan fuse bit chip menetapkan ambang ini di 2,7 V. Apa pun yang menarik pin RESET ke LOW juga me-restart board: tombol reset, sinyal DTR dari komputer, atau derau yang ditangkap kabel panjang yang terhubung ke pin itu. Ada juga kasus yang terlihat seperti reset padahal bukan: memori yang rusak membuat program melompat ke alamat 0 dan kode mulai dari awal, tetapi karena periferal hardware tidak ikut di-reset, board mulai berperilaku aneh.
| Sumber reset | Apa pemicunya? | Gejala khas |
|---|---|---|
| Power-on (POR, daya dinyalakan) | Menancapkan kabel, daya hilang sepenuhnya | Menyala normal |
| Reset eksternal (pin RESET) | Tombol reset, membuka Serial Monitor (DTR), derau di pin RESET | Mulai dari awal ketika port dibuka atau kabel disentuh |
| Brown-out (BOD, 2,7 V) | Arus lonjakan (inrush) servo, motor, relay, atau LED strip, baterai lemah | Reset tepat ketika beban bergerak |
| Watchdog | wdt_reset() tidak dipanggil tepat waktu | Reset dengan interval teratur (mis. tepat setiap 2 detik) |
| Crash perangkat lunak | Array melewati batas, RAM meluap, pointer yang salah | Reset atau macet acak setelah beberapa menit atau jam |
Arus servo, motor, dan relay: bagaimana penurunan tegangan menyebabkan reset
Servo SG90 menarik 100–250 mA ketika bergerak, tetapi ketika mulai berputar dan ketika lengannya terbebani, arusnya melonjak di atas 0,5 A. Port USB 2.0 komputer memberi paling banyak 500 mA, dan sekring di jalur USB Uno juga bekerja di batas yang sama. Ketika servo, 50 mA milik board sendiri, dan beberapa modul melewati batas ini, port atau sekring membatasi arus, jalur 5 V anjlok sekejap, dan jika tegangan turun di bawah 2,7 V, BOD me-reset board. Kasus yang lebih licik adalah ketika tegangan tertahan di antara 2,7 V dan sekitar 3,8 V: menurut datasheet ATmega328P, chip ini butuh kira-kira 3,8 V agar bisa berjalan aman di 16 MHz. Di zona abu-abu ini BOD tidak terpicu, tetapi prosesor berjalan di luar batas kecepatannya, sehingga board bisa macet alih-alih reset, menghasilkan nilai ngawur, atau layar dan sensor I2C bisa terkunci di dalam dirinya sendiri.
| Beban | Arus normal | Arus puncak | Boleh diberi daya dari pin 5V Uno? |
|---|---|---|---|
| Servo mikro SG90 | 100–250 mA | 0,5 A atau lebih (mulai berputar, terbebani) | Hanya satu servo dengan beban ringan |
| Servo MG996R | 0,5–0,9 A | Sampai 2,5 A | Tidak, catu 5–6 V terpisah wajib |
| Motor DC gearbox TT | 70–250 mA | ~1 A (mulai berputar, tertahan/stall) | Tidak, pakai driver motor dan catu terpisah |
| Modul relay 5 V (satu kanal) | 70–90 mA | Pulsa singkat ketika kumparan mulai dialiri arus | 1–2 kanal ya, 4 atau lebih dari catu terpisah |
| LED WS2812B (per buah) | ~20 mA (satu warna, kecerahan penuh) | 60 mA (putih penuh) | Tidak; 30 LED putih penuh butuh 1,8 A |
Kabel juga berpengaruh. Kabel jumper tipis yang dipakai di proyek breadboard biasanya 26–28 AWG, dan kawat tembaga 28 AWG punya hambatan sekitar 0,21 Ω per meter. Kalau kamu memberi daya ke servo lewat dua kabel 20 cm (0,4 m pergi-pulang) dan breadboard, kabelnya menambah sekitar 0,085 Ω dan empat kontak breadboard menambah sekitar 0,2 Ω bersama-sama. Menurut hukum Ohm (V = I × R), pulsa servo 1 A kehilangan sekitar 0,3 V di hambatan 0,29 Ω ini. Kabel USB yang tipis dan panjang, sekring, dan komponen proteksi di board menambah kira-kira setengah ohm lagi; pada pulsa yang sama jalur 5 V Arduino turun di bawah 4,5 V, dan kalau port komputer mulai membatasi arus, penurunannya jauh lebih dalam. Kamu bisa menghitung penurunan tegangan di rangkaianmu sendiri dengan kalkulator hukum Ohm.
Solusi 1: Catu daya terpisah dan GND bersama
- Pilih catu terpisah untuk servo dan motor: untuk servo, adaptor 5–6 V yang memberi minimal 1 A per servo (2–3 A untuk MG996R), paket 4×AA NiMH, atau modul buck LM2596 yang disetel ke 5–6 V.
- Hubungkan kutub positif catu hanya ke kabel merah servo atau ke input daya driver motor; jangan hubungkan jalur ini ke pin 5V Arduino.
- Hubungkan kutub negatif catu (GND) ke beban sekaligus ke pin GND Arduino. Tanpa GND bersama ini, tegangan pin sinyal tidak punya acuan; servo bergetar atau sama sekali tidak bergerak.
- Satukan semua GND di satu titik di dekat catu daya (star grounding atau pentanahan bintang). Arus motor tidak boleh kembali lewat Arduino dan jalur GND-nya; kalau tidak, level GND Arduino bergeser setiap ada pulsa motor.
- Beri daya ke Arduino dari input-nya sendiri: USB, jack DC (7–12 V), atau 5 V teregulasi. Dengan begitu prosesor tidak terpengaruh meskipun catu servo anjlok.
- Terakhir, ukur tegangan di antara pin 5V dan GND Arduino ketika servo bergerak, atau jalankan sketch diagnostik di bawah; tegangannya tidak boleh turun di bawah 4,75 V.

Solusi 2: Kapasitor (100–470 µF) dan dioda
Kapasitor elektrolit bekerja seperti penyimpan energi kecil yang duduk di sebelah beban: ketika servo meminta arus mendadak, kapasitor sendiri yang memasok arus itu sampai kabel dan catu daya sempat menyusul. Rumus ΔV = I × Δt / C memberi tahu seberapa besar bantuannya. Kapasitor 470 µF hanya membiarkan tegangan turun 0,21 V selama pulsa 1 A yang berlangsung 100 µs; kalau pulsa yang sama berlangsung 1 ms, penurunannya 2,1 V. Dengan kata lain, kapasitor menelan pulsa singkat dan derau dari sikat motor, tetapi tidak bisa menggantikan catu daya yang kurang kuat. Pasang 470–1000 µF di jalur servo dan 100 µF di antara 5V dan GND Arduino, lalu tambahkan kapasitor keramik 100 nF bertanda 104 di samping masing-masing untuk meredam derau frekuensi tinggi. Pakai alat kode kapasitor untuk membaca tandanya dan kalkulator jaringan kapasitor untuk menghitung total kapasitor yang dipasang paralel; perbedaan antarjenisnya dibahas di Apa Itu Kapasitor?.
| Di mana? | Nilai | Kenapa? |
|---|---|---|
| Jalur catu servo, di dekat servo | Elektrolit 470–1000 µF / 10–16 V + 100 nF | Melunakkan pulsa ketika servo mulai bergerak |
| Di antara dua terminal motor DC | Keramik 100 nF | Menyaring derau dari percikan sikat motor |
| Di antara 5V dan GND Arduino | Elektrolit 100 µF + 100 nF | Melindungi jalur prosesor dari penurunan singkat |
| Input strip WS2812B | 1000 µF / 10 V | Menahan arus lonjakan awal dan pulsa pergantian warna |
| Pin catu sensor dan modul | Keramik 100 nF | Menyaring derau yang terbawa kabel panjang |

Kumparan relay, motor, dan solenoid semuanya adalah induktor. Ketika arus yang melewatinya diputus mendadak, kumparan melawan perubahan itu dan menghasilkan lonjakan tegangan singkat sebesar puluhan bahkan ratusan volt, jauh di atas tegangan catu. Lonjakan ini menyebar di sepanjang jalur dan me-reset Arduino, bahkan bisa merusak transistor driver atau pin-nya. Solusinya adalah dioda flyback yang dipasang paralel dengan kumparan, dengan arah terbalik: ujung katoda 1N4007 yang bergaris ke sisi positif, ujung lainnya ke sisi yang menuju transistor. Modul relay siap pakai sudah dilengkapi dioda ini; kalau kamu memakai relay polos, solenoid, atau motor yang dikendalikan transistor atau MOSFET, kamu harus menambahkan diodanya sendiri. Untuk motor dengan pengaturan kecepatan PWM, dioda Schottky 1N5819 yang lebih cepat memberi hasil lebih baik. Selengkapnya, lihat Apa Itu Dioda? dan Memakai MOSFET dengan Arduino.

Derau, kontak relay, dan kabel panjang
Kalau board reset tepat ketika relay mati, masalahnya adalah derau, bukan catu daya. Ketika relay mematikan pompa air, kipas, lampu neon, atau kontaktor, terbentuk busur listrik kecil di antara kontaknya, dan busur ini memancarkan derau elektromagnetik pita lebar. Derau itu masuk ke kabel sensor di dekatnya, jalur RESET, dan jalur I2C, sehingga prosesor reset atau sebuah modul terkunci. Untuk mencegahnya, pakai modul relay dengan optocoupler, lepas jumper JD-VCC, dan beri daya kumparan relay dari catu 5 V terpisah; cara ini menjauhkan arus kumparan dan derau dari jalur Arduino. Untuk beban induktif listrik PLN, snubber RC (100 Ω + 100 nF, kelas X2) atau varistor di kedua ujung kontak atau beban sangat menekan busur listriknya. Detail pengkabelan bisa kamu temukan di Apa Itu Modul Relay? dan konsep isolasinya di Apa Itu Optocoupler?.
- Buat I2C tetap pendek: I2C dirancang untuk jarak pendek di atas papan sirkuit. Jaga kabel SDA dan SCL di bawah 50 cm; untuk jalur yang lebih panjang, turunkan resistor pull-up dari 4,7 kΩ ke 2,2 kΩ dan biarkan kecepatannya di 100 kHz.
- Pakai kabel terpilin: Pilin setiap kabel sinyal bersama satu kabel GND; pasangan terpilin di kabel jaringan (LAN) ideal untuk ini.
- Pisahkan daya dan sinyal: Jangan menarik kabel sensor sejajar dengan kabel motor, relay, atau listrik PLN; kalau harus bersilangan, silangkan tegak lurus.
- Jangan ganggu pin RESET: Kabel panjang di pin RESET bertindak seperti antena dan me-reset board ketika disentuh atau ketika motor di dekatnya berjalan. Kalau kamu butuh tombol reset eksternal, buat kabelnya pendek.
- Ferit dan casing: Cincin ferit di kabel motor dan casing logam mengurangi derau frekuensi tinggi.
- Tambahkan timeout: Kalau derau mengunci bus I2C, library Wire secara default menunggu selamanya dan board pun macet. Kode di bawah mencegah macet ini dengan timeout.
1#include <Wire.h>
2
3const uint8_t ADDR = 0x27; // örnek: I2C LCD adresi / example: I2C LCD address
4
5void setup() {
6 Serial.begin(9600);
7 Wire.begin();
8 Wire.setWireTimeout(25000, true); // 25 ms; takılırsa I2C birimini sıfırla / reset the I2C unit on timeout
9}
10
11void loop() {
12 Wire.beginTransmission(ADDR);
13 byte err = Wire.endTransmission(); // 0 = cihaz cevap verdi / 0 = device answered
14
15 if (Wire.getWireTimeoutFlag()) { // hat kilitlendi ama program donmadı / bus hung, sketch did not freeze
16 Serial.println(F("I2C zaman asimi / I2C timeout"));
17 Wire.clearWireTimeoutFlag();
18 } else if (err != 0) {
19 Serial.print(F("I2C hatasi / I2C error: "));
20 Serial.println(err); // 2 = cihaz yok, 5 = zaman aşımı / 2 = no device, 5 = timeout
21 }
22 delay(1000);
23}RAM meluap dan pemakaian String
Arduino Uno hanya punya 2 KB SRAM, dan ruang kecil ini dipakai bersama oleh variabel global, memori dinamis (heap), dan stack yang dipakai pemanggilan fungsi. Kalau di akhir kompilasi kamu melihat peringatan Low memory available, stability problems may occur., besar kemungkinan board akan crash setelah beberapa lama. Penyebab paling licik adalah kelas String: setiap penggabungan mengalokasikan potongan baru di heap, potongan lama dibebaskan, dan lama-lama memori penuh lubang. Suatu hari stack bertabrakan dengan heap dan program reset atau macet di momen acak. Karena masalah ini biasanya baru muncul setelah beberapa menit atau jam, ia mudah dibedakan dari masalah catu daya. Simpan teks konstan di flash dengan makro F(), pakai array char berukuran tetap dan snprintf() sebagai pengganti String, dan jangan mendeklarasikan array lokal yang besar di dalam fungsi. Kode di bawah mencetak RAM kosong setiap detik; kalau nilainya terus turun, ada kebocoran memori. Pembahasan lengkapnya ada di memori Arduino tidak cukup.
1extern int __heap_start, *__brkval;
2
3// Heap ile stack arasındaki boş RAM / free RAM between heap and stack
4int freeRam() {
5 int v;
6 return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
7}
8
9char line[32]; // sabit tampon, bir kez ayrılır / fixed buffer, allocated once
10unsigned long counter = 0;
11
12void setup() {
13 Serial.begin(9600);
14}
15
16void loop() {
17 counter++;
18 // Kaçın / avoid: String s = "Sayac: " + String(counter) + " sn";
19 snprintf(line, sizeof(line), "Sayac: %lu sn", counter); // heap kullanmaz / no heap use
20 Serial.println(line);
21
22 Serial.print(F("Bos RAM / free RAM: ")); // F(): metin flaşta kalır / text stays in flash
23 Serial.println(freeRam()); // sürekli azalıyorsa sızıntı var / steady drop = leak
24 delay(1000);
25}Watchdog: sabuk pengaman melawan macet
Watchdog timer adalah penghitung di dalam prosesor yang berjalan mandiri dengan osilator 128 kHz miliknya sendiri. Programmu harus “memberinya makan” secara teratur dengan wdt_reset(); kalau tidak diberi makan dalam waktu yang ditentukan (antara 15 ms dan 8 detik), watchdog me-reset board. Dengan begitu bus I2C yang terkunci, fungsi yang terjebak di loop tanpa akhir, atau pembacaan sensor yang rusak karena derau tidak bisa membuat board macet selamanya; board pulih dalam beberapa detik. Ingat, watchdog adalah sabuk pengaman, bukan perbaikan: ia tidak menyelesaikan masalah catu daya atau memori, hanya membuat proyek yang berjalan di lapangan bisa pulih sendiri. Pilih timeout yang jelas lebih lama daripada operasi terpanjang di kodemu; pada kode yang berisi delay(3000), watchdog 2 detik akan me-reset board terus-menerus.
1#include <avr/wdt.h>
2
3const int LED_PIN = 13;
4
5void setup() {
6 MCUSR = 0; // reset bayraklarını temizle / clear reset flags
7 wdt_disable(); // açılışta watchdog kapalı / watchdog off during startup
8 Serial.begin(9600);
9 pinMode(LED_PIN, OUTPUT);
10 Serial.println(F("Basladi / started"));
11 delay(500);
12 wdt_enable(WDTO_2S); // 2 sn içinde beslenmezse reset / reset if not fed within 2 s
13}
14
15void loop() {
16 digitalWrite(LED_PIN, !digitalRead(LED_PIN));
17 delay(250);
18
19 // Seri Monitör'den 'x' gönder: takılmayı taklit eder / send 'x' to simulate a hang
20 if (Serial.available() && Serial.read() == 'x') {
21 Serial.println(F("Sonsuz donguye girildi / stuck in a loop"));
22 while (true) {} // wdt_reset() yok: 2 sn sonra reset / no wdt_reset(): reset after 2 s
23 }
24
25 wdt_reset(); // her turda besle / feed it every loop
26}Sketch diagnostik: biarkan Arduino mengukur tegangan dan RAM-nya sendiri
Multimeter terlalu lambat untuk melihat penurunan tegangan yang hanya berlangsung milidetik. Sebagai gantinya, kamu bisa memakai Arduino itu sendiri sebagai alat ukur sederhana: kode di bawah memakai ADC untuk mengukur referensi internal chip sebesar 1,1 V lalu menghitung tegangan catu dari situ, sekitar 9000 kali per detik, dan mencetak nilai terendah setiap detik. Kode ini juga menaikkan penghitung di EEPROM setiap kali board menyala, jadi meskipun kamu baru membuka Serial Monitor belakangan, kamu tetap bisa melihat berapa kali board sudah restart. Sebagai beban uji, kode ini menggerakkan servo di D9 antara 0 dan 180 derajat setiap 2 detik; kalau kamu punya proyek sendiri, bagian pengukurannya bisa ditambahkan ke kode proyekmu. Buka Serial Monitor di 115200 baud.
1// Reset teşhis kodu (Uno, Nano) / reset diagnostic sketch (Uno, Nano)
2#include <EEPROM.h>
3#include <Servo.h>
4
5Servo servo;
6extern int __heap_start, *__brkval;
7
8int freeRam() {
9 int v;
10 return (int)&v - (__brkval == 0 ? (int)&__heap_start : (int)__brkval);
11}
12
13// Besleme gerilimini dahili 1,1 V referansla ölç / measure supply voltage against the internal 1.1 V reference
14long readVcc() {
15 ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
16 ADCSRA |= _BV(ADSC); // ölçümü başlat / start a conversion
17 while (bit_is_set(ADCSRA, ADSC)) {} // bitmesini bekle / wait until it is done
18 return 1125300L / ADC; // 1100 mV × 1023 / okuma → mV / reading → mV
19}
20
21long minVcc = 9999;
22unsigned long lastPrint = 0, lastMove = 0;
23bool sideA = false;
24
25void setup() {
26 Serial.begin(115200);
27 uint16_t boots;
28 EEPROM.get(0, boots); // açılış sayacı / boot counter
29 if (boots == 0xFFFF) boots = 0; // boş EEPROM / blank EEPROM
30 EEPROM.put(0, ++boots);
31 Serial.print(F("BASLADI / STARTED acilis no / boot #"));
32 Serial.println(boots);
33
34 servo.attach(9); // test yükü: servo D9'da / test load: servo on D9
35 readVcc(); // ilk ölçümü at / discard the first reading
36 delay(5);
37}
38
39void loop() {
40 long v = readVcc(); // saniyede ~9000 ölçüm / ~9000 samples per second
41 if (v < minVcc) minVcc = v;
42
43 if (millis() - lastMove >= 2000) { // 2 sn'de bir servoyu oynat / move the servo every 2 s
44 lastMove = millis();
45 sideA = !sideA;
46 servo.write(sideA ? 180 : 0);
47 }
48
49 if (millis() - lastPrint >= 1000) {
50 lastPrint = millis();
51 Serial.print(F("sn/s: "));
52 Serial.print(millis() / 1000);
53 Serial.print(F(" min Vcc (mV): "));
54 Serial.print(minVcc);
55 Serial.print(F(" bos RAM / free RAM: "));
56 Serial.println(freeRam());
57 minVcc = 9999; // her saniye sıfırla / reset every second
58 }
59}Baca hasilnya seperti ini: pada Uno yang sehat dan diberi daya dari USB, nilai terendah tetap di antara 4,6 dan 5,1 V. Kalau nilainya turun di bawah 4,5 V setiap kali servo bergerak dan reset terjadi bersamaan dengan momen itu, masalahnya ada di catu daya. Kalau nomor boot terus bertambah padahal tegangannya stabil, cari penyebab berupa derau atau perangkat lunak; kalau pada waktu yang sama RAM kosong terus berkurang, ada kebocoran memori. Referensi internal 1,1 V bisa berbeda sekitar 10% dari satu chip ke chip lain, jadi bandingkan pembacaannya sekali dengan multimeter: kalau multimeter menunjukkan 4,95 V sementara kode mencetak 5,10 V, ubah konstanta 1125300 menjadi 1125300 × 4,95 / 5,10 ≈ 1092200. Hapus penghitung EEPROM dari kode kalau sudah selesai; sel EEPROM dirancang untuk sekitar 100.000 kali tulis.
Tabel pemecahan masalah langkah demi langkah: gejala, penyebab, solusi
Baca tabel dari atas ke bawah; baris-baris pertama adalah penyebab yang paling umum. Ubah hanya satu hal setiap kali, lalu jalankan lagi sketch diagnostiknya. Kalau kamu mengubah tiga hal sekaligus, kamu tidak akan tahu mana yang menyelesaikan masalah, dan kerusakan yang sama akan muncul lagi di proyekmu berikutnya.
| Gejala | Kemungkinan penyebab | Cara memastikan | Solusi |
|---|---|---|---|
| Reset ketika servo atau motor bergerak | Arus lonjakan membuat jalur 5 V anjlok | Tegangan terendah di sketch diagnostik turun di bawah 4,5 V | Catu 5–6 V terpisah, GND bersama, 470–1000 µF |
| Reset ketika relay lepas, bukan ketika menarik | Busur kontak dan lonjakan kumparan (derau) | Masalah hilang ketika beban relay dilepas | Catu terpisah lewat JD-VCC, snubber atau varistor, dioda flyback |
| Mulai dari awal ketika Serial Monitor dibuka | Auto-reset DTR (perilaku normal) | STARTED muncul setiap kali port dibuka | Bukan kerusakan; kalau perlu, 10 µF di antara RESET dan GND |
| Reset hanya di komputer, aman dengan adaptor | Port USB atau hub tidak sanggup memberi arus cukup | Beres dengan port lain dan kabel yang pendek dan tebal | Pakai port belakang atau hub berdaya, beri daya beban secara terpisah |
| Reset ketika ada gerakan, dengan baterai 9V | Hambatan dalam tinggi, tegangan anjlok | Vin turun di bawah 7 V ketika bergerak | 6×AA atau paket 2S 18650 |
| Reset atau macet setelah beberapa menit atau jam | RAM meluap, fragmentasi String | RAM kosong terus berkurang | F(), array char, snprintf, array lokal yang kecil |
| Reset dengan interval yang persis teratur | Watchdog tidak diberi makan tepat waktu | Interval reset sama dengan timeout watchdog | Tambahkan wdt_reset() atau perpanjang timeout, hindari delay() yang lama |
| Di Nano, kode tidak pernah mulai setelah watchdog reset | Bug watchdog pada bootloader lama | Board hanya bisa di-upload dengan opsi Old Bootloader | Tulis (burn) bootloader Optiboot |
| Macet acak ketika kabel sensor yang panjang dipasang | Bus I2C terkunci karena derau | Flag timeout Wire aktif | Kabel pendek terpilin, pull-up 2,2 kΩ, setWireTimeout, watchdog |
| Reset ketika tanganmu mendekat atau menyentuh | Kabel panjang di pin RESET, listrik statis | Beres ketika kabelnya dilepas | Buat jalur RESET pendek, masukkan rangkaian ke casing |
| Regulator sangat panas, lalu reset | Arus besar dengan 12 V di jack, regulator masuk thermal shutdown | Regulator terlalu panas untuk disentuh | Adaptor 7–9 V atau modul buck 5 V |
| Board tidak menyala atau port-nya hilang | Korsleting, sekring USB putus | Board menyala ketika modul dilepas | Cari korsletingnya, cek apakah board rusak |
Port USB tidak sanggup memberi arus cukup, dan reset dari Serial Monitor
Port USB 2.0 komputer memberi 500 mA dan port USB 3.0 memberi 900 mA; tetapi karena sekring USB Uno membatasi di 500 mA, port USB 3.0 tidak memberimu arus tambahan. Hub USB tanpa catu daya membagi arus satu port ke semua perangkatnya, port di panel depan casing kehilangan tegangan karena kabel internalnya tipis, dan laptop yang berjalan dengan baterai bisa memberi daya lemah ke port-nya dalam mode hemat daya. Tancapkan board langsung ke port belakang dengan kabel pendek berkualitas baik. Ada juga reset yang bukan kerusakan: Uno dan Nano me-reset dirinya lewat sinyal DTR ketika Serial Monitor atau program Python membuka port, dan justru fitur inilah yang membuat upload kode bisa dilakukan. Kalau kamu berkomunikasi dari Python, tunggu 2 detik setelah membuka port (komunikasi serial Arduino dan Python). Kalau ingin mematikan reset ini sepenuhnya, pasang kapasitor 10 µF di antara RESET dan GND, lalu lepas ketika meng-upload. Detail port serial ada di Serial Monitor Arduino.
ESP32 terus reset: membaca penyebab reset
ESP32 bahkan lebih sensitif terhadap masalah yang sama karena berjalan di 3,3 V dan menarik sekitar 240 mA selama transmisi Wi-Fi, lebih besar lagi pada puncak singkat; Espressif menyarankan catu daya yang sanggup memberi minimal 500 mA. Kabar baiknya, ESP32 sendiri memberi tahu kenapa ia restart. Pesan Brownout detector was triggered di Serial Monitor berarti ada penurunan tegangan, dan baris rst:0xf (RTCWDT_BROWN_OUT_RESET) atau Guru Meditation Error ketika boot menunjukkan penyebab reset. Kode di bawah membaca informasi yang sama dengan esp_reset_reason() dan mengubahnya menjadi teks yang mudah dibaca. Di ESP32, tombol EN mematikan dan menyalakan chip sepenuhnya, jadi reset dengan tombol ini juga tercatat sebagai power-on. Untuk semua pesan dan solusinya, lihat error brownout dan Guru Meditation ESP32.
1#include <esp_system.h>
2
3// Reset sebebini yazıya çevir / turn the reset reason into text
4const char* reasonText(esp_reset_reason_t r) {
5 switch (r) {
6 case ESP_RST_POWERON: return "Guc acilisi ya da EN tusu / power-on or EN button";
7 case ESP_RST_SW: return "Yazilimla (ESP.restart) / software restart";
8 case ESP_RST_PANIC: return "Cokme (Guru Meditation) / panic";
9 case ESP_RST_INT_WDT: return "Kesme watchdog'u / interrupt watchdog";
10 case ESP_RST_TASK_WDT: return "Gorev watchdog'u / task watchdog";
11 case ESP_RST_WDT: return "Diger watchdog / other watchdog";
12 case ESP_RST_DEEPSLEEP: return "Derin uykudan uyanma / deep sleep wake-up";
13 case ESP_RST_BROWNOUT: return "Gerilim dusmesi (brownout) / brownout";
14 default: return "Bilinmeyen / unknown";
15 }
16}
17
18void setup() {
19 Serial.begin(115200);
20 delay(500);
21 esp_reset_reason_t r = esp_reset_reason();
22 Serial.print("Reset nedeni / reset reason: ");
23 Serial.println(reasonText(r));
24}
25
26void loop() {
27 Serial.print("Calisma suresi / uptime (s): ");
28 Serial.println(millis() / 1000);
29 delay(5000);
30}Raspberry Pi Pico: penyebab reset dan watchdog (MicroPython)
Berkat regulator buck-boost-nya, Raspberry Pi Pico berjalan dengan tegangan berapa pun antara 1,8 dan 5,5 V di pin VSYS, sehingga lebih tahan terhadap penurunan tegangan dibanding Arduino. Meski begitu, kalau kamu menghubungkan servo ke pin VBUS yang membawa 5 V dari USB, arusnya ditarik langsung dari port komputer, dan kalau port itu anjlok, Pico ikut mati; kamu juga tidak boleh menarik lebih dari 300 mA total dari pin 3V3. Pin reset Pico, RUN, ditarik ke atas oleh resistor internal chip sekitar 50 kΩ; menghubungkan kabel panjang ke pin ini membuka pintu bagi derau, persis seperti pin RESET di Arduino. Di MicroPython, machine.reset_cause() di Pico hanya mengembalikan dua nilai: PWRON_RESET untuk power-on atau pin RUN, dan WDT_RESET untuk watchdog atau machine.reset(). Watchdog bisa disetel paling lama 8388 ms dan tidak bisa dihentikan setelah dimulai; ia tetap me-reset board meskipun kamu menghentikan program di Thonny. Karena itu, taruh jeda 3 detik di awal kodemu.
1import machine, time
2from machine import Pin
3
4time.sleep(3) # Thonny durdurabilsin diye bekle / wait so Thonny can stop the script
5
6neden = machine.reset_cause()
7if neden == machine.WDT_RESET:
8 print("Watchdog ya da machine.reset() / watchdog or machine.reset()")
9else:
10 print("Guc acilisi ya da RUN pini / power-on or RUN pin")
11
12led = Pin("LED", Pin.OUT) # Pico ve Pico W dahili LED / onboard LED
13wdt = machine.WDT(timeout=5000) # 5 sn; RP2040'ta en fazla 8388 ms / max 8388 ms on RP2040
14
15sayac = 0
16while True:
17 led.toggle()
18 sayac += 1
19 print("Calisiyor / running", sayac)
20 wdt.feed() # her turda besle / feed it every loop
21 time.sleep(1)Susunan daya yang tepat untuk proyekmu
- Mobil robot: Beri daya motor dari paket 2S 18650 lewat L298N atau L9110S dan pasang kapasitor 100 nF di kedua terminal motor; cara merakitnya ada di Mobil Robot Arduino.
- Lengan robot servo: Untuk empat servo atau lebih, pakai catu 5–6 V yang memberi minimal 3–5 A dan tambahkan 1000 µF di jalur servo; untuk memilih komponen, lihat servo MG996R dan lengan robot Arduino.
- Sistem penyiraman dengan pompa dan relay: Beri daya pompa dari catu terpisah, isolasi relay dengan JD-VCC, dan jauhkan kabel sensor yang panjang dari kabel pompa (sensor kelembapan tanah).
- LED strip dan NeoPixel: Siapkan sekitar 2 A untuk setiap 30 LED, pasang 1000 µF di input strip dan resistor 300–500 Ω di jalur data (LED strip WS2812B NeoPixel).
- Mengendalikan motor DC: Jangan lupa dioda flyback di setiap motor yang kamu kendalikan dengan transistor atau MOSFET; untuk board driver siap pakai, lihat Mengendalikan Motor DC dengan L298N.
- Stasiun sensor di lapangan: Aktifkan watchdog, setel timeout I2C, dan ambil daya dari sumber yang efisien seperti buck converter LM2596.
Arduino yang me-reset dirinya sendiri memang menjengkelkan, tetapi hampir selalu ada penyebab yang bisa diukur dan diperbaiki: kenali dulu gejalanya, lalu ukur tegangan dan RAM dengan sketch diagnostik, kemudian pisahkan catu daya, satukan GND, tambahkan kapasitor dan dioda, dan amankan proyek dengan watchdog kalau perlu. Begitu susunan ini terpasang, proyek servo, motor, dan relay-mu akan berjalan berhari-hari tanpa masalah. Di aplikasi BlueGrays kamu akan menemukan proyek kendali motor servo, Mobil Kendali Bluetooth dengan L298N, Robot Penghindar Rintangan, menyalakan bohlam 220 V, dan Stasiun Penyiraman Pintar, lengkap dengan skema rangkaian yang menunjukkan koneksi daya yang benar dan kode langkah demi langkah.
Pertanyaan umum
Kenapa Arduino-ku terus reset?
Penyebab paling umum adalah arus mendadak dari servo, motor, atau relay yang membuat jalur 5 V turun sekejap, sehingga proteksi tegangan rendah 2,7 V di prosesor me-restart board. Derau dari kontak relay, RAM yang meluap, watchdog yang tidak diberi makan, dan port USB yang tidak sanggup memberi arus cukup juga menyebabkan reset. Memberi daya servo dan motor dari catu terpisah dan menyatukan GND menyelesaikan sebagian besar kasus.
Kenapa Arduino-ku reset ketika servo bergerak?
Bahkan servo SG90 yang kecil menarik lebih dari 0,5 A ketika mulai bergerak dan, bersama beban lain di board, melewati batas port USB dan sekring 500 mA milik Uno. Ketika tegangannya anjlok, board reset. Beri daya servo dari catu 5–6 V terpisah, hubungkan GND catu itu ke GND Arduino, dan tambahkan kapasitor 470–1000 µF di jalur servo.
Kenapa Arduino-ku reset ketika relay bekerja?
Kumparan relay menarik arus mendadak ketika mulai dialiri arus, dan kumparan serta kontaknya menghasilkan derau ketika relay lepas. Busur listrik yang muncul ketika beban induktif seperti pompa, kipas, atau lampu neon dimatikan bisa me-reset Arduino. Pada modul dengan optocoupler, lepas jumper JD-VCC dan beri daya relay dari catu terpisah, tambahkan snubber atau varistor di kedua ujung beban, dan jauhkan kabel sensor dari kabel beban.
Kenapa Arduino-ku macet setelah beberapa lama?
Macet yang muncul setelah beberapa menit atau jam paling sering disebabkan oleh RAM yang penuh dan penggabungan String yang memecah-mecah memori. Bus I2C yang terkunci karena derau atau kode yang menunggu di loop tanpa akhir juga bisa membuat board macet. Ukur RAM kosong, pakai array char sebagai pengganti String, setel timeout dengan Wire.setWireTimeout(), dan aktifkan watchdog sebagai jaring pengaman.
Kapasitor apa yang sebaiknya kutambahkan ke rangkaian Arduino?
470–1000 µF di jalur catu servo dan motor serta kapasitor elektrolit 100 µF di antara 5V dan GND Arduino bekerja dengan baik. Menambahkan kapasitor keramik 100 nF (104) di samping masing-masing juga menyaring derau frekuensi tinggi. Rating tegangan kapasitor elektrolit minimal dua kali tegangan jalur, dan kaki negatifnya yang bergaris dihubungkan ke GND.
Kenapa Arduino-ku reset ketika Serial Monitor dibuka?
Uno dan Nano me-reset dirinya lewat sinyal DTR ketika port serial dibuka; ini bukan kerusakan, melainkan fitur auto-reset yang membuat upload kode bisa dilakukan. Kalau kamu berkomunikasi dari program seperti Python, tunggu 2 detik setelah membuka port. Untuk mematikan reset ini, pasang kapasitor 10 µF di antara RESET dan GND dan lepas sebelum meng-upload.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Menggunakan Motor Servo
Lengan motor servo kecil berputar ke tiga posisi bergantian: penuh ke awal, tepat ke tengah, dan penuh ke akhir, menunggu dua detik di setiap perhentian. Arduino memberi tahu motor sudut mana yang har

Menyalakan Bohlam 220V dengan Tombol Tekan
Selama kamu menahan tombol, bohlam 220 volt sungguhan tetap menyala, dan mati begitu kamu melepasnya. Sinyal kecil Arduino tidak bisa langsung menyalakan bohlam, jadi relay, sakelar yang dikendalikan

Mobil Kendali Bluetooth dengan L298N
Jadikan ponselmu remote dan kendarai mobil robotmu sendiri. Arduino menerima perintah dari aplikasi remote control di ponselmu lewat modul Bluetooth dan memutar roda dengan driver motor; mobil maju, m

Robot Penghindar Rintangan
Bagaimana kalau membuat kendaraan pintar yang mencari jalannya sendiri? Robot Penghindar Rintangan terus memindai sekelilingnya berkat sensor ultrasonik di depannya. Ketika menemui rintangan, robot be

Stasiun Penyiraman Pintar
Tukang kebun yang menyiram tanamanmu sendiri, supaya tanaman tidak kering ketika kamu berlibur. Sensor kelembapan tanah mengukur seberapa basah tanahnya; ketika kering, Arduino menyalakan pompa air be

Koreografi Lingkaran Servo - Pola Animasi dengan 32 Servo
Proyek animasi visual dengan 32 motor servo yang disusun melingkar di Arduino Mega. Servo-servo dikelola dalam satu array, tersambung ke pin 22-53 Mega, dan menampilkan empat urutan gerak: getaran kacau ketika semua servo bergerak ke sudut acak, sapuan serempak ketika semuanya bergerak bersamaan, gelombang yang berputar halus mengelilingi lingkaran, dan terakhir jarum kompas yang berayun ke kiri dan kanan.

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.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

