{"id":48,"date":"2026-02-09T13:20:06","date_gmt":"2026-02-09T06:20:06","guid":{"rendered":"https:\/\/blog.webie.my.id\/?p=48"},"modified":"2026-02-10T09:01:02","modified_gmt":"2026-02-10T02:01:02","slug":"proyek-robotik-11-game-adu-cepat","status":"publish","type":"post","link":"https:\/\/blog.webie.my.id\/?p=48","title":{"rendered":"Proyek Robotik #11: Game Adu Cepat"},"content":{"rendered":"\n<p>Proyek ini adalah sebuah kuis cepat (real-time quiz) yang dijalankan melalui web server lokal di ESP32. ESP32 akan menjadi Access Point (Hotspot WiFi) dan menyajikan halaman web ke perangkat (HP\/ laptop) tanpa membutuhkan internet. Permainan memilih satu pertanyaan acak dan menampilkan form untuk menjawab. Peserta pertama yang menjawab dengan benar akan menjadi pemenang, dan waktu yang dibutuhkan akan ditampilkan.<\/p>\n\n\n\n<p><strong>Cara Kerja:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>ESP32 membuat jaringan WiFi dengan nama Game-Cepat dan password 12345678.<\/li>\n\n\n\n<li>Setelah startup dan delay 5 detik, game dimulai secara otomatis dengan pertanyaan acak.<\/li>\n\n\n\n<li>Pengguna menghubungkan perangkat ke WiFi ESP32 dan membuka browser ke IP (biasanya 192.168.4.1).<\/li>\n\n\n\n<li>Halaman akan menampilkan satu soal kuis dan kolom untuk memasukkan jawaban.<\/li>\n\n\n\n<li>Setelah menekan tombol &#8220;Jawab&#8221;, pengguna diminta untuk memasukkan nama.<\/li>\n\n\n\n<li>Jika jawabannya benar dan belum ada pemenang:\n<ul class=\"wp-block-list\">\n<li>Nama pengguna ditampilkan sebagai pemenang<\/li>\n\n\n\n<li>Waktu yang dibutuhkan untuk menjawab ditampilkan (dalam ms)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Jika jawaban salah atau sudah ada pemenang, akan ditampilkan pesan kesalahan.<\/li>\n\n\n\n<li>Server tetap aktif dan dapat menerima jawaban baru jika game di-reset secara manual (fitur tambahan bisa ditambahkan untuk reset).<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"358\" height=\"791\" src=\"https:\/\/blog.webie.my.id\/wp-content\/uploads\/2026\/02\/image-9.png\" alt=\"\" class=\"wp-image-49\" srcset=\"https:\/\/blog.webie.my.id\/wp-content\/uploads\/2026\/02\/image-9.png 358w, https:\/\/blog.webie.my.id\/wp-content\/uploads\/2026\/02\/image-9-136x300.png 136w\" sizes=\"auto, (max-width: 358px) 100vw, 358px\" \/><\/figure>\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 Kabel USB (untuk upload dan power)<\/li>\n\n\n\n<li>1 x Smartphone atau Laptop (untuk bermain game)<\/li>\n<\/ul>\n\n\n\n<p><strong>Fitur Tambahan yang Bisa Dikembangkan:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tombol untuk reset game manual di halaman web<\/li>\n\n\n\n<li>Menampilkan daftar skor pemenang sebelumnya<\/li>\n\n\n\n<li>Membatasi waktu menjawab (dengan countdown)<\/li>\n\n\n\n<li>Audio feedback untuk jawaban benar\/salah<\/li>\n\n\n\n<li>Menambahkan timer dan animasi responsif<\/li>\n<\/ul>\n\n\n\n<p><strong>Kode:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;WiFi.h>\n#include &lt;WebServer.h>\n\nconst char* ssid = \"Game-Speed\";       \nconst char* password = \"12345678\"; \n\nWebServer server(80);\n\nbool gameDimulai = false;\nString pemenang = \"\";\nunsigned long waktuMulai = 0;\nunsigned long waktuMenang = 0;\n\nstruct Pertanyaan {\n    String soal;\n    String jawaban;\n};\n\nPertanyaan daftarPertanyaan&#91;] = {\n    {\"5 + 3 = ?\", \"8\"},\n    {\"Ibukota Indonesia?\", \"Jakarta\"},\n    {\"Warna bendera Indonesia?\", \"Merah Putih\"},\n    {\"7 x 6 = ?\", \"42\"},\n    {\"Bahasa pemrograman untuk ESP32?\", \"C++\"},\n    {\"9 x 8 = ?\", \"72\"},\n    {\"Ibukota Australia?\", \"Canberra\"}\n};\nint totalPertanyaan = sizeof(daftarPertanyaan) \/ sizeof(daftarPertanyaan&#91;0]);\nint pertanyaanSaatIni = -1;\n\nvoid mulaiGame() {\n    gameDimulai = true;\n    pemenang = \"\";\n    waktuMulai = millis();\n    pertanyaanSaatIni = random(0, totalPertanyaan); \/\/ Pilih pertanyaan acak\n}\n\nvoid handleRoot() {\n    String html = \"&lt;html>&lt;head>&lt;title>Quiz Cepat!&lt;\/title>&lt;\/head>&lt;body>\";\n    html += \"&lt;h2>Game Quiz Cepat!&lt;\/h2>\";\n\n    if (!gameDimulai) {\n        html += \"&lt;p style='color:red;'>Game belum dimulai!&lt;\/p>\";\n    } else {\n        html += \"&lt;h3 style='color:blue;'>\" + daftarPertanyaan&#91;pertanyaanSaatIni].soal + \"&lt;\/h3>\";\n    }\n\n    html += \"&lt;input type='text' id='jawaban' placeholder='Masukkan jawaban'>\";\n    html += \"&lt;button onclick='jawab()' style='font-size: 20px;'>Jawab!&lt;\/button>\";\n    html += \"&lt;h3 id='hasil'>&lt;\/h3>\";\n\n    if (pemenang != \"\") {\n        html += \"&lt;h3 style='color:green;'>Pemenang: \" + pemenang + \"&lt;\/h3>\";\n    }\n\n    html += \"&lt;script>\";\n    html += \"function jawab() {\";\n    html += \"  let nama = prompt('Masukkan nama Anda');\";\n    html += \"  let jawaban = document.getElementById('jawaban').value;\";\n    html += \"  fetch('\/jawab?nama=' + nama + '&amp;jawaban=' + jawaban).then(res => res.text()).then(data => {\";\n    html += \"    document.getElementById('hasil').innerHTML = data;\";\n    html += \"  });\";\n    html += \"}\";\n    html += \"&lt;\/script>\";\n\n    html += \"&lt;\/body>&lt;\/html>\";\n\n    server.send(200, \"text\/html\", html);\n}\n\nvoid handleJawab() {\n    if (!server.hasArg(\"nama\") || !server.hasArg(\"jawaban\") || !gameDimulai) {\n        server.send(400, \"text\/plain\", \"Game belum dimulai atau data tidak valid.\");\n        return;\n    }\n\n    String nama = server.arg(\"nama\");\n    String jawaban = server.arg(\"jawaban\");\n\n    if (pemenang == \"\" &amp;&amp; jawaban == daftarPertanyaan&#91;pertanyaanSaatIni].jawaban) {\n        pemenang = nama;\n        waktuMenang = millis() - waktuMulai;\n        gameDimulai = false;\n        server.send(200, \"text\/html\", \"&lt;h3 style='color:green;'>Selamat \" + pemenang + \"! Anda menang dalam \" + String(waktuMenang) + \" ms.&lt;\/h3>\");\n    } else {\n        server.send(200, \"text\/html\", \"&lt;h3 style='color:red;'>Jawaban salah atau sudah ada pemenang!&lt;\/h3>\");\n    }\n}\n\nvoid setup() {\n    Serial.begin(115200);\n\n    WiFi.softAP(ssid, password);\n    IPAddress IP = WiFi.softAPIP();\n    Serial.print(\"Game tersedia di: \");\n    Serial.println(IP);\n\n    server.on(\"\/\", handleRoot);\n    server.on(\"\/jawab\", handleJawab);\n    server.begin();\n    Serial.println(\"Server dimulai!\");\n\n    \/\/ Mulai game setelah 5 detik\n    delay(5000);\n    mulaiGame();\n}\n\nvoid loop() {\n    server.handleClient();\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Proyek ini adalah sebuah kuis cepat (real-time quiz) yang dijalankan melalui web server lokal di ESP32. ESP32 akan menjadi Access Point (Hotspot WiFi) dan menyajikan halaman web ke perangkat (HP\/ laptop) tanpa membutuhkan internet. Permainan memilih satu pertanyaan acak dan menampilkan form untuk menjawab. Peserta pertama yang menjawab dengan benar akan menjadi pemenang, dan waktu&#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-48","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\/48","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=48"}],"version-history":[{"count":1,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/posts\/48\/revisions"}],"predecessor-version":[{"id":50,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=\/wp\/v2\/posts\/48\/revisions\/50"}],"wp:attachment":[{"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=48"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=48"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.webie.my.id\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=48"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}