#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.semesin.com/project"));
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);
}
}