// Піни для світлодіодів (L to R: молодший біт до старшого)
const int ledPin1 = PA5; // Біт 0
const int ledPin2 = PA6; // Біт 1
const int ledPin3 = PA7; // Біт 2
// Пін для кнопки
const int buttonPin = PC13;
// Змінні
int buttonPressCounter = 0; // Лічильник натискань
int lastButtonState = LOW; // Попередній стан кнопки
unsigned long lastPressTime = 0; // Час останнього натискання
const unsigned long RESET_INTERVAL = 25000; // 25 секунд у мілісекундах
const int DEBOUNCE_DELAY = 50; // Затримка для усунення "брязкоту" контактів
void setup() {
// Налаштовуємо піни світлодіодів як виходи
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
// Налаштовуємо пін кнопки як вхід
// PC13 на платі Nucleo вже має апаратну підтяжку, але для ясності можна вказати INPUT_PULLDOWN
pinMode(buttonPin, INPUT);
// Ініціалізуємо серійний порт для відладки (необов'язково)
Serial.begin(9600);
Serial.println("Система готова. Очікую на натискання кнопки...");
// Початкове оновлення світлодіодів
updateLeds();
}
void loop() {
// Зчитуємо поточний стан кнопки
int currentButtonState = digitalRead(buttonPin);
// Перевіряємо, чи змінився стан кнопки (натискання)
if (currentButtonState == HIGH && lastButtonState == LOW) {
// Невелика затримка для усунення брязкоту контактів
delay(DEBOUNCE_DELAY);
// Перевіряємо стан ще раз після затримки
if (digitalRead(buttonPin) == HIGH) {
buttonPressCounter++; // Збільшуємо лічильник
lastPressTime = millis(); // Оновлюємо час останнього натискання
// Обмежуємо лічильник, оскільки у нас 3 діоди (макс. число 7, тобто 111 у двійковому)
if (buttonPressCounter > 7) {
buttonPressCounter = 0; // Скидаємо лічильник після 7
}
Serial.print("Кнопку натиснуто! Лічильник: ");
Serial.println(buttonPressCounter);
updateLeds(); // Оновлюємо стан світлодіодів
}
}
// Оновлюємо попередній стан кнопки
lastButtonState = currentButtonState;
// Перевіряємо, чи не минуло 25 секунд бездіяльності
if (millis() - lastPressTime > RESET_INTERVAL && buttonPressCounter != 0) {
Serial.println("25 секунд минуло. Скидання лічильника.");
buttonPressCounter = 0; // Скидаємо лічильник
updateLeds(); // Оновлюємо світлодіоди (всі вимкнуться)
lastPressTime = millis(); // Скидаємо таймер, щоб він не спрацьовував знову одразу
}
}
// Функція для відображення числа у двійковому коді на світлодіодах
void updateLeds() {
// Використовуємо побітові операції для перевірки кожного біта лічильника
digitalWrite(ledPin1, (buttonPressCounter & 1)); // Перевіряємо 0-й біт (2^0)
digitalWrite(ledPin2, (buttonPressCounter & 2)); // Перевіряємо 1-й біт (2^1)
digitalWrite(ledPin3, (buttonPressCounter & 4)); // Перевіряємо 2-й біт (2^2)
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6