Cerdas cermat adalah pertandingan yang mengandalkan kecerdasan serta kecepatan. Untuk memberikan keadilan bagi seluruh group peserta, maka perangkat pendukung harus memiliki kriteria berikut :
- waktu scanning
metode yang sering digunakan adalah interupsi dan scanning tombol, dalam hal penggunaan arduino uno (yang memiliki 2 external interrupt dan 23 pin change interrupt) masing-masing memiliki kelemahan dan kelebihan :- metode interruptpenggunaan external interrupt adalah metode yang paling baik, namun arduino uno hanya memiliki 2 external interrupt (hanya untuk 2 group) sehingga kurang efektif. Jika menggunakan 23 jalur external interrupt lebih banyak akan tetapi jenis interupsi ini di arduino uno terpisah dalam 3 kelompok, sehingga, seandainya 2 group cerdas cermat dalam satu kelompok interupsi menekan tombol (dalam waktu scanning-nya) naka harus diambil salah satu group cerdas cermat saja, dan masalahnya pengambilan keputusan ini akan menjadi masalah keadilan bagi peserta.
- metode scanning tombol
metode ini bisa diistilahkan ‘tombol yang tepat di waktu yang tepat’ karena jika tombol cerdas cermat ditekan bersamaan, maka yang akan terpilih adalah tombol yang sedang di scanning. Namun sebetulnya waktu scanning ini sangatlah cepat, dan letak keadilannya ditentukan oleh ‘waktu’
- interlock tombol
- Ketika group yang paling cepat di sahkan, maka tombol group lain tidak berfungsi.
- seluruh tombol group cerdas cermat hanya bisa di tekan pada saat yang ditentukan (misalkan setelah pertanyaan selesai dibacakan) jika mendahului waktu tersebut, maka tombolnya tidak berfungsi (diskualifikasi sesi pertanyaan) dengan cara menahan [tombol reset] dan melepas-nya ketika pertanyaan selesai di bacakan
blok diagram cerdas cermat menggunakan arduino:
skema mesin cerdas cermat berbasis arduino:
koding bel cerdas cermat berbasis arduino:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #define pinGroup1 2 #define pinGroup2 3 #define pinGroup3 4 #define pinGroup4 5 #define pinGroup1Indikator A0 #define pinGroup2Indikator A1 #define pinGroup3Indikator A2 #define pinGroup4Indikator A3 #define pinReset 8 #define pinBel 9 #define relayAktif LOW #define jumlahGroup 4 #define waktuBel 3000 byte pinGroup[jumlahGroup] = {pinGroup1, pinGroup2, pinGroup3, pinGroup4}; byte pinGroupIndikator[jumlahGroup] = {pinGroup1Indikator, pinGroup2Indikator, pinGroup3Indikator, pinGroup4Indikator}; byte groupAktif; byte groupScan; byte tombolAktif; long millisBel; bool statusTombol; bool statusSesi; bool sesi[jumlahGroup]; // the setup routine runs once when you press reset: void setup() { Serial.begin(9600); Serial.println(F( "Tombol cerdas cermat berbasis arduino" )); Serial.println(); for ( int i = 0; i < sizeof (pinGroup); i++) { pinMode(pinGroup[i], INPUT_PULLUP); pinMode(pinGroupIndikator[i], OUTPUT); } pinMode(pinReset, INPUT_PULLUP); digitalWrite(pinBel, !relayAktif); pinMode(pinBel, OUTPUT); memset (sesi, 1, 4); } // the loop routine runs over and over again forever: void loop() { groupScan = (groupScan + 1) % jumlahGroup; if (!digitalRead(pinGroup[groupScan])) { if (tombolAktif) { if (sesi[groupScan]) { groupAktif = groupScan + 1; statusTombol = true ; statusSesi = true ; } } else if (!statusSesi) { if (sesi[groupScan]) { sesi[groupScan] = false ; Serial.print( "Diskualifikasi : " ); Serial.println(groupScan + 1); } } } if (!digitalRead(pinReset)) { delay(50); if (!digitalRead(pinReset)) { tombolAktif = false ; if (groupAktif) { digitalWrite(pinGroupIndikator[groupAktif - 1], LOW); digitalWrite(pinBel, !relayAktif); groupAktif = 0; Serial.println( "Reset" ); statusSesi = false ; memset (sesi, 1, 4); } } } else if (groupAktif) { if (statusTombol) { Serial.print( "Group : " ); Serial.println(groupAktif); millisBel = millis() + waktuBel; digitalWrite(pinBel, relayAktif); digitalWrite(pinGroupIndikator[groupScan], HIGH); statusTombol = false ; tombolAktif = false ; } } else if (!tombolAktif) { Serial.println( "Sesi mulai" ); tombolAktif = true ; } if (millisBel < millis()) { digitalWrite(pinBel, !relayAktif); } } |
Assalamualaikum bang, itu tombolnya cukup pakai C sebesar 100nf aja ya?
gk di pull up pakai resistor ke kutub positif?
pullup resistor sudah ada di dalam chip arduino dan diaktifkan dengan
pinMode(pin, INPUT_PULLUP);
adapun penggunaan capasitor disini sebagai anti bounce, karena dibutuhkan loop pendeteksian yang singkat.
Assalamu’alaikum, mau nanya.
Kalo ingin buat hanya 2 group apakah group 3 dan 4 nya dihapus saja di bagian coding? Atau dibiarkan saja?
boleh dibiarkan saja
Kalo di buat buzzernya jadi 4, boleh nggak di hubungkan paralel/seri pada tombol / saklarnya. Atau ada tambahan perintah pada program?
buzzer bisa saja diseri dengan saklar pada rangkaian ini tapi power-nya kecil.