```cpp
#include <TimeLib.h>
#include <GTimer.h>
#include <DS1307RTC.h>
#include <Wire.h>
#define BTN_PIN1 0 //порт кнопка 1
#define BTN_PIN2 5 //порт кнопка 2
#define BTN_PIN3 2 //порт кнопка 3
#define LED1 2 //порт диода
#define ZUM_DIO 6 //порт зуммера
#define LATCH_DIO 4 // линия синхронизации данных, защелка (LCHCLK)
#define CLK_DIO 7 // линия тактирования (SFTCLK)
#define DATA_DIO 8 // линия передачи данных (SDI)
// коды цифр от 0 до 9
const byte seg_digits[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0X80, 0X90 };
// коды разрядов
const byte seg_num[] = { 0xF1, 0xF2, 0xF4, 0xF8 };
//кнопки
uint8_t k2 = 0;
uint8_t led1;
uint8_t a1 = 0;
uint8_t a2 = 0;
uint8_t a3 = 0;
uint8_t s = 0;
void setup() {
Serial.begin(115200);
//настройка выводов кнопок
pinMode(BTN_PIN1, INPUT_PULLUP);
pinMode(BTN_PIN2, INPUT_PULLUP);
pinMode(BTN_PIN3, INPUT_PULLUP);
// настройка контактов индикатора
pinMode(LATCH_DIO, OUTPUT);
pinMode(CLK_DIO, OUTPUT);
pinMode(DATA_DIO, OUTPUT);
pinMode(ZUM_DIO, OUTPUT);
pinMode(LED1, OUTPUT);
digitalWrite(ZUM_DIO, 1);
}
// вывод цифры в заданный разряд
void writeNumber(uint8_t a1, uint8_t a2, uint8_t a3) {
digitalWrite(LATCH_DIO, LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_digits[a1]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_num[0]);
digitalWrite(LATCH_DIO, HIGH);
digitalWrite(LATCH_DIO, LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_digits[a2]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_num[1]);
digitalWrite(LATCH_DIO, HIGH);
digitalWrite(LATCH_DIO, LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_digits[a3 / 10]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_num[2]);
digitalWrite(LATCH_DIO, HIGH);
digitalWrite(LATCH_DIO, LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_digits[a3 - ((a3 / 10) * 10)]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, seg_num[3]);
digitalWrite(LATCH_DIO, HIGH);
}
void set_cifr(uint8_t &a1, uint8_t &a2, uint8_t &a3) {
uint32_t z = millis();
uint8_t a = 0;
uint8_t k1 = 1;
uint8_t k3 = 1;
//первый сегмент
while (k3 == 1) {
writeNumber(a1, a2, a3); //вывод цыфры на индикатор
if (millis() - z >= 500) {
z = millis();
k1 = digitalRead(BTN_PIN1);
if (a <= 4) {
if (k1 == 0) a++;
} else a = 0;
}
a1 = a;
k3 = digitalRead(BTN_PIN3); //чтение кнопки 3 ВВОД
Serial.print("1k3=");
Serial.println(k3);
delay(500);
}
a = 0;
digitalWrite(ZUM_DIO, 0); //звуковой сигнал
delay(100);
digitalWrite(ZUM_DIO, 1);
delay(300);
//второй сегмент
k3 = 1;
delay(500);
while (k3 == 1) {
writeNumber(a1, a2, a3); //вывод цыфры на индикатор
if (millis() - z >= 500) {
z = millis();
k1 = digitalRead(BTN_PIN1);
if (a <= 4) {
if (k1 == 0) a++;
} else a = 0;
a2 = a;
}
k3 = digitalRead(BTN_PIN3); //чтение кнопки 3 ВВОД
Serial.print("2k3=");
Serial.println(k3);
}
a = 0;
digitalWrite(ZUM_DIO, 0);
delay(100);
digitalWrite(ZUM_DIO, 1);
delay(300);
//третий сегмент
k3 = 1;
while (k3 == 1) {
writeNumber(a1, a2, a3); //вывод цыфры на индикатор
if (millis() - z >= 500) {
z = millis();
k1 = digitalRead(BTN_PIN1);
if (a <= 22) {
if (k1 == 0) a++;
} else a = 0;
a3 = a;
}
k3 = digitalRead(BTN_PIN3); //чтение кнопки 3 ВВОД
Serial.print("3k3=");
Serial.println(k3);
}
digitalWrite(ZUM_DIO, 0);
delay(100);
digitalWrite(ZUM_DIO, 1);
delay(300);
}
void loop() {
Serial.println("начало");
digitalWrite(LED1, 1);
if (s < 2) {
k2 = digitalRead(BTN_PIN2); //выбор режима
//авто
if (k2 == 0 && s == 0) {
s++;
digitalWrite(ZUM_DIO, 0);
delay(100);
digitalWrite(ZUM_DIO, 1);
delay(300);
Serial.println("авто");
set_cifr(a1, a2, a3);
}
k2 = digitalRead(BTN_PIN2);
//ручной
if (k2 == 0 && s == 1) {
Serial.println("ручной");
s++;
digitalWrite(ZUM_DIO, 0);
delay(100);
digitalWrite(ZUM_DIO, 1);
delay(300);
digitalWrite(LED1, 0);
set_cifr(a1, a2, a3);
}
//высота
//if (k2 == 0 && s == 2) {
// Serial.println("высота");
// s++;
// digitalWrite(ZUM_DIO, 0);
// delay(100);
//digitalWrite(ZUM_DIO, 1);
//delay(300);
//digitalWrite(LED1, 0);
//set_cifr(a1, a2, a3);
//}
} else (s = 0);
writeNumber(a1, a2, a3);
//delay(500);
}
```