#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#define CLK 15
#define DT 16
#define SW 17
Servo servo;
LiquidCrystal_I2C lcd(0x27,20,4); // Wiring: SDA pin is connected to A4 and SCL pin to A5.
int angle = 90;
int SSpeed = 30;
int Timer_Vale = 0;
int Alin = A0;
bool Prev_State;
bool Servo_Stop;
bool Start_Flag = false;
int counter_1 = 0;
int counter = 0;
int Buzzer = 13;
int Dig_1;
int Dig_2;
int Dig_3;
int Dig_11;
int Dig_21;
int Dig_31;
int Dig_12;
int Dig_22;
int Dig_32;
int currentStateCLK;
int lastStateCLK;
int btnState;
bool Last_Start_Timer = false;
bool Start_Timer;
bool FWD_Flag;
bool REV_Flag = true;
unsigned long startMillis; //some global variables available anywhere in the program
unsigned long currentMillis;
bool lastButtonPress = false;
const unsigned long period = 1000;
String currentDir ="";
void setup() {
// put your setup code here, to run once:
lcd.init();
lcd.setCursor(0, 0);
lcd.backlight();
lcd.print("Timer:");
lcd.setCursor(0,1);
lcd.print("Speed:");
Serial.begin(9600);
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW, INPUT);
digitalWrite(SW, HIGH);
pinMode(Buzzer, OUTPUT);
servo.attach(5);
servo.write(angle);
delay(2000);
lastStateCLK = digitalRead(CLK);
startMillis = millis();
}
void loop()
{
// put your main code here, to run repeatedly:
currentMillis = millis();
if ((currentMillis - startMillis) >= period)
{
if (Start_Timer == true)
{
counter_1 ++;
Serial.println(counter_1);
Dig_12 = counter_1/100;;
Dig_22 = ((counter_1 - (Dig_12*100))/10);
Dig_32 = (counter_1 - (Dig_12*100)-(Dig_22*10));
if (counter_1 >= 60)
{
Timer_Vale --;
counter_1 = 0;
if (Timer_Vale <=0)
{
Timer_Vale = 0;
Start_Timer = false;
digitalWrite(Buzzer, HIGH);
delay(2000);
digitalWrite(Buzzer, LOW);
}
}
}
startMillis = currentMillis;
}
SSpeed = analogRead(Alin);
SSpeed = map(SSpeed, 0,1024, 30, 10);
currentStateCLK = digitalRead(CLK);
// If last and current state of CLK are different, then pulse occurred
// React to only 1 state change to avoid double count
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
// If the DT state is different than the CLK state then
// the encoder is rotating CCW so decrement
if (digitalRead(DT) != currentStateCLK) {
Timer_Vale --;
} else {
// Encoder is rotating CW so increment
Timer_Vale ++;
}
}
// Remember last CLK state
lastStateCLK = currentStateCLK;
Dig_1 = Timer_Vale/100;;
Dig_2 = ((Timer_Vale - (Dig_1*100))/10);
Dig_3 = (Timer_Vale - (Dig_1*100)-(Dig_2*10));
Dig_11 = SSpeed/100;;
Dig_21 = ((SSpeed - (Dig_11*100))/10);
Dig_31 = (SSpeed - (Dig_11*100)-(Dig_21*10));
lcd.setCursor(7,0);
lcd.print(Dig_1);
lcd.print(Dig_2);
lcd.print(Dig_3);
lcd.print(":");
lcd.setCursor(11,0);
lcd.print(Dig_22);
lcd.print(Dig_32);
lcd.setCursor(13,1);
lcd.print(Dig_11);
lcd.print(Dig_21);
lcd.print(Dig_31);
btnState = digitalRead(SW);
if (btnState != lastButtonPress)
{
if (btnState== LOW && Start_Timer != true && Timer_Vale >0)
{
Start_Timer = true;
Serial.println(" Start Flage = True");
}
else
{
if (btnState== LOW && Start_Timer == true )
{
Start_Timer = false;
Serial.println(" Start Flage = False");
}
delay(100);
}
lastButtonPress = btnState;
}
if (angle <= 5 )
{
FWD_Flag = true;
REV_Flag = false;
}
if (angle >= 179 )
{
REV_Flag = true;
FWD_Flag = false;
}
if (Start_Timer == true && FWD_Flag)
{
angle ++;
servo.write(angle);
delay(SSpeed);
}
if (Start_Timer == true && REV_Flag)
{
angle --;
servo.write(angle);
delay(SSpeed);
}
}