{"id":26,"date":"2026-02-09T12:00:53","date_gmt":"2026-02-09T05:00:53","guid":{"rendered":"https:\/\/blog.webie.my.id\/?p=26"},"modified":"2026-02-10T09:01:30","modified_gmt":"2026-02-10T02:01:30","slug":"proyek-robotik-4-timer-countdown","status":"publish","type":"post","link":"https:\/\/blog.webie.my.id\/?p=26","title":{"rendered":"Proyek Robotik #4: Timer\/ Countdown"},"content":{"rendered":"\n<p>Proyek ini merupakan timer otomatis yang menggunakan ESP32 dan modul 4 digit display TM1637. Timer ini dapat menghitung mundur dari 5 menit atau 2 menit, yang bisa dipilih menggunakan tombol reset. Tombol lainnya digunakan untuk memulai (start) atau menghentikan (pause) hitungan waktu. Ketika waktu mencapai 0, buzzer akan menyala sebagai penanda waktu habis dan akan terus menyala hingga tombol reset ditekan.<\/p>\n\n\n\n<p><strong>Cara Kerja:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Saat ESP32 menyala, display akan menampilkan waktu default (5 menit = 300 detik).<\/li>\n\n\n\n<li>Tombol Start\/Pause (GPIO 12) digunakan untuk memulai atau menghentikan sementara countdown.<\/li>\n\n\n\n<li>Tombol Reset\/Ganti Waktu (GPIO 14) berfungsi untuk:<\/li>\n\n\n\n<li>Menghentikan timer dan buzzer.<\/li>\n\n\n\n<li>Mengganti antara waktu 5 menit dan 2 menit.<\/li>\n\n\n\n<li>Menampilkan waktu yang dipilih di display.<\/li>\n\n\n\n<li>Buzzer (GPIO 15) akan menyala ketika waktu sudah habis (00:00) dan akan tetap menyala hingga tombol reset ditekan.<\/li>\n\n\n\n<li>Waktu countdown ditampilkan dalam format MM:SS di modul TM1637 4 Digit Display.<\/li>\n<\/ol>\n\n\n\n<p><strong>Komponen yang Digunakan:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>1 \u00d7 ESP32<\/li>\n\n\n\n<li>1 x Modul TM1637 4 Digit Display<\/li>\n\n\n\n<li>2 x Push Button<\/li>\n\n\n\n<li>1 x Buzzer (aktif)<\/li>\n\n\n\n<li>1 x Breadboard<\/li>\n\n\n\n<li>Kabel jumper<\/li>\n\n\n\n<li>1 x Kabel USB (untuk upload dan power)<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"763\" height=\"414\" src=\"https:\/\/blog.webie.my.id\/wp-content\/uploads\/2026\/02\/image-3.png\" alt=\"\" class=\"wp-image-27\" srcset=\"https:\/\/blog.webie.my.id\/wp-content\/uploads\/2026\/02\/image-3.png 763w, https:\/\/blog.webie.my.id\/wp-content\/uploads\/2026\/02\/image-3-300x163.png 300w\" sizes=\"auto, (max-width: 763px) 100vw, 763px\" \/><\/figure>\n\n\n\n<p><strong>Kode:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;TM1637Display.h> \/\/ Library untuk TM1637\n\n#define CLK 4  \/\/ Pin CLK TM1637\n#define DIO 5  \/\/ Pin DIO TM1637\n\nTM1637Display display(CLK, DIO); \/\/ Inisialisasi TM1637\n\nunsigned long previousMillis = 0;\nconst long interval = 1000; \/\/ 1 detik\nint countdownTime = 300; \/\/ Waktu countdown awal (5 menit)\nbool isRunning = false; \/\/ Status apakah timer sedang berjalan\nbool lastButtonState = HIGH; \/\/ Status terakhir tombol Start\/Pause\nbool currentButtonState = HIGH;\nbool timeOption = true; \/\/ true = 5 menit, false = 2 menit\nbool timeFinished = false; \/\/ Status apakah timer sudah mencapai 0\n\nconst int startPauseButton = 12; \/\/ Tombol untuk Start\/Pause\nconst int resetButton = 14; \/\/ Tombol reset (juga digunakan untuk ganti waktu)\nconst int buzzer = 15; \/\/ Pin untuk buzzer\n\nvoid setup() {\n  display.setBrightness(0x0f); \/\/ Set kecerahan display maksimal\n  pinMode(startPauseButton, INPUT_PULLUP);\n  pinMode(resetButton, INPUT_PULLUP);\n  pinMode(buzzer, OUTPUT);\n\n  display.showNumberDecEx(0, 0b01000000, true); \/\/ Tampilkan 00:00 awal\n  delay(1000);\n  showTime(countdownTime); \/\/ Tampilkan waktu awal 5 menit\n}\n\nvoid loop() {\n  currentButtonState = digitalRead(startPauseButton);\n\n  \/\/ Jika tombol Start\/Pause ditekan (LOW) dan status tombol sebelumnya HIGH, maka toggling antara start\/pause\n  if (currentButtonState == LOW &amp;&amp; lastButtonState == HIGH &amp;&amp; !timeFinished) {\n    isRunning = !isRunning; \/\/ Toggle status isRunning\n    delay(200); \/\/ Debounce delay\n  }\n  lastButtonState = currentButtonState; \/\/ Simpan status tombol terakhir\n\n  \/\/ Reset button handling\n  if (digitalRead(resetButton) == LOW) {\n    isRunning = false; \/\/ Hentikan timer\n    digitalWrite(buzzer, LOW); \/\/ Matikan buzzer jika aktif\n    timeFinished = false; \/\/ Reset status waktu selesai\n    timeOption = !timeOption; \/\/ Toggle antara 5 menit dan 2 menit\n    countdownTime = timeOption ? 300 : 120; \/\/ Set waktu: 5 menit = 300 detik, 2 menit = 120 detik\n    showTime(countdownTime); \/\/ Tampilkan waktu yang dipilih\n    delay(500); \/\/ Debounce delay yang lebih panjang untuk menghindari double input\n  }\n\n  \/\/ Timer countdown handling\n  if (isRunning &amp;&amp; countdownTime > 0) {\n    unsigned long currentMillis = millis();\n    if (currentMillis - previousMillis >= interval) {\n      previousMillis = currentMillis;\n      countdownTime--;\n      showTime(countdownTime);\n    }\n  }\n\n  \/\/ Saat countdown selesai\n  if (countdownTime == 0 &amp;&amp; !timeFinished) {\n    digitalWrite(buzzer, HIGH); \/\/ Aktifkan buzzer\n    timeFinished = true; \/\/ Tandai bahwa waktu selesai\n    isRunning = false; \/\/ Hentikan timer\n  }\n}\n\n\/\/ Fungsi untuk menampilkan waktu dalam format MM:SS\nvoid showTime(int seconds) {\n  int minutes = seconds \/ 60;\n  int secs = seconds % 60;\n\n  \/\/ Gabungkan menit dan detik ke dalam format XX:YY\n  int displayTime = (minutes * 100) + secs;\n  display.showNumberDecEx(displayTime, 0b01000000, true); \/\/ Tampilkan dalam format MM:SS\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Proyek ini merupakan timer otomatis yang menggunakan ESP32 dan modul 4 digit display TM1637. Timer ini dapat menghitung mundur dari 5 menit atau 2 menit, yang bisa dipilih menggunakan tombol reset. Tombol lainnya digunakan untuk memulai (start) atau menghentikan (pause) hitungan waktu. Ketika waktu mencapai 0, buzzer akan menyala sebagai penanda waktu habis dan akan&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[5,3],"tags":[],"class_list":["post-26","post","type-post","status-publish","format-standard","hentry","category-esp32","category-robotik"],"_links":{"self":[{"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/posts\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=26"}],"version-history":[{"count":1,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/posts\/26\/revisions"}],"predecessor-version":[{"id":28,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/posts\/26\/revisions\/28"}],"wp:attachment":[{"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}