#define CLK_PIN D2
#define DIO_PIN D3
#define POT_PIN A0
#define BTN_PIN D5 // Пін кнопки
int digitMap[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
bool running = false; // Секундомір
unsigned long startMillis = 0;
unsigned long stopMillis = 0;
// Кнопка
int btnState = HIGH;
unsigned long btnPressTime = 0;
bool buttonHeld = false;
void startSignal() {
digitalWrite(DIO_PIN, HIGH);
digitalWrite(CLK_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(DIO_PIN, LOW);
delayMicroseconds(5);
}
void stopSignal() {
digitalWrite(CLK_PIN, LOW);
delayMicroseconds(5);
digitalWrite(DIO_PIN, LOW);
delayMicroseconds(5);
digitalWrite(CLK_PIN, HIGH);
delayMicroseconds(5);
digitalWrite(DIO_PIN, HIGH);
delayMicroseconds(5);
}
void writeByte(uint8_t b) {
for (int i = 0; i < 8; i++) {
digitalWrite(CLK_PIN, LOW);
digitalWrite(DIO_PIN, (b >> i) & 1);
delayMicroseconds(5);
digitalWrite(CLK_PIN, HIGH);
delayMicroseconds(5);
}
// ACK
digitalWrite(CLK_PIN, LOW);
pinMode(DIO_PIN, INPUT);
delayMicroseconds(5);
digitalWrite(CLK_PIN, HIGH);
delayMicroseconds(5);
pinMode(DIO_PIN, OUTPUT);
}
void showNumber(int num) {
int d1 = num / 10;
int d2 = num % 10;
startSignal();
writeByte(0x40); // auto-increment
stopSignal();
startSignal();
writeByte(0xC0); // starting at address 0
writeByte(digitMap[d1]);
writeByte(digitMap[d2]);
stopSignal();
startSignal();
writeByte(0x88); // display ON, brightness mid
stopSignal();
}
void setup() {
pinMode(CLK_PIN, OUTPUT);
pinMode(DIO_PIN, OUTPUT);
pinMode(POT_PIN, INPUT);
pinMode(BTN_PIN, INPUT_PULLUP); // вмикаємо вбудовану підтяжку до +3.3V
Serial.begin(9600);
}
void loop() {
int val = analogRead(POT_PIN);
int num = map(val, 0, 4095, 0, 99);
showNumber(num);
Serial.println(num);
// Обробка кнопки
int btnReading = digitalRead(BTN_PIN);
if (btnReading == LOW) { // кнопка натиснута
if (btnState == HIGH) {
btnPressTime = millis(); // зберігаємо час натискання
}
btnState = LOW;
} else { // кнопка не натиснута
if (btnState == LOW && millis() - btnPressTime > 50) {
if (millis() - btnPressTime > 1000) { // довге натискання (>1 сек)
// RESET секундоміра
running = false;
stopMillis = 0;
startMillis = 0;
showNumber(0);
Serial.println("RESET");
} else { // коротке натискання
if (running) {
running = false;
stopMillis = millis() - startMillis;
Serial.println("STOP");
} else {
running = true;
startMillis = millis();
Serial.println("START");
}
}
}
btnState = HIGH;
}
if (running) {
showNumber((millis() - startMillis + stopMillis) / 1000); // секунди
}
delay(100);
}