Projek Arduino Reaction Timer Game
Dalam projek imi, Kita akan menggabungkan layar LCD dengan LED RGB dan Buzzer Piezo untuk membuat game timer reaksi.
Komponen yang diperlukan :
1. Arduino board
2. Breadboard
3. Kabel Jumper
4. 16x2 LCD screen (Hitachi HD44780 compatible)
5. RGB LED module
6. Piezo buzzer
7. Momentary tactile four-pin pushbutton
8. 50k-ohm potentiometer
9. 220-ohm resistor
Diperlukan Librari LiquidCristal
Cara kerja :
Anda memulai permainan dengan menahan tombol tekan. LED RGB menyala dan memudar melalui beberapa warna acak. Tujuan Anda adalah untuk bereaksi secepat mungkin ketika berubah menjadi merah dan melepaskan tombol. Layar LCD menunjukkan waktu reaksi Anda dalam milidetik, dari saat LED menyala merah hingga saat Anda melepaskan tombol.
RGB adalah model warna aditif, yang berarti bahwa dengan menggabungkan cahaya dari dua warna atau lebih, kita dapat membuat warna lain. Merah, hijau, dan biru adalah warna primer aditif yang biasanya digunakan sebagai dasar untuk warna lain, seperti yang ditunjukkan pada Gambar.
Mari kita lihat LED RGB sedikit lebih detail. Gambar menunjukkan LED katoda umum yang jelas. Perhatikan bahwa LED memiliki empat kaki, bukan dua kaki biasa: masing-masing untuk merah, hijau, dan biru, dan yang terakhir adalah katoda atau anoda. Dalam hal ini pin terpanjang adalah katoda, dan terhubung ke ground (GND).
LED RGB yang digunakan dalam proyek ini ada pada modul dengan resistor bawaan, yang memungkinkan kami menghemat ruang di breadbord kami.
Cara membuat rangkaian :
1. Siapkan layar LCD.
2. Tempatkan layar LCD Anda di breadbord, masukkan pin header ke dalam lubang breadbord. Tempatkan juga potensiometer di breadbord, dan gunakan breadbord dan kabel jumper untuk menghubungkan layar LCD Anda, Arduino, dan potensiometer.
3. Anda seharusnya sudah menghubungkan pin tengah potensiometer 50-kilohm ke pin LCD 3 (VO). Sekarang hubungkan salah satu pin luar ke GND dan yang lainnya ke +5V. Ini mengontrol kontras layar LCD Anda.
4. Masukkan tombol tekan ke breadbord sehingga mengangkangi pecah di tengah. Kami akan memberi label pada pin seperti yang ditunjukkan pada Gambar.
Hubungkan pin A ke ground melalui resistor 220-ohm, pin C ke pin 9 Arduino, dan pin D ke +5V.
5. Masukkan modul RGB dan sambungkan pin merah ke pin 8 Arduino, hijau ke pin 6, biru ke pin 7, dan + ke +5V.
Saat Anda menekan dan menahan tombol tekan, LED berkedip warna dom dan akhirnya berubah menjadi merah. Durasi waktu yang setiap pertunjukan warna diatur ke acak, seperti durasi jeda antar lampu. Ini berarti Anda tidak dapat mempelajari urutan warna dan memprediksi kapan LED akan berubah menjadi merah.
Anda dapat membuat permainan lebih sulit dengan meningkatkan durasi interval di baris sketsa berikut:
PSE = random(500, 1200);
Sketsa lengkapnya adalah sebagai berikut:
// Used an RGB LED with a common anode (3 cathodes: R, G, B)
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int LEDR = 8; // Pin connected to red LED
int LEDB = 7; // Pin connected to blue LED
int LEDGr = 6; // Pin connected to green LED
int Button = 9; // Pin connected to pushbutton
int COLOR; // Variable color
int Beep;
int PSE; // Variable pause
int TME; // Time
int RTME = 0; // Reaction time
void setup() {
lcd.begin(16, 2);
pinMode(LEDR, OUTPUT); // Set LED pins as output
pinMode(LEDB, OUTPUT);
pinMode(LEDGr, OUTPUT);
pinMode(Button, INPUT); // Set pushbutton as input
digitalWrite(LEDR, LOW); // Switch on all LED colors
digitalWrite(LEDB, LOW);
digitalWrite(LEDGr, LOW);
}
void loop() {
lcd.clear(); // Clear screen
lcd.print("Hold Button to"); // Display message on LCD screen
lcd.setCursor(0, 1); // Move to second line
lcd.print("start.");
while (digitalRead(Button) == LOW) { // Test does not start until
// button is pushed (and held)
tone(13, 1200, 30);
delay(1400);
noTone(13);
}
lcd.clear();
digitalWrite(LEDR, HIGH); // Switch off start light
digitalWrite(LEDB, HIGH);
digitalWrite(LEDGr, HIGH);
randomSeed(analogRead(0)); // Random noise from pin 0
COLOR = random(1, 4); // Generate random color
PSE = random(500, 1200); // Set random pause duration between lights
// Repeat this loop while color is green or blue AND pushbutton
// is held
while (COLOR != 1 && digitalRead(Button) == HIGH) {
digitalWrite(LEDGr, HIGH);
digitalWrite(LEDB, HIGH);
delay(PSE);
randomSeed(analogRead(0));
Beep = random(1, 4); // Select random beep from buzzer
// (buzzer beeps 1 in 3 times)
PSE = random(750, 1200); // Select random pause duration between
// lights (to increase surprise effect)
if (Beep == 1) {
tone(13, 1600, 350);
delay(750);
noTone(13);
}
if (COLOR == 2) {
digitalWrite(LEDGr, LOW);
}
if (COLOR == 3) {
digitalWrite(LEDB, LOW);
}
delay(PSE);
randomSeed(analogRead(0));
COLOR = random(1, 4); // Select random color
}
// Execute this loop if color is red
if (COLOR == 1 && digitalRead(Button) == HIGH) {
digitalWrite(LEDGr, HIGH);
digitalWrite(LEDB, HIGH);
delay(PSE);
TME = millis(); // Record time since program has started
digitalWrite(LEDR, LOW);
while (digitalRead(Button) == HIGH) { // Runs until button is
// released, recording the
// reaction time
delay(1);
}
lcd.display();
RTME = millis() - TME; // Reaction time in ms
lcd.print("Reaction Time:"); // Display on LCD screen
lcd.setCursor(0, 1);
lcd.print(RTME);
}
// Execute if color is NOT red but the pushbutton is released
if (COLOR != 1) {
lcd.print("Released too");
lcd.setCursor(0, 1); // Move to second line
lcd.print("soon!!!");
tone(13, 3000, 1500);
delay(500);
noTone(13);
}
// Test does not restart until the button is pushed once
while (digitalRead(Button) == LOW) {
delay(10);
}
digitalWrite(LEDR, LOW); // Reset all lights to begin again
digitalWrite(LEDB, LOW);
digitalWrite(LEDGr, LOW);
lcd.clear();
lcd.print("Hold Button to");
lcd.setCursor(0, 1);
lcd.print("start.");
int Time = 0;
delay(1000);
}
0 Comments