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.
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ć!
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.
Brak komentarzy:
Prześlij komentarz