#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;
unsigned long lastUpdateTime = 0; // Для синхронізації задач
unsigned long lastPotUpdateTime = 0; // Для оновлення потенціометра
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);
}
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 task1() { // Секундомір
if (running) {
showNumber((millis() - startMillis + stopMillis) / 1000); // секунди
}
}
void task2() { // Потенціометр
int val = analogRead(POT_PIN);
int num = map(val, 0, 4095, 0, 99);
showNumber(num);
Serial.println(num);
}
void handleButton() { // Обробка кнопки
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) {
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;
}
}
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() {
unsigned long currentMillis = millis();
// Імітація задач: кожні 100 мс оновлюємо секундомір
if (currentMillis - lastUpdateTime >= 100) {
lastUpdateTime = currentMillis;
task1(); // Викликаємо задачу секундоміра
}
// Імітація задач: кожні 500 мс оновлюємо потенціометр
if (currentMillis - lastPotUpdateTime >= 500) {
lastPotUpdateTime = currentMillis;
task2(); // Викликаємо задачу потенціометра
}
handleButton(); // Перевірка кнопки
}