projekt LED, switch, buzzer aktywny

Projekt Arduino: LED i Buzzer

W tym projekcie nauczysz się, jak za pomocą przycisku sterować diodą LED i buzzerem.

#define LED_GAME 2
#define BUZZER 3
#define BTN1 4
#define BTN2 5
#define BTN_RESET 6

int diodyGracz1[5] = {7, 8, 9, 10, 11};
int diodyGracz2[5] = {A0, A1, A2, A3, A4};

int punkty1 = 0;
int punkty2 = 0;
const int CEL = 5;

void setup() {
  pinMode(LED_GAME, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(BTN1, INPUT_PULLUP);
  pinMode(BTN2, INPUT_PULLUP);
  pinMode(BTN_RESET, INPUT_PULLUP);

  for (int i = 0; i < 5; i++) {
    pinMode(diodyGracz1[i], OUTPUT);
    pinMode(diodyGracz2[i], OUTPUT);
  }

  randomSeed(analogRead(A3)); // dla losowości

  Serial.begin(9600);
  Serial.println("🎮 Gra refleksu start!");
  Serial.println("Pierwszy do 5 punktów wygrywa!");
  aktualizujDiody();
}

void loop() {
  // --- Obsługa przycisku resetu ---
  if (digitalRead(BTN_RESET) == LOW) {
    delay(150);
    if (digitalRead(BTN_RESET) == LOW) {
      resetGry();
      return;
    }
  }

  // --- Sprawdź zwycięstwo ---
  if (punkty1 >= CEL || punkty2 >= CEL) {
    zwyciestwo();
    return;
  }

  // --- Start nowej rundy ---
  sygnalStartu();
  digitalWrite(LED_GAME, LOW);

  // --- Losowe opóźnienie 1–5 s ---
  int czasCzekania = random(1000, 5000);
  unsigned long startCzekania = millis();
  bool przedwczesne = false;

  while (millis() - startCzekania < czasCzekania) {
    if (digitalRead(BTN1) == LOW) {
      kara(1);
      przedwczesne = true;
      break;
    }
    if (digitalRead(BTN2) == LOW) {
      kara(2);
      przedwczesne = true;
      break;
    }
    if (digitalRead(BTN_RESET) == LOW) { resetGry(); return; }
  }

  if (przedwczesne) {
    delay(1500);
    return;
  }

  // --- Zapal diodę i mierz czas reakcji ---
  digitalWrite(LED_GAME, HIGH);
  unsigned long czasZapalenia = millis();
  bool koniecRundy = false;
  unsigned long limit = 3000; // 3 sekundy na reakcję

  while (!koniecRundy && millis() - czasZapalenia < limit) {
    if (digitalRead(BTN1) == LOW) {
      delay(80); // debounce
      if (digitalRead(BTN1) == LOW) {
        reakcja(1, czasZapalenia);
        koniecRundy = true;
      }
    }
    if (digitalRead(BTN2) == LOW) {
      delay(80);
      if (digitalRead(BTN2) == LOW) {
        reakcja(2, czasZapalenia);
        koniecRundy = true;
      }
    }
    if (digitalRead(BTN_RESET) == LOW) { resetGry(); return; }
  }

  if (!koniecRundy) {
    Serial.println("⏱️ Nikt nie zareagował na czas!");
  }

  digitalWrite(LED_GAME, LOW);
  delay(1000);
}

// --- Reakcja gracza ---
void reakcja(int gracz, unsigned long czasZapalenia) {
  unsigned long czasReakcji = millis() - czasZapalenia;
  if (gracz == 1) punkty1++;
  else punkty2++;

  dzwiekWygranej();
  aktualizujDiody();

  Serial.print("⚡ Gracz ");
  Serial.print(gracz);
  Serial.print(" punkt! Czas reakcji: ");
  Serial.print(czasReakcji);
  Serial.println(" ms");
  Serial.print("Wynik: ");
  Serial.print(punkty1);
  Serial.print(" - ");
  Serial.println(punkty2);
}

// --- Aktualizacja diod punktowych ---
void aktualizujDiody() {
  for (int i = 0; i < 5; i++) {
    digitalWrite(diodyGracz1[i], (i < punkty1) ? HIGH : LOW);
    digitalWrite(diodyGracz2[i], (i < punkty2) ? HIGH : LOW);
  }
}

// --- Dźwięk wygranej rundy ---
void dzwiekWygranej() {
  tone(BUZZER, 1000, 200);
  delay(250);
  noTone(BUZZER);
}

// --- Dźwięk kary i odejmowanie punktu ---
void kara(int gracz) {
  tone(BUZZER, 300, 400);
  delay(500);
  noTone(BUZZER);

  if (gracz == 1 && punkty1 > 0) punkty1--;
  if (gracz == 2 && punkty2 > 0) punkty2--;

  aktualizujDiody();

  Serial.print("❌ Gracz ");
  Serial.print(gracz);
  Serial.println(" za szybki! Traci 1 punkt.");
  Serial.print("Aktualny wynik: ");
  Serial.print(punkty1);
  Serial.print(" - ");
  Serial.println(punkty2);
}

// --- Sygnalizacja startu rundy ---
void sygnalStartu() {
  tone(BUZZER, 600, 100);
  delay(150);
  tone(BUZZER, 800, 100);
  delay(150);
  noTone(BUZZER);
}

// --- Miganie zestawu diod ---
void migajDiody(int diody[], int liczba, int czas) {
  for (int i = 0; i < liczba; i++) digitalWrite(diody[i], HIGH);
  delay(czas);
  for (int i = 0; i < liczba; i++) digitalWrite(diody[i], LOW);
  delay(czas);
}

// --- Fanfary zwycięstwa z migającymi diodami ---
void zwyciestwo() {
  bool gracz1Wygral = (punkty1 >= CEL);

  if (gracz1Wygral)
    Serial.println("🏆 Gracz 1 WYGRYWA GRĘ!");
  else
    Serial.println("🏆 Gracz 2 WYGRYWA GRĘ!");

  int* diodyWygranego = gracz1Wygral ? diodyGracz1 : diodyGracz2;

  for (int i = 0; i < 3; i++) {
    tone(BUZZER, 800, 200);
    migajDiody(diodyWygranego, 5, 200);
    delay(100);

    tone(BUZZER, 1000, 200);
    migajDiody(diodyWygranego, 5, 200);
    delay(100);

    tone(BUZZER, 1200, 300);
    migajDiody(diodyWygranego, 5, 300);
    delay(200);
  }

  noTone(BUZZER);
  resetGry();
}

// --- Reset gry ---
void resetGry() {
  punkty1 = 0;
  punkty2 = 0;
  digitalWrite(LED_GAME, LOW);
  noTone(BUZZER);
  aktualizujDiody();
  Serial.println("🔁 Gra zresetowana. Nowa runda zaczyna się...");
  delay(1500);
}
    

Opis działania

Po naciśnięciu przycisku buzzer wydaje krótki dźwięk, a dioda miga i pozostaje włączona. Przy kolejnym naciśnięciu dioda gaśnie, a buzzer wydaje niższy ton.

Ciekawostka: Dioda LED przepuszcza prąd tylko w jednym kierunku — dlatego musimy uważać, jak ją wpinamy.
Uwaga! Pamiętaj, aby przed podłączeniem sprawdzić biegunowość diody LED.

Funkcja digitalWrite() włącza lub wyłącza prąd na pinie Arduino.

Potrzebujesz 3 piny cyfrowe Arduino.

W przykładzie użyto pinLED = 9, pinBuzzer = 8 i pinSwitch = 7. Możesz zmienić piny, ale pamiętaj o poprawkach w kodzie!

Pobaw się tym programem — zmieniaj parametry i obserwuj, jak dioda i buzzer reagują. Nie bój się eksperymentować!

Dla dociekliwych: Funkcja delayMicroseconds() pozwala dokładniej sterować czasem działania niż delay().

Podłączenie układu

Podłącz komponenty zgodnie ze schematem poniżej. Pamiętaj o rezystorze przy diodzie LED (220–330 Ω) oraz o poprawnym kierunku podłączenia buzzera i przycisku.

Zadanie dla Ciebie: Zmień częstotliwość dźwięku buzzera i sprawdź, jak to wpływa na ton!
Informacja techniczna: Kod działa poprawnie także z Arduino Nano — wystarczy zmienić numer pinu LED.
Schemat połączeń Arduino

Brak komentarzy:

Prześlij komentarz