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:
#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(F("https://www.project.semesin.com")); 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); } }