/*
1.PENGEMBANGAN TIMER BOM, DENGAN BERBAGAI MODE
2. putar tuas encoder untuk set waktu dalam satuan detik
3. ketika encoder tidak di putar waktu defaut peledakan aktif dalam waktu 15 detik
4. ketika waktu di set 0 maka timer ini bertindak seperti ranjau darat, tertekan dan langsung meledak
5. lcd oled terhubung pada pin A5 ( SCL) dan A4 (SDA)
6, buzzer pada pin 11
7. encoder pada pin 2 dan 3
8. switch encoder pada pin 6
*/
#include "U8glib.h"
#include <Arduino.h>
#include <BasicEncoder.h>
const int ledPin = LED_BUILTIN; // the number of the LED pin
int ledState = LOW; // ledState used to set the LED
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 1000; // interval at which to blink (milliseconds)
int timer = 15;
const int8_t pinA = 2;
const int8_t pinB = 3;
const int8_t pinPB = 6;
BasicEncoder encoder(pinA, pinB);
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0); // I2C / TWI
void pciSetup(byte pin) // Setup pin change interupt on pin
{
*digitalPinToPCMSK(pin) |= bit(digitalPinToPCMSKbit(pin)); // enable pin
PCIFR |= bit(digitalPinToPCICRbit(pin)); // clear outstanding interrupt
PCICR |= bit(digitalPinToPCICRbit(pin)); // enable interrupt for group
}
void setup_encoders(int a, int b) {
uint8_t old_sreg = SREG; // save the current interrupt enable flag
noInterrupts();
pciSetup(a);
pciSetup(b);
encoder.reset();
SREG = old_sreg; // restore the previous interrupt enable flag state
}
ISR(PCINT2_vect) // pin change interrupt for D0 to D7
{
encoder.service();
}
void setup() {
Serial.begin(115200);
Serial.println("Interrupts");
setup_encoders(pinA,pinB);
encoder.set_reverse();
pinMode(11,OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(pinPB,INPUT_PULLUP);
}
bool lock = LOW;
bool pb = HIGH;
bool pbchange = HIGH;
bool mulaiTimer = LOW;
int salin;
bool tamp = LOW;
void loop() {
u8g.firstPage();
do {
pb = digitalRead(pinPB);
int encoder_change = encoder.get_change();
if (tamp == LOW) {
if(mulaiTimer == LOW){
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(10, 20);
u8g.print("SETTING WAKTU ");
salin = timer;
u8g.setPrintPos(55, 40);
u8g.print(salin);
}
if(mulaiTimer == HIGH){
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(0, 20);
u8g.print("BOM AKAN MELEDAK");
salin = timer;
u8g.setPrintPos(55, 40);
u8g.print(salin);
}
}
if(tamp == HIGH){
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(10, 40);
u8g.print("TARGET HANCUR");
}
if(pb != pbchange){
if(pb == LOW){
Serial.println("pb ditekan");
mulaiTimer = HIGH;
delay(1000);
pbchange = pb; }
}
if(mulaiTimer == LOW){
if (encoder_change) {
Serial.println(encoder.get_count());
timer = encoder.get_count();
}
}
if(mulaiTimer == HIGH){
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
Serial.println(timer);
timer--;
if(timer== -1){
tamp = HIGH;
timer = 0; tone(11, 500);
}
if( timer >= 1 && timer <= 15) tone(11, 500, 100);
}
}
}
while( u8g.nextPage() );
}