#include <Arduino.h>
#include <TM1637Display.h>
//---------------------------------------------------------------------------------//
//-----------------------------Defining variables---------------------------------//
//--------------------------------------------------------------------------------//
#define CLKenc 2 // Output A of Encoder //
#define DTenc 3 // Output B of encoder //
#define SWenc 9 //Switch of encoder //
#define CLKWhite 11 //Clock pin for white//
#define DIOWhite 12 //Digital Input / Output for white //
#define CLKBlack 8 //Clock pin for black//
#define DIOBlack 7 //Digital Input / Output for Black //
#define BlackPlay 4
#define WhitePlay 5
int currentStateCLKenc;
int lastStateCLKenc;
unsigned long LastButtonPressEnc = 0;
String Direction="";
int btnPressCount=0;
int counter=1;
int Bullet_counter = 1;
int Blitz_counter = 1;
int Rapid_counter = 1;
int btnState=digitalRead(SWenc);
String Mode="";
bool btnPress = false;
int CustomPresses=0;
int WI_Time=0;
int WM_Time=0;
int BI_Time=0;
int BM_Time=0;
int CustomWM=1;
int CustomWI=0;
int CustomBM=1;
int CustomBI=0;
int BulletPresses=0;
int BlitzPresses=0;
int RapidPresses=0;
String SubMode="";
int WhiteMinutes=0;
int WhiteIncrement=0;
int BlackMinutes=0;
int BlackIncrement=0;
int Seconds=60;
String Turn="";
TM1637Display white(CLKWhite,DIOWhite);
TM1637Display black(CLKBlack,DIOBlack);
uint8_t blank[]={0x00,0x00,0x00,0x00};
uint8_t data[]={0xff,0xff,0xff,0xff};
uint8_t underscore[]={0x00,0x00,bit(3),0x00};
void setup(){
white.setBrightness(5);
black.setBrightness(5);
pinMode(CLKenc, INPUT);
pinMode(DTenc, INPUT);
pinMode(SWenc , INPUT_PULLUP);
pinMode(BlackPlay, INPUT_PULLUP);
pinMode(WhitePlay, INPUT_PULLUP);
Serial.begin(9600);
lastStateCLKenc=digitalRead(CLKenc);
attachInterrupt(digitalPinToInterrupt(CLKenc),updateEncoder,CHANGE);
attachInterrupt(digitalPinToInterrupt(DTenc),updateEncoder,CHANGE);
PCICR |= bit(PCIE0); //activating port B for interrupt//
PCMSK0 |= bit(PCINT1);//activating Pin 9 (where our switch encoder is connected)//
}
ISR (PCINT0_vect){
DetectBtnPress();
}
//---------------------------------------------------------------------------------//
//---------------------------displaying bullet and bullet modes -------------------//
//---------------------------------------------------------------------------------//
void Bullet_disp(){
white.showNumberDec(1,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Bullet1(){
white.setSegments(underscore);
white.showNumberDec(1,true,2,0);
white.showNumberDec(0,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Bullet2(){
white.setSegments(underscore);
white.showNumberDec(1,true,2,0);
white.showNumberDec(1,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Bullet3(){
white.setSegments(underscore);
white.showNumberDec(2,true,2,0);
white.showNumberDec(1,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
//---------------------------------------------------------------------------------//
//----------------------------displaying Blitz and Blitz modes---------------------//
//---------------------------------------------------------------------------------//
void Blitz_disp(){
white.showNumberDec(2,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Blitz1(){
white.setSegments(underscore);
white.showNumberDec(3,true,2,0);
white.showNumberDec(0,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Blitz2(){
white.setSegments(underscore);
white.showNumberDec(3,true,2,0);
white.showNumberDec(2,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Blitz3(){
white.setSegments(underscore);
white.showNumberDec(5,true,2,0);
white.showNumberDec(0,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Blitz4(){
white.setSegments(underscore);
white.showNumberDec(5,true,2,0);
white.showNumberDec(2,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
//---------------------------------------------------------------------------------//
//---------------------------displaying Rapid and Rapid modes ---------------------//
//---------------------------------------------------------------------------------//
void Rapid_disp(){
white.showNumberDec(3,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Rapid1(){
white.setSegments(underscore);
white.showNumberDec(10,true,2,0);
white.showNumberDec(0,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Rapid2(){
white.setSegments(underscore);
white.showNumberDec(10,true,2,0);
white.showNumberDec(5,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Rapid3(){
white.setSegments(underscore);
white.showNumberDec(15,true,2,0);
white.showNumberDec(5,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Rapid4(){
white.setSegments(underscore);
white.showNumberDec(30,true,2,0);
white.showNumberDec(0,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
void Rapid5(){
white.setSegments(underscore);
white.showNumberDec(60,true,2,0);
white.showNumberDec(0,false,1,3);
delay(300);
white.setSegments(blank);
delay(300);
}
//---------------------------------------------------------------------------------//
//-------------------------------displaying Custom Mode (c)----------------------- //
//---------------------------------------------------------------------------------//
void Custom_disp(){
int8_t disp_C[]= {0x00,0x00,0x00,SEG_A | SEG_F | SEG_E | SEG_D};
white.setSegments(disp_C) ;
delay(300);
white.setSegments(blank);
delay(300);
}
//---------------------------------------------------------------------------------//
//------------------------------- Encoder Functions ------------------------------ //
//---------------------------------------------------------------------------------//
void updateEncoder(){
currentStateCLKenc=digitalRead(CLKenc);
if (currentStateCLKenc != lastStateCLKenc && currentStateCLKenc ==1){
if(digitalRead(DTenc)!=currentStateCLKenc){
if(Mode==""){
counter++;
}
if(Mode=="Bullet"){
if(BulletPresses==1){
Bullet_counter++;
}
}
if(Mode=="Blitz"){
if(BlitzPresses==1){
Blitz_counter++;
}
}
if(Mode=="Rapid"){
if(RapidPresses==1){
Rapid_counter++;
}
}
if(Mode=="Custom"){
if(CustomPresses==1){
CustomWM++;
}
if(CustomPresses==2){
CustomWI++;
}
if(CustomPresses==3){
CustomBM++;
}
if(CustomPresses==4){
CustomBI++;
}
}
Direction="Clockwise";
Serial.println(Direction);
Serial.println(counter);
Serial.print("Mode is :");
Serial.println(Mode);
Serial.print("Bullet_counter is :");
Serial.println(Bullet_counter);
Serial.print("Blitz_counter is :");
Serial.println(Blitz_counter);
Serial.print("Rapid_counter is :");
Serial.println(Rapid_counter);
Serial.println("Custom Counters :");
Serial.println(CustomWM);
Serial.println(CustomWI);
Serial.println(CustomBM);
Serial.println(CustomBI);
}
else if(digitalRead(DTenc)==currentStateCLKenc){
if(Mode==""){
counter--;
}
if(Mode=="Bullet"){
Bullet_counter--;
}
if(Mode=="Blitz"){
Blitz_counter--;
}
if(Mode=="Rapid"){
Rapid_counter--;
}
if(Mode=="Custom"){
if(CustomPresses==1){
CustomWM--;
}
if(CustomPresses==2){
CustomWI--;
}
if(CustomPresses==3){
CustomBM--;
}
if(CustomPresses==4){
CustomBI--;
}
}
Direction="CounterClockwise";
Serial.println(Direction);
Serial.println(counter);
Serial.print("Mode is :");
Serial.println(Mode);
Serial.print("Bullet_counter is :");
Serial.println(Bullet_counter);
Serial.print("Blitz_counter is :");
Serial.println(Blitz_counter);
Serial.print("Rapid_counter is :");
Serial.println(Rapid_counter);
Serial.println("Custom Counters :");
Serial.println(CustomWM);
Serial.println(CustomWI);
Serial.println(CustomBM);
Serial.println(CustomBI);
}
}
lastStateCLKenc=currentStateCLKenc;
}
int DetectBtnPress(){
btnState = digitalRead(SWenc);
if (btnState == LOW){
if (millis()-LastButtonPressEnc>10){
Serial.println("Button Pressed !!");
if(abs(counter)%4==1){
BulletPresses++;
Mode="Bullet";
white.clear();
if(BulletPresses==2){
if(abs(Bullet_counter)%3==1){
SubMode="Bullet_1";
}
if(abs(Bullet_counter)%3==2){
SubMode="Bullet_2";
}
if(abs(Bullet_counter)%3==0){
SubMode="Bullet_3";
}
}
}
if(abs(counter)%4==2){
BlitzPresses++;
Mode="Blitz";
white.clear();
if(BlitzPresses==2){
if(abs(Blitz_counter)%4==1){
SubMode="Blitz_1";
}
if(abs(Blitz_counter)%4==2){
SubMode="Blitz_2";
}
if(abs(Blitz_counter)%4==3){
SubMode="Blitz_3";
}
if(abs(Blitz_counter)%4==0){
SubMode="Blitz_4";
}
}
}
if(abs(counter)%4==3){
RapidPresses++;
Mode="Rapid";
white.clear();
if(RapidPresses==2){
if(abs(Rapid_counter)%5==1){
SubMode="Rapid_1";
}
if(abs(Rapid_counter)%5==2){
SubMode="Rapid_2";
}
if(abs(Rapid_counter)%5==3){
SubMode="Rapid_3";
}
if(abs(Rapid_counter)%5==4){
SubMode="Rapid_4";
}
if(abs(Rapid_counter)%5==0){
SubMode="Rapid_5";
}
}
}
if(abs(counter)%4==0){
Mode="Custom";
CustomPresses++;
Serial.print("Custom is pressed : ");
Serial.println(CustomPresses);
}
Serial.println(Mode);
Serial.println(SubMode);
btnPress = true;
}
LastButtonPressEnc=millis();
}
}
//-----------------------------------------------------------------------------------//
//-----------------------------------Menu functions---------------------------------//
//----------------------------------------------------------------------------------//
void Display_Main(){
if (Mode==""){
if (abs(counter)%4==1){
Bullet_disp();
}
else if (abs(counter)%4==2){
Blitz_disp();
}
else if (abs(counter)%4==3){
Rapid_disp();
}
else if (abs(counter)%4==0){
Custom_disp();
}
}
}
void Display_Bullet_Menu(){
if(BulletPresses==1){
if(abs(Bullet_counter)%3==1){
Bullet1();
}
if(abs(Bullet_counter)%3==2){
Bullet2();
}
if(abs(Bullet_counter)%3==0){
Bullet3();
}
}
}
void Display_Blitz_Menu(){
if(BlitzPresses==1){
if(abs(Blitz_counter)%4==1){
Blitz1();
}
if(abs(Blitz_counter)%4==2){
Blitz2();
}
if(abs(Blitz_counter)%4==3){
Blitz3();
}
if(abs(Blitz_counter)%4==0){
Blitz4();
}
}
}
void Display_Rapid_Menu(){
if(RapidPresses==1){
if(abs(Rapid_counter)%5==1){
Rapid1();
}
if(abs(Rapid_counter)%5==2){
Rapid2();
}
if(abs(Rapid_counter)%5==3){
Rapid3();
}
if(abs(Rapid_counter)%5==4){
Rapid4();
}
if(abs(Rapid_counter)%5==0){
Rapid5();
}
}
}
void Display_Custom_Menu(){
if(CustomPresses==1){
WM_Time = CustomWM%69;
white.clear();
white.showNumberDecEx(WM_Time,0b11100000,true,2,0);
white.showNumberDec(00,true,2,2);
delay(300);
white.setSegments(blank);
delay(300);
}
if(CustomPresses==2){
WI_Time = CustomWI%30;
white.clear();
white.showNumberDec(WI_Time,true,2,2);
delay(300);
white.setSegments(blank);
delay(300);
}
if(CustomPresses==3){
BM_Time = CustomBM%69;
black.clear();
black.showNumberDecEx(BM_Time,0b11100000,true,2,0);
black.showNumberDec(00,true,2,2);
delay(300);
black.setSegments(blank);
delay(300);
}
if(CustomPresses==4){
BI_Time = CustomBI%69;
black.clear();
black.showNumberDec(BI_Time,true,2,2);
delay(300);
black.setSegments(blank);
delay(300);
}
}
//----------------------------------------------------------------------------------//
//-------------------------------------------Timer---------------------------------//
//----------------------------------------------------------------------------------//
void Timer(){
if(SubMode=="Bullet_1"){
WhiteMinutes=1;
WhiteIncrement=0;
BlackMinutes=1;
BlackIncrement=0;
}
if(SubMode=="Bullet_2"){
WhiteMinutes=1;
WhiteIncrement=1;
BlackMinutes=1;
BlackIncrement=1;
}
if(SubMode=="Bullet_3"){
WhiteMinutes=2;
WhiteIncrement=1;
BlackMinutes=2;
BlackIncrement=1;
}
if(SubMode=="Blitz_1"){
WhiteMinutes=3;
WhiteIncrement=0;
BlackMinutes=3;
BlackIncrement=0;
}
if(SubMode=="Blitz_2"){
WhiteMinutes=3;
WhiteIncrement=2;
BlackMinutes=3;
BlackIncrement=2;
}
if(SubMode=="Blitz_3"){
WhiteMinutes=5;
WhiteIncrement=0;
BlackMinutes=5;
BlackIncrement=0;
}
if(SubMode=="Blitz_4"){
WhiteMinutes=5;
WhiteIncrement=2;
BlackMinutes=5;
BlackIncrement=2;
}
if(SubMode=="Rapid_1"){
WhiteMinutes=10;
WhiteIncrement=0;
BlackMinutes=10;
BlackIncrement=0;
}
if(SubMode=="Rapid_2"){
WhiteMinutes=10;
WhiteIncrement=5;
BlackMinutes=10;
BlackIncrement=5;
}
if(SubMode=="Rapid_3"){
WhiteMinutes=15;
WhiteIncrement=5;
BlackMinutes=15;
BlackIncrement=5;
}
if(SubMode=="Rapid_4"){
WhiteMinutes=30;
WhiteIncrement=0;
BlackMinutes=30;
BlackIncrement=0;
}
if(SubMode=="Rapid_5"){
WhiteMinutes=60;
WhiteIncrement=0;
BlackMinutes=60;
BlackIncrement=0;
}
if(Mode=="Custom"){
if(CustomPresses==5){
WhiteMinutes=WM_Time;
WhiteIncrement=WI_Time;
BlackMinutes=BM_Time;
BlackIncrement=BI_Time;
}
}
while(true){
Serial.print("White :");
Serial.println(digitalRead(WhitePlay));
Serial.print("Black :");
Serial.println(digitalRead(BlackPlay));
if (digitalRead(BlackPlay)==LOW && digitalRead(WhitePlay)==HIGH ){
Turn="White";
Serial.println(Turn);
}
if (digitalRead(WhitePlay)==LOW && digitalRead(BlackPlay)==HIGH){
Turn="Black";
Serial.println(Turn);
}
Serial.println(Turn);
}
}
//-------------------------------------------------------------------------------//
//---------------------------------Main Loop-------------------------------------//
//-------------------------------------------------------------------------------//
void loop(){
Display_Main();
if(Mode=="Bullet"){
Display_Bullet_Menu();
}
if(Mode=="Blitz"){
Display_Blitz_Menu();
}
if(Mode=="Rapid"){
Display_Rapid_Menu();
}
if(Mode=="Custom"){
Display_Custom_Menu();
}
Timer();
}