#define bt_start A0 //Tombol HIJAU
#define bt_stage A1 //Finish, bukan tombol MERAH
#define bt_load A2 //Tombol Load Nilai KUNING
#define bt_error A4 //bukan tombol BIRU
#define G_led 8
#define R_led 9
#define buzzer A3
int hh = 0, mm = 0, ss = 0, ms = 0, statStage1, statStage2, berhasil;
bool timerStart = false;
const byte LDR_PIN = A4; // LDR Sensor pin
//----------------------------
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <EEPROM.h>
#include <SPI.h>
char bufferRead[10];
String output, load;
// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
//#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 8
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 3
// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary output pins
// MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
void setup(void) {
P.begin();
pinMode(LDR_PIN, INPUT_PULLUP);
Serial.begin(9600);
//Setting Stopwatch
pinMode(bt_start, INPUT_PULLUP);
pinMode(bt_stage, INPUT_PULLUP);
pinMode(bt_error, INPUT_PULLUP);
pinMode(bt_load, INPUT_PULLUP);
pinMode(R_led, OUTPUT); // declare Red LED as output
pinMode(G_led, OUTPUT); // declare Green LED as output
pinMode(buzzer, OUTPUT); // declare Buzzer as output
noInterrupts(); // disable all interrupts
TCCR1A = 0; // set entire TCCR1A register to 0 //set timer1 interrupt at 1kHz // 1 ms
TCCR1B = 0; // same for TCCR1B
TCNT1 = 0; // set timer count for 1khz increments
OCR1A = 1999; // = (16*10^6) / (1000*8) - 1
//had to use 16 bit timer1 for this bc 1999>255, but could switch to timers 0 or 2 with larger prescaler
// turn on CTC mode
TCCR1B |= (1 << WGM12); // Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11); // enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
interrupts();
//-----------------------------
}
void loop(void) {
//atur cahaya dot matrix
//byte ledIntensity = ledIntensitySelect(analogRead(LDR_PIN));
P.setIntensity(10); // value between 0 and 15 for brightness
//cek_tombol
if (digitalRead(bt_start) == 0) {
P.print("Stage 1");
delay(1000);
buzzerStart();
statStage1 = 1;
timerStart = true; // Start stopwatch
delay(100);
}
//Stage 1 dan Error
if (digitalRead(bt_error) == 0 && statStage1 == 1) {
saveEEPROM();
timerStart = false; // Stop stopwatch
output = loadEEPROM();
P.print(output);
//buzzerStop();
P.print("Coba Lagi :(");
berhasil = 0;
delay(6000);
statStage1 = 0;
ms = 0, ss = 0, mm = 0, hh = 0; // Reset stopwatch
}
//Stage 1 dan finish
if (digitalRead(bt_stage) == 0 && statStage1 == 1) {
saveEEPROM();
timerStart = false; // Stop stopwatch
output = loadEEPROM();
P.print(output);
// buzzerStop();
P.print("Ke Stage 2");
delay(3000);
P.print("1");
delay(1000);
P.print("2");
delay(1000);
P.print("3 Mulai!!!!!!");
berhasil = 1;
delay(1000);
statStage1 = 0;
statStage2 = 1;
}
//Stage 2
if (statStage2 == 1) {
output = loadEEPROM();
timerStart = true;
}
//Stage 2 dan Error
if (digitalRead(bt_error) == 0 && statStage2 == 1) {
saveEEPROM();
timerStart = false; // Stop stopwatch
output = loadEEPROM();
P.print(output);
//buzzerStop();
P.print("Coba Lagi :(");
berhasil = 0;
delay(4000);
statStage2 = 0;
ms = 0, ss = 0, mm = 0, hh = 0; // Reset stopwatch
}
//Stage 2 dan Finish
if (digitalRead(bt_stage) == 0 && statStage2 == 1) {
saveEEPROM();
timerStart = false;
P.print("Hebaat!");
berhasil = 2;
delay(6000);
statStage2 = 0;
output = loadEEPROM();
P.print(output);
delay(1000);
P.print("");
delay(1000);
P.print(output);
delay(1000);
P.print("");
delay(1000);
P.print(output);
delay(1000);
P.print("");
delay(1000);
P.print(output);
delay(5000);
ms = 0, ss = 0, mm = 0, hh = 0; // Reset stopwatch
buzzerStop();
}
//---------------------
//out ke dot matrix
output = outputStrClock();
P.print(output);
if (statStage1 == 0 && statStage2 == 0) {
P.print("Yuk Mainkan!!!");
int n = 0;
while (n < 2000) {
n++;
delay(1);
if (digitalRead(bt_start) == 0) {
statStage1 = 1;
n=2020;
}
dataAkhir();
}
P.print("Gratis...");
n = 0;
while (n < 2000) {
n++;
delay(1);
if (digitalRead(bt_start) == 0) {
statStage1 = 1;
n = 2020;
}
dataAkhir();
}
}
//Status LED
if (timerStart == true) {
digitalWrite(G_led, HIGH); // Turn LED on.
digitalWrite(R_led, LOW); // Turn LED off.
} else {
digitalWrite(G_led, LOW); // Turn LED off.
digitalWrite(R_led, HIGH); // Turn LED on.
}
digitalWrite(buzzer, LOW);
}
String outputStrClock() {
String _output;
_output = (hh / 10) % 10;
_output.concat(hh % 10);
_output.concat(":");
_output.concat((mm / 10) % 10);
_output.concat(mm % 10);
_output.concat(":");
_output.concat((ss / 10) % 10);
_output.concat(ss % 10);
_output.concat(":");
_output.concat((ms / 100) % 10);
_output.concat((ms / 10) % 10);
_output.concat(ms % 10);
return _output;
}
void saveEEPROM() {
EEPROM.put(0, (hh / 10) % 10);
EEPROM.put(1, hh % 10);
EEPROM.put(3, (mm / 10) % 10);
EEPROM.put(4, mm % 10);
EEPROM.put(6, (ss / 10) % 10);
EEPROM.put(7, ss % 10);
EEPROM.put(9, (ms / 100) % 10);
EEPROM.put(10, (ms / 10) % 10);
EEPROM.put(11, ms % 10);
}
String loadEEPROM() {
String _load;
_load = EEPROM.read(0);
_load.concat(EEPROM.read(1));
_load.concat(":");
_load.concat(EEPROM.read(3));
_load.concat(EEPROM.read(4));
_load.concat(":");
_load.concat(EEPROM.read(6));
_load.concat(EEPROM.read(7));
_load.concat(":");
_load.concat(EEPROM.read(9));
_load.concat(EEPROM.read(10));
_load.concat(EEPROM.read(11));
return _load;
}
void buzzerStart() {
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
delay(1000);
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
delay(1000);
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
}
void buzzerStop() {
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
delay(200);
delay(10000);
}
void buzzerLoad() {
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
digitalWrite(buzzer, HIGH);
delay(100);
digitalWrite(buzzer, LOW);
delay(100);
delay(5000);
}
byte ledIntensitySelect(int light) {
byte _value = 0;
if (light >= 0 && light <= 127) {
_value = 15;
} else if (light >= 128 && light <= 319) {
_value = 10;
} else if (light >= 320 && light <= 512) {
_value = 5;
}
return _value;
};
ISR(TIMER1_COMPA_vect) {
if (timerStart == true) {
ms = ms + 1;
if (ms > 999) {
ms = 0;
ss = ss + 1;
if (ss > 59) {
ss = 0;
mm = mm + 1;
}
if (mm > 59) {
mm = 0;
hh = hh + 1;
}
}
}
}
void dataAkhir() {
if (digitalRead(bt_load) == 0 && statStage1 == 0 && statStage2 == 0) {
output = loadEEPROM();
if(berhasil == 2){
P.print("Catatan Akhir");
delay(3000);
P.print(output);
delay(3000);
}
}
}