#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Настройки дисплея
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Пины подключения
const int buttonUpPin = 8; // Кнопка плюс
const int buttonDownPin = 9; // Кнопка минус
const int ledPin = 13; // LED
const int buzzerPin = 10; // динамик
const int sliderPin = A0; // Слайдер
// Переменные
int count = 0; // Счётчик
int lastSliderValue = 0; // Послед. значение слайдера
unsigned long lastUpdateTime = 0; // Время послед. обновления
int updateInterval = 2000; // Интервал обновления дисплея
void setup() {
// Настройка пинов
pinMode(buttonUpPin, INPUT_PULLUP);
pinMode(buttonDownPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
// Инит дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 init fail"));
for (;;); // Застреваем, если дисплей не инициализируется
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Count: ");
display.print(count);
display.display();
}
void loop() {
int sliderValue = analogRead(sliderPin);
int increment = map(sliderValue, 0, 1023, 1, 10); // Значение inc (от 1 до 10)
if (digitalRead(buttonUpPin) == LOW) {
delay(50); // Антидребезг
if (digitalRead(buttonUpPin) == LOW) {
count += increment;
updateDisplay();
handleLedFeedback();
handleBuzzerFeedback();
while (digitalRead(buttonUpPin) == LOW); // Ждём отпускания кнопки
}
}
if (digitalRead(buttonDownPin) == LOW) {
delay(50); // Антидребезг
if (digitalRead(buttonDownPin) == LOW) {
count -= increment;
if (count < 0) count = 0;
updateDisplay();
handleLedFeedback();
handleBuzzerFeedback();
while (digitalRead(buttonDownPin) == LOW); // Ждём отпускания кнопки
}
}
// Обновление дисплея
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime > updateInterval) {
lastUpdateTime = currentTime;
if (sliderValue == lastSliderValue) {
updateDisplay();
} else {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Inc: ");
display.print(increment);
display.display();
}
lastSliderValue = sliderValue;
}
}
void updateDisplay() {
display.clearDisplay();
display.setCursor(0, 0);
display.print("Count: ");
display.print(count);
display.display();
}
void handleLedFeedback() {
digitalWrite(ledPin, HIGH);
delay(100);
digitalWrite(ledPin, LOW);
}
void handleBuzzerFeedback() {
if (count % 10 == 0 && count > 0) {
int numBeeps = count / 10;
int beepDuration = 100;
int pauseDuration = 100; /
for (int i = 0; i < numBeeps; i++) {
tone(buzzerPin, 1000, beepDuration);
delay(beepDuration + pauseDuration);
noTone(buzzerPin);
}
}
}