Загрузка данных


// Пины для датчиков (берём D0-выходы)
const int sensor1 = 3; // датчик слева
const int sensor2 = 4; // датчик справа

// Пин для кнопки сброса
const int resetButton = 2;

// Пин для пьезопищалки (буззера)
const int buzzerPin = 8;

// Счёт
int score1 = 0;
int score2 = 0;

// Чтобы избежать многократного счёта при удержании
bool lastState1 = HIGH;
bool lastState2 = HIGH;

void setup() {
  // Пины датчиков и кнопки
  pinMode(sensor1, INPUT);
  pinMode(sensor2, INPUT);
  pinMode(resetButton, INPUT_PULLUP);
  
  // Пин пищалки
  pinMode(buzzerPin, OUTPUT);

  // Serial монитор
  Serial.begin(9600);
  Serial.println("Система запущена!");

  // Приветственный звуковой сигнал при старте (короткая приятная мелодия)
  playStartupSound();
}

void loop() {
  // Читаем датчики
  int state1 = digitalRead(sensor1);
  int state2 = digitalRead(sensor2);

  // Печать состояний в Serial Monitor
  Serial.print("Датчик 1: ");
  Serial.print(state1);
  Serial.print("   |   Датчик 2: ");
  Serial.println(state2);

  // Датчик 1 сработал (LOW при срабатывании)
  if (state1 == LOW && lastState1 == HIGH) {
    score1++;
    printScore();
    playGoalSound(); // Звук гола для левого игрока
    Serial.println("ГОЛ! Слева +1");
    delay(200); // антидребезг
  }
  lastState1 = state1;

  // Датчик 2 сработал
  if (state2 == LOW && lastState2 == HIGH) {
    score2++;
    printScore();
    playGoalSound(); // Звук гола для правого игрока
    Serial.println("ГОЛ! Справа +1");
    delay(200);
  }
  lastState2 = state2;

  // Проверка кнопки сброса
  if (digitalRead(resetButton) == LOW) {
    score1 = 0;
    score2 = 0;
    printScore();
    playResetSound(); // Звук сброса счёта
    Serial.println("Счёт сброшен!");
    delay(300); // защита от дребезга
  }
}

// Функция для вывода текущего счёта в Serial
void printScore() {
  Serial.print("СЧЁТ ---> Левый: ");
  Serial.print(score1);
  Serial.print(" | Правый: ");
  Serial.println(score2);
}

// --- Функции для приятных звуков ---

// Короткий и мягкий писк при голе (используем высокую ноту, но не режущую слух)
void playGoalSound() {
  tone(buzzerPin, 2093, 100); // Нота До (C7), длительность 100 мс
  delay(120);
  noTone(buzzerPin);
}

// Звук при сбросе счёта (двойной короткий сигнал)
void playResetSound() {
  tone(buzzerPin, 1046, 80);  // Нота До (C6)
  delay(100);
  tone(buzzerPin, 1567, 120); // Нота Соль (G6)
  delay(140);
  noTone(buzzerPin);
}

// Мелодия при старте системы
void playStartupSound() {
  tone(buzzerPin, 1046, 100);
  delay(120);
  tone(buzzerPin, 1318, 100);
  delay(120);
  tone(buzzerPin, 1567, 150);
  delay(170);
  noTone(buzzerPin);
}