#include <LiquidCrystal_I2C.h>
#define leftBtnPin 13
#define rightBtnPin 8
#define centerBtnPin 12
#define hourPin 11
#define minPin 10
#define secPin 9
LiquidCrystal_I2C lcd(0x27, 16, 2);
int hours = 0;
int minutes = 0;
int seconds = 0;
int counterLeftButton = 0;
int hourSteps = -2;
int minuteSteps = -2;
int secondSteps = -2;
bool leftLastState = HIGH;
bool centerLastState = HIGH;
bool rightLastState = HIGH;
void setup() {
pinMode(leftBtnPin, INPUT_PULLUP);
pinMode(centerBtnPin, INPUT_PULLUP);
pinMode(rightBtnPin, INPUT_PULLUP);
pinMode(hourPin, OUTPUT);
pinMode(minPin, OUTPUT);
pinMode(secPin, OUTPUT);
// Serial.begin(115200);
lcd.init();
lcd.backlight();
setLcdTime(hours, minutes, seconds);
setMotorTime(hours, minutes, seconds);
}
void loop() {
// эти три блока - чтобы кнопочки работали дискретно
bool leftBtn = digitalRead(leftBtnPin);
bool centerBtn = digitalRead(centerBtnPin);
bool rightBtn = digitalRead(rightBtnPin);
bool leftPressed = leftBtn == LOW && leftLastState == HIGH;
bool centerPressed = centerBtn == LOW && centerLastState == HIGH;
bool rightPressed = rightBtn == LOW && rightLastState == HIGH;
leftLastState = leftBtn;
centerLastState = centerBtn;
rightLastState = rightBtn;
if (leftPressed) {
counterLeftButton += 1;
if (counterLeftButton == 1){
lcd.clear();
setLcdTime(hours, minutes, seconds);
lcd.setCursor(6, 1);
lcd.print("^");
lcd.setCursor(7, 1);
lcd.print("^");
}
else if(counterLeftButton == 2){
lcd.clear();
setLcdTime(hours, minutes, seconds);
lcd.setCursor(9, 1);
lcd.print("^");
lcd.setCursor(10, 1);
lcd.print("^");
}
else if(counterLeftButton == 3){
lcd.clear();
setLcdTime(hours, minutes, seconds);
lcd.setCursor(12, 1);
lcd.print("^");
lcd.setCursor(13, 1);
lcd.print("^");
}
else{
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("Done");
delay(1000);
setLcdTime(hours, minutes, seconds);
setMotorTime(hours, minutes, seconds);
counterLeftButton = 0;
}
}
if (rightPressed) {
if(counterLeftButton == 1){
if(hours > 0){
hours -= 1;
} else if(hours == 0){
hours = 23;
}
}
else if(counterLeftButton == 2){
if(minutes > 0){
minutes -= 1;
} else if(minutes == 0){
minutes = 59;
}
}
else if(counterLeftButton == 3){
if(seconds > 0){
seconds -= 1;
} else if (seconds == 0){
seconds = 59;
}
}
setLcdTime(hours, minutes, seconds);
}
if (centerPressed) {
if(counterLeftButton == 1){
if(hours < 23){
hours += 1;
}else if(hours == 23){
hours = 0;
}
}
else if(counterLeftButton == 2){
if(minutes < 59){
minutes += 1;
}else if(minutes == 59){
minutes = 0;
}
}
else if(counterLeftButton == 3){
if(seconds < 59){
seconds += 1;
}else if(seconds == 59){
seconds = 0;
}
}
setLcdTime(hours, minutes, seconds);
}
delay(100);
}
void addHourStep() {
hourSteps = hourSteps + 1;
if (hourSteps > 199) {
hourSteps = 0;
}
digitalWrite(hourPin,HIGH);
digitalWrite(hourPin,LOW);
}
void addMinuteStep() {
minuteSteps = minuteSteps + 1;
if (minuteSteps > 199) {
minuteSteps = 0;
}
digitalWrite(minPin,HIGH);
digitalWrite(minPin,LOW);
}
void addSecondStep() {
secondSteps = secondSteps + 1;
if (secondSteps > 199) {
secondSteps = 0;
}
digitalWrite(secPin,HIGH);
digitalWrite(secPin,LOW);
}
void setMotorTime(int hArg, int mArg, int sArg) {
int targetHourSteps = (hArg % 12 + (float)mArg / 60 + (float)sArg / 3600) * 50 / 3;
int targetMinuteSteps = (mArg + (float)sArg / 60) * 10 / 3;
int targetSecondSteps = sArg * 10 / 3;
bool hourReady = false;
bool minReady = false;
bool secReady = false;
while (!(hourReady && minReady && secReady)) {
if (hourSteps != targetHourSteps) {
addHourStep();
} else {
hourReady = true;
}
if (minuteSteps != targetMinuteSteps) {
addMinuteStep();
} else {
minReady = true;
}
if (secondSteps != targetSecondSteps) {
addSecondStep();
} else {
secReady = true;
}
delay(10);
}
}
void setLcdTime(int hours, int minutes, int seconds){
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.setCursor(6, 0);
if (hours < 10){
lcd.print(0);
lcd.setCursor(7, 0);
}
lcd.print(hours);
lcd.print(":");
lcd.setCursor(9, 0);
if (minutes < 10){
lcd.print(0);
lcd.setCursor(10, 0);
}
lcd.print(minutes);
lcd.print(":");
lcd.setCursor(12, 0);
if (seconds < 10){
lcd.print(0);
lcd.setCursor(13, 0);
}
lcd.print(seconds);
}