Daftar Isi:
- Langkah 1: Pengkabelan
- Langkah 2: Pernyataan Pernyataan
- Langkah 3: Fungsi Pengaturan
- Langkah 4: Fungsi Loop
- Langkah 5: Fungsi ClearLCD
- Langkah 6: Fungsi DrawBoard
- Langkah 7: Fungsi PlayBoard
- Langkah 8: Fungsi ClearBoard
- Langkah 9: Fungsi Judul
- Langkah 10: Fungsi ButtonsMenu
- Langkah 11: Fungsi ButtonsGame
- Langkah 12: Fungsi GameOver
- Langkah 13: Fungsi Input
- Langkah 14: Fungsi BottomCheck
- Langkah 15: Fungsi WriteSerial
- Langkah 16: Selesai
Video: Arduino - Ubin Piano: 16 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
Halo orang-orang internet, Ini akan menjadi tentang bagaimana membuat apa yang PASTI bukan rip off dari game mobile di arduino uno r3.
jadi untuk memulai, Anda akan membutuhkan semua bagian, yaitu sebagai berikut! 1x Arduino Uno r3 ($42)
2x LCD Keypad Shield (masing-masing $19)
5x tombol
5x 220Ω resistor
28x kabel
Baiklah, setelah Anda mendapatkan semua bagian, saatnya untuk memulai!
Langkah 1: Pengkabelan
Mulailah dengan memasang kabel arduino dan teman-teman Anda seperti yang ditunjukkan pada diagram, Pastikan bahwa tombol-tombol terhubung ke atas dengan cara yang benar, dengan slot A0-4 di sisi dasar rel tombol, atau arduino akan mengira tombol-tombol itu ditekan terus-menerus alih-alih hanya dengan menekan.
Langkah 2: Pernyataan Pernyataan
Semua kode di sini harus didahulukan sebelum void setup dan void loop, ini karena semua variabel dan objek ini digunakan di beberapa fungsi yang akan kita atur.
Mulailah dengan meletakkan:
#termasuk
di bagian atas kode Anda, ini memberi tahu arduino untuk menggunakan perpustakaan "LiquidCrystal.h" dan fungsi-fungsi yang merupakan bagian darinya.
Langkah selanjutnya adalah menentukan pin yang kita gunakan untuk tombol kita dengan meletakkan kode ini di bawah #include:
#define btnEnter A0#define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
Kami mendefinisikan istilah btnEnter dan btn1 ke btn 4 untuk membuat kode lebih mudah dibaca, atau diubah jika perlu. Artinya ketika kita mengetik btn1 maka arduino akan mengetahui bahwa yang kita maksud sebenarnya adalah tombol 15. Meskipun kita memanggil port 15, 16, 17 dan 18, mereka diberi label pada arduino sebagai A1 A2 A3 dan A4, ini karena mereka adalah port yang digunakan khusus untuk input analog, meskipun kami hanya menggunakannya untuk input digital.
Selanjutnya kita akan membuat objek yang akan mengontrol Liquid Crystal Displays. Untuk melakukan ini, letakkan kode ini di bawah definisi kami
LiquidCrystal lcdKiri(8, 9, 12, 10, 11, 13);LiquidCrystal lcdKanan(2, 3, 4, 5, 6, 7);
Apa yang dilakukan adalah memberitahu arduino bahwa ketika kita memanggil lcdLeft atau lcdRight kita mengacu pada objek LiquidCrystal. Angka-angka dalam kurung terlampir memberi tahu arduino port mana yang harus digunakan objek untuk mengirim pesan ke LCD saat kita menggunakan fungsinya.
Sekarang kita perlu mendeklarasikan variabel dengan meletakkan bit kode berikutnya di bawah deklarasi objek:
//variabel ini adalah opsi yang dapat Anda ubah - angka yang lebih tinggi = kecepatan game yang lebih cepat hingga intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
//set up variabel untuk bolPlay gameboolean; //melacak jika pemain int intScore; //melacak skor pemain int intDiff; //hanya hal estetis untuk memberitahu kesulitan apa permainan ini //set up variabel untuk input int intEnter; //melacak jika pengguna menekan tombol enter int intInput; //melacak tombol mana yang ditekan pengguna boolean bolTilePressed; //memastikan pemain tidak menekan tombol 5x secara tidak sengaja dan kehilangan //mengatur variabel untuk turn int intTick; //menghitung miliy (per loop) hingga intDelay int intDelay; //waktu program menunggu hingga giliran berikutnya dalam milis int intGameSpeed; // sedikit opsi debug boolean bolSerialBoard; //ketika benar akan mencetak papan di monitor serial
Kami mendeklarasikan variabel dengan menyatakan tipe data dan kemudian nama variabel, mis. int thisIsAnInteger
Variabel Boolean, seperti bolSerialBoard dan bolPlay hanya dapat memiliki satu dari dua nilai, benar atau salah.
Variabel integer (int) seperti intScore dan intInput dapat mengambil bilangan bulat sebagai nilai, seperti 1, 5 atau 100.
Beberapa tipe data penting lainnya yang tidak kita gunakan di sini adalah string, yang merupakan potongan teks, dan float, yang merupakan angka desimal.
Masing-masing variabel di sini digunakan di beberapa tempat berbeda oleh program, berikut adalah sinopsis dari apa yang dilakukan masing-masing variabel
bolPlay memberi tahu program jika menu harus ditampilkan atau jika game yang sebenarnya harus dijalankan.
intScore melacak skor pemain saat mereka memukul ubin, intDiff digunakan pada menu utama untuk memberi tahu program teks apa yang akan dicetak pada LCD, intEnter digunakan untuk memberitahu program jika tombol enter (paling kiri) ditekan, intInput digunakan untuk memberi tahu program mana dari 4 tombol lainnya yang ditekan.
bolTilePressed digunakan untuk memastikan program hanya membaca saat tombol ditekan dan bukan saat ditahan.
intGameSpeed, intGameSpeedEasy, intGameSpeedMedium, dan intGameSpeedHard digunakan untuk mengontrol seberapa cepat game harus dipercepat berdasarkan tingkat kesulitan yang dipilih.
intTick dan intDelay digunakan untuk menghentikan program dari memindahkan papan setiap kali loop.
bolSerialBoard digunakan untuk memungkinkan Anda membuat program mengirim board ke monitor serial arduino sebagai rangkaian angka untuk tujuan pengujian.
Akhirnya saatnya untuk mendeklarasikan papan kita sebagai array menggunakan kode ini:
// set up game arrayint arrGame[16][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} };
Array adalah matriks yang titiknya dapat dipanggil untuk matematika atau diubah.
Kode Anda sekarang akan terlihat seperti ini;
// sertakan perpustakaan#sertakan
//variabel ini adalah opsi yang dapat Anda ubah - angka yang lebih tinggi = kecepatan permainan yang lebih cepat
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Tentukan pin
#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// membuat objek LCD (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight(2, 3, 4, 5, 6, 7);
// mengatur susunan permainan
int arrGame[16][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} };
//mengatur variabel untuk permainan
boolean bolPlay; //melacak jika pemain int intScore; //melacak skor pemain int intDiff; //hanya hal estetis untuk menceritakan kesulitan permainan ini
//set up variabel untuk input
int masuk; //melacak jika pengguna menekan tombol enter int intInput; //melacak tombol mana yang ditekan pengguna boolean bolTilePressed; //pastikan pemain tidak menekan tombol 5x secara tidak sengaja dan kalah
//set up variabel untuk turn
int intTik; //menghitung miliy (per loop) hingga intDelay int intDelay; //waktu program menunggu hingga giliran berikutnya dalam milis int intGameSpeed;
// sedikit opsi debug
boolean bolSerialBoard; //ketika benar akan mencetak papan di monitor serial
Langkah 3: Fungsi Pengaturan
Loop pengaturan adalah fungsi yang dibaca oleh arduino hanya sekali ketika pertama kali dimulai.
Dalam loop pengaturan, kami hanya mengatur nilai dari beberapa variabel kami karena alih-alih menetapkan nilai saat mendeklarasikannya, kami melakukannya di sini.
Mulailah dengan memasukkan kode ini ke dalam Void Setup Anda.
bolPlay = false;intScore = 0; intTik = 0; intTunda = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;
Setiap baris hanya mengatur variabel ke nilai.
bolPlay disetel ke false agar game tidak mulai dimainkan.
intScore diatur ke 0, karena secara alami skor Anda dimulai dari 0.
intTick dimulai dari 0 karena program saat ini tidak menghitung apa pun.
intDelay diatur ke 1000 karena itulah tingkat ubin mulai.
intDiff hanyalah hal pertapa sehingga program tahu apa yang harus ditulis untuk kesulitan permainan.
intGameSpeed disetel ke apa pun intGameSpeedMedium, artinya disetel pada tingkat kesulitan sedang.
Selanjutnya letakkan kode ini di Void Setup di bawah kode yang baru saja Anda masukkan.
lcdLeft.begin(16, 2);lcdRight.begin(16, 2);
Serial.begin(9600);
Ini memberitahu arduino untuk mulai berkomunikasi dengan komputer melalui monitor serial (terlihat dengan mengklik tombol di kanan atas IDE arduino).
Pengaturan Void Anda sekarang akan terlihat seperti ini!
void setup() { Serial.begin(9600); //mulai serial monitor //set up variabel bolPlay = false; intSkor = 0; intTik = 0; intTunda = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; //mulai lcd's lcdLeft.begin(16, 2); lcdRight.begin(16, 2); }
Langkah 4: Fungsi Loop
Fungsi loop dijalankan oleh arduino setiap iterasi dari arduino.
Salin kode berikut ke dalam Void Loop Anda.
void loop() { masukan(); //periksa input pemutaran if (bolPlay == true){ if (intTick >= intDelay){ //periksa untuk melihat apakah game harus memutar atau terus menunggu Serial.println("~~~~~~~~ ~~");//print untuk menandakan papan bergerak //writeSerial(); //jika opsi diaktifkan, tulis papan menjadi tombol serialGame(); //memeriksa input pemain playBoard(); //pindahkan papan dan tambahkan ubin baru clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke bagian bawah lcdCheck(); intTik = 0; //reset intTick } else { keysGame(); //periksa input pemain clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke lcd intTick = intTick + intGameSpeed; //tambahkan ke centang } } else { clearLcd(); //bersihkan LCD sebelum menggambar judul(); //tampilkan tombol info judul dan skorMenu(); //baca input pemain clearBoard(); //pastikan seluruh papan = 0 } delay(10); //tunda arduino sebentar }
ketika bolPlay sama dengan true itu berarti permainan sedang dimainkan, dan semua kode untuk saat permainan dimainkan harus dijalankan, tetapi kami hanya ingin papan menambahkan ubin baru dan turun ketika intTick lebih besar dari intDelay kami, jika tidak, kami masih ingin mengizinkan pengguna menekan tombol untuk menekan ubin dan agar intTick meningkatkan kecepatan.
Sebagian besar kode ini menggunakan fungsi yang belum kami buat, dan kami akan membuatnya di langkah selanjutnya. Tujuan dari fungsi-fungsi tersebut adalah sebagai berikut.
Input membaca tombol mana yang telah ditekan pengguna.
tombolGame mengontrol apa yang dilakukan tombol saat berada di dalam game, dan bukan di menu
playBoard menambahkan ubin baru ke papan, lalu memindahkan semua yang ada di papan ke bawah satu ruang
clearLCD membersihkan LCD untuk memastikan tidak ada hantu yang tertinggal di belakang ubin
drawBoard melewati arrGame dan mencetaknya ke LCD
clearBoard membersihkan seluruh arrGame saat game tidak dimainkan
bottomCheck memeriksa bagian bawah arrGame untuk kondisi kegagalan
judul menampilkan judul game dan informasi skor saat berada di menu
tombol menu mengontrol apa yang dilakukan input pengguna saat berada di menu.
gameOver adalah fungsi lain, meskipun tidak dipanggil di sini karena sebaliknya disebut di bagian bawahCheck dan fungsi tombolGame.
Langkah 5: Fungsi ClearLCD
untuk membuat fungsi kita mulai dengan menambahkan ini ke kode
batal namafungsi() {
}
"functionName" bisa apa saja, asalkan belum ada.
Salin kode ini ke dalam program Anda:
void clearLcd() { for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 1; ii++){ lcdLeft.setCursor(i, ii); lcdLeft.write(" "); lcdRight.setCursor(i, ii); lcdRight.write(" "); } } }
ini berjalan melalui seluruh array dengan menggunakan 2 loop terhitung untuk melewati setiap titik pada LCD dan menulis spasi.
Tanpa disetel ulang ke nol, LCD akan mempertahankan apa pun yang ditulis sebelumnya
Langkah 6: Fungsi DrawBoard
salin kode ini ke dalam program Anda
void drawBoard() { for (int i = 1; i <= 15; i++){ //gambar kolom 1 dan 2 di sebelah kiri LCD //jika ubin = 0 tulis apa-apa, = 1 tulis "#", = 2 tulis "@" lcdLeft.setCursor(i, 1); //set ke kolom pertama (paling kiri) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); //set ke kolom kedua (kiri tengah) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); //set ke kolom ketiga (kanan tengah) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); //set ke kolom keempat (paling kanan) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.menulis("@");} } }
ini menggunakan loop untuk melewati setiap baris papan, kemudian memeriksa untuk melihat apakah ada kolom di baris yang sama dengan 1 atau 2, berdasarkan itu ia kemudian mencetak pada LCD baik tagar, untuk ubin yang belum hit, atau @ untuk ubin hit.
Langkah 7: Fungsi PlayBoard
salin kode ini ke dalam program Anda.
void playBoard() { for (int i = 0; i <= 3; i++){arrGame[0] = 0;} //hapus baris atas arrGame[0][random(0, 4)] = 1; //menetapkan titik acak di baris atas menjadi ubin untuk (int i = 15; i>= 1; i--){ //bekerja dari bawah papan ke atas untuk (int ii = 0; ii <= 3; ii ++){ //untuk setiap kolom arrGame[ii] = arrGame[i - 1][ii]; } } }
kode ini dimulai dengan mengosongkan seluruh baris atas ke 0, atau tanpa ubin, dan kemudian menetapkan satu ubin acak menjadi 1, dan tidak terkena ubin.
Kemudian melewati loop yang dihitung secara terbalik, dari 15 ke 1, mengatur baris menjadi sama dengan apa pun yang sama dengan baris di atasnya, membuat papan bergerak ke bawah LCD
Langkah 8: Fungsi ClearBoard
salin kode ini ke dalam program Anda.
void clearBoard() { //setel ulang nilai centang dan tunda intTick = 0; intTunda = 1000; //menelusuri papan dan mengatur semuanya ke 0 for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }
Kode ini dijalankan saat game tidak dimainkan untuk memastikan seluruh arrGame disetel ke 0, atau tidak ada ubin, dengan menggunakan loop terhitung untuk menelusuri array.
Kode juga mengatur ulang nilai intDelay dan intTick.
Langkah 9: Fungsi Judul
salin kode berikut ke dalam program Anda
void title() { //menulis judul ke LCD dan spasi untuk skor lcdRight.setCursor(0, 0); lcdRight.write("Ubin Piano"); lcdRight.setCursor(0, 1); lcdRight.write("Nilai: "); //mengubah skor menjadi string char strScore[3]; sprintf(strScore, "%d", intScore); //menampilkan skor ke LCD lcdRight.write(strScore); //menambahkan lcdRight.setCursor(10, 1); if (intDiff == 0){ lcdRight.write("Mudah"); } if (intDiff == 1){ lcdRight.write("Sedang"); } if (intDiff == 2){ lcdRight.write("Sulit"); } //Tekan sedikit instruksi lcdLeft.setCursor(0, 0); lcdLeft.write("Tekan Enter"); lcdLeft.setCursor(0, 1); lcdLeft.write("untuk memulai!"); }
Kode ini menulis judul permainan dan skor ke LCD, ini dilakukan dengan memberi tahu LCD di mana harus mulai mengetik menggunakan LCD.setCursor dan kemudian menulis string di LCD.write.
Variabel baru juga dibuat di sini, strScore, digunakan untuk mengubah intScore menjadi tipe data string atau char menggunakan fungsi sprintf.
intDiff juga digunakan di sini, berdasarkan nilainya, ia mencetak opsi kesulitan yang berbeda.
Langkah 10: Fungsi ButtonsMenu
masukkan kode berikut ke dalam program Anda
void buttonMenu(){ // saat enter ditekan, mulailah permainan dan reset nilai skor if (intEnter == 1){ bolPlay = true; intSkor = 0; papan permainan(); drawBoard(); } // ketika tombol 3 ditekan, aktifkan opsi debug untuk mencetak board secara serial if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = benar; } else { Serial.println("Serial Board Dinonaktifkan"); bolSerialBoard = salah; } } //set kecepatan game ke tingkat kesulitan mudah if (intInput == 0){ Serial.print("Game diatur ke mudah ("); Serial.print(intGameSpeedEasy); Serial.println("ms percepatan)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } //set kecepatan game ke tingkat kesulitan sedang if (intInput == 1){ Serial.print("Game disetel ke medium ("); Serial.print(intGameSpeedMedium); Serial.println("ms acceleration)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } //set kecepatan game ke tingkat kesulitan yang sulit if (intInput == 2){ Serial.print("Game disetel ke hard ("); Serial.print(intGameSpeedHard); Serial.println("ms acceleration)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }
kode ini hanya dijalankan ketika bolPlay sama dengan false di void Loop
jika intEnter disetel ke 1 berarti tombol enter telah ditekan, jika ditekan program akan menyetel bolPlay ke true dan permainan dimulai.
Program kemudian membaca apa yang sama dengan intInput. jika sama dengan 0 tombol pertama dari kiri ditekan, naik ke kanan hingga 3. Jika intInput sama dengan 4 tidak ada tombol yang ditekan.
jika tombol 0-2 ditekan permainan mengubah kesulitan, juga menyesuaikan nilai kecepatan permainan, artinya akan berakselerasi lebih cepat.
jika tombol 3 ditekan, permainan akan mengaktifkan atau menonaktifkan mode debug di mana seluruh papan dicetak di monitor serial untuk membantu menemukan masalah dalam program.
Langkah 11: Fungsi ButtonsGame
salin kode berikut ke dalam program Anda
void buttonGame(){ if (intInput != 4) { //jika tombol ditekan if (bolTilePressed == false){ //hanya jika bolTilePressed adalah tindakan pemicu salah untuk memeriksa tombol tekan bolTilePressed = true; //lalu setel bolTilePressed ke true untuk memastikan itu tidak dipicu lagi secara tidak sengaja int intLowestTile = 0; //untuk disetel ke ubin dengan ubin terendah int intCheckedTile = 15; //untuk melacak ubin mana yang telah diperiksa sementara (intLowestTile == 0) { //selama tidak disetel ke apa pun, periksa ubin untuk (int i = 0; i 100){ //selama int penundaan tidak lebih rendah dari 100 intDelay = intDelay - 20; //ambil nilai darinya } } else { Serial.println("Tekan tombol salah"); tamat(); //jika tidak, permainan berakhir } } } } }
Kode hanya dijalankan ketika bolPlay sama dengan true di void Loop.
Seperti buttonMenu berdasarkan nilai intInput, ia memeriksa untuk melihat apakah pemain telah memukul ubin atau melewatkannya.
Ini dilakukan dengan melewati arrGame dari bawah ke atas menggunakan loop sementara untuk mencari baris mana yang terendah dengan ubin yang tidak terkena. Itu kemudian memeriksa untuk melihat apakah tempat di baris yang sesuai dengan tombol yang ditekan adalah ubin yang tidak terkena atau tidak, jika tidak dipukul, set itu sama dengan 2, bukan 1, artinya akan ditampilkan sebagai @, jika tidak maka akan memicu gameOver fungsi yang belum kita buat.
Fungsi ini juga memanfaatkan variabel bolTilePressed dengan menyetelnya ke true saat tombol ditekan dan false saat tidak ada tombol yang ditekan. Ini untuk memastikan pengguna tidak kehilangan permainan secara tidak sengaja karena program mengira mereka menekan tombol beberapa kali ketika mereka menahannya.
Langkah 12: Fungsi GameOver
Salin kode berikut ke dalam program Anda
void gameOver() { Serial.println("Permainan Berakhir!"); Serial.print("Skor Anda adalah: "); Serial.println(intScore); Serial.print("Kecepatan Anda adalah: "); Serial.println(intDelay); bolPlay = salah; }
Ini dipicu oleh fungsi checkBottom atau tombolGame dan memicu akhir permainan dengan menyetel bolPlay ke false.
Itu juga mencetak pesan ke monitor serial untuk skor pengguna dan ubin kecepatan ditambahkan dalam milidetik.
Langkah 13: Fungsi Input
Salin kode berikut ke dalam program Anda.
void input() { intEnter = digitalRead(btnEnter); //read enter //baca input lainnya yang mana, atau jika tidak ada yang disetel ke 4 if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead(btn2) == HIGH){intInput = 1;} else { if (digitalRead(btn3) == HIGH){intInput = 2;} else { if (digitalRead(btn4) == HIGH){intInput = 3;} else { intInput = 4; }}}} //serial print input if (intEnter == 1){Serial.println("Enter Pressed! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println(intInput); } else { //jika tidak ada tombol yang ditekan reset bolTilePressed bolTilePressed = false; } }
Kode ini digunakan dengan fungsi tombolGame dan tombolMenu. berdasarkan tombol yang telah ditekan pengguna, ia menetapkan nilai intInput, atau jika tidak ada tombol yang ditekan, ia menyetel intInput menjadi 4.
Jika tidak ada tombol yang ditekan, di sinilah bolTilePressed diatur ulang untuk fungsi tombolGame.
Itu juga mencetak pesan ke monitor serial di mana tombol ditekan.
Langkah 14: Fungsi BottomCheck
salin kode berikut ke program Anda.
void bottomCheck() { for (int i = 0; i <= 3; i++){ //untuk 4 kolom if (arrGame[15] == 1){ //jika sebuah ubin berada di bagian bawah Serial.println("Ubin di bagian bawah"); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); tamat(); } } }
menggunakan loop kode ini memeriksa baris bawah arrGame untuk setiap ubin yang tidak terkena (ubin sama dengan 1), jika ada ubin yang tidak terkena di bagian bawah layar itu akan mem-flash ubin dan kemudian memicu fungsi game over.
Langkah 15: Fungsi WriteSerial
salin kode berikut ke dalam program Anda
void writeSerial() { if (bolSerialBoard == true){ for (int i = 0; i <= 15; i ++){ for (int ii = 0; ii <= 3; ii++){ Serial.print(arrGame [aku aku aku]); Serial.print(", "); } Serial.println(""); } } }
Ini adalah fungsi yang diikuti oleh opsi debug yang dapat diaktifkan di fungsi ButtonsMenu. Jika bolSerialBoard disetel ke true dalam fungsi itu, ia akan melalui arrGame dan mencetak seluruh papan ke monitor serial untuk tujuan pengujian dengan menggunakan array.
Langkah 16: Selesai
Semua kode Anda tidak boleh lengkap dan terlihat seperti ini!
/* * Nama - Ubin Piano; Arduino * Oleh - Domenic Marulli * Tanggal - 11/*
/ sertakan perpustakaan
#termasuk
//variabel ini adalah opsi yang dapat Anda ubah - angka yang lebih tinggi = kecepatan permainan yang lebih cepat
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Tentukan pin
#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// membuat objek LCD (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft(8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight(2, 3, 4, 5, 6, 7);
// mengatur susunan permainan
int arrGame[16][4] = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} };
//mengatur variabel untuk permainan
boolean bolPlay; //melacak jika pemain int intScore; //melacak skor pemain int intDiff; //hanya hal estetis untuk menceritakan kesulitan permainan ini
//set up variabel untuk input
int masuk; //melacak jika pengguna menekan tombol enter int intInput; //melacak tombol mana yang ditekan pengguna boolean bolTilePressed; //pastikan pemain tidak menekan tombol 5x secara tidak sengaja dan kalah
//set up variabel untuk turn
int intTik; //menghitung miliy (per loop) hingga intDelay int intDelay; //waktu program menunggu hingga giliran berikutnya dalam milis int intGameSpeed;
// sedikit opsi debug
boolean bolSerialBoard; //ketika benar akan mencetak papan di monitor serial
//setup yang akan dijalankan sekali
void setup() { Serial.begin(9600); //mulai serial monitor //set up variabel bolPlay = false; intSkor = 0; intTik = 0; intTunda = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; //mulai lcd's lcdLeft.begin(16, 2); lcdRight.begin(16, 2); }
//loop yang akan dijalankan setiap 10 milidetik
void loop() { masukan(); //periksa input pemutaran if (bolPlay == true){ if (intTick >= intDelay){ //periksa untuk melihat apakah game harus memutar atau terus menunggu Serial.println("~~~~~~~~ ~~");//print untuk menandakan papan bergerak //writeSerial(); //jika opsi diaktifkan, tulis papan menjadi tombol serialGame(); //memeriksa input pemain playBoard(); //pindahkan papan dan tambahkan ubin baru clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke bagian bawah lcdCheck(); intTik = 0; //reset intTick } else { keysGame(); //periksa input pemain clearLcd(); //bersihkan LCD sebelum menggambar drawBoard(); //gambar papan ke lcd intTick = intTick + intGameSpeed; //tambahkan ke centang } } else { clearLcd(); //bersihkan LCD sebelum menggambar judul(); //tampilkan tombol info judul dan skorMenu(); //baca input pemain clearBoard(); //pastikan seluruh papan = 0 } delay(10); //tunda arduino sebentar }
//membersihkan lcd, jadi sel yang tidak masuk tidak akan tertinggal di sana
void clearLcd() { for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 1; ii++){ lcdLeft.setCursor(i, ii); lcdLeft.write(" "); lcdRight.setCursor(i, ii); lcdRight.write(" "); } } }
//menarik papan ke lcd
void drawBoard() { for (int i = 1; i <= 15; i++){ //gambar kolom 1 dan 2 di sebelah kiri LCD //jika ubin = 0 tulis apa-apa, = 1 tulis "#", = 2 tulis "@" lcdLeft.setCursor(i, 1); //set ke kolom pertama (paling kiri) if (arrGame[0] == 1) {lcdLeft.write("#");} if (arrGame[0] == 2) {lcdLeft.write("@");} lcdLeft.setCursor(i, 0); //set ke kolom kedua (kiri tengah) if (arrGame[1] == 1) {lcdLeft.write("#");} if (arrGame[1] == 2) {lcdLeft.write("@");} lcdRight.setCursor(i, 1); //set ke kolom ketiga (kanan tengah) if (arrGame[2] == 1) {lcdRight.write("#");} if (arrGame[2] == 2) {lcdRight.write("@");} lcdRight.setCursor(i, 0); //set ke kolom keempat (paling kanan) if (arrGame[3] == 1) {lcdRight.write("#");} if (arrGame[3] == 2) {lcdRight.menulis("@");} } }
//memindahkan papan ke bawah dan menempatkan nilai acak menjadi ubin
void playBoard() { for (int i = 0; i <= 3; i++){arrGame[0] = 0;} //hapus baris atas arrGame[0][random(0, 4)] = 1; //menetapkan titik acak di baris atas menjadi ubin untuk (int i = 15; i>= 1; i--){ //bekerja dari bawah papan ke atas untuk (int ii = 0; ii <= 3; ii ++){ //untuk setiap kolom arrGame[ii] = arrGame[i - 1][ii]; } } }
//set seluruh board ke 0 dan reset variabel ke pregame
void clearBoard() { //setel ulang nilai centang dan tunda intTick = 0; intTunda = 1000; //menelusuri papan dan mengatur semuanya ke 0 for (int i = 0; i <= 15; i++){ for (int ii = 0; ii <= 3; ii++){ arrGame[ii] = 0; } } }
// menampilkan Menu Utama pada LCD
void title() { //menulis judul ke LCD dan spasi untuk skor lcdRight.setCursor(0, 0); lcdRight.write("Ubin Piano"); lcdRight.setCursor(0, 1); lcdRight.write("Nilai: "); //mengubah skor menjadi string char strScore[3]; sprintf(strScore, "%d", intScore); //menampilkan skor ke LCD lcdRight.write(strScore); //menambahkan lcdRight.setCursor(10, 1); if (intDiff == 0){ lcdRight.write("Mudah"); } if (intDiff == 1){ lcdRight.write("Sedang"); } if (intDiff == 2){ lcdRight.write("Sulit"); } //Tekan sedikit instruksi lcdLeft.setCursor(0, 0); lcdLeft.write("Tekan Enter"); lcdLeft.setCursor(0, 1); lcdLeft.write("untuk memulai!"); }
// memeriksa tombol dan apa yang harus dilakukan saat keluar dari permainan
void buttonMenu(){ // saat enter ditekan, mulailah permainan dan reset nilai skor if (intEnter == 1){ bolPlay = true; intSkor = 0; papan permainan(); drawBoard(); } // ketika tombol 3 ditekan, aktifkan opsi debug untuk mencetak board secara serial if (intInput == 3){ if (bolSerialBoard == false){ Serial.println("Serial Board Active"); bolSerialBoard = benar; } else { Serial.println("Serial Board Dinonaktifkan"); bolSerialBoard = salah; } } //set kecepatan game ke tingkat kesulitan mudah if (intInput == 0){ Serial.print("Game diatur ke mudah ("); Serial.print(intGameSpeedEasy); Serial.println("ms percepatan)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } //set kecepatan game ke tingkat kesulitan sedang if (intInput == 1){ Serial.print("Game disetel ke medium ("); Serial.print(intGameSpeedMedium); Serial.println("ms acceleration)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } //set kecepatan game ke tingkat kesulitan yang sulit if (intInput == 2){ Serial.print("Game disetel ke hard ("); Serial.print(intGameSpeedHard); Serial.println("ms acceleration)"); intDiff = 2; intGameSpeed = intGameSpeedHard; } }
// memeriksa tombol dan apa yang harus dilakukan untuk itu saat dalam game
void buttonGame(){ if (intInput != 4) { //jika tombol ditekan if (bolTilePressed == false){ //hanya jika bolTilePressed adalah tindakan pemicu salah untuk memeriksa tombol tekan bolTilePressed = true; //lalu setel bolTilePressed ke true untuk memastikan itu tidak dipicu lagi secara tidak sengaja int intLowestTile = 0; //untuk disetel ke ubin dengan ubin terendah int intCheckedTile = 15; //untuk melacak ubin mana yang telah diperiksa sementara (intLowestTile == 0) { //selama tidak disetel ke apa pun, periksa ubin untuk (int i = 0; i 100){ //selama int penundaan tidak lebih rendah dari 100 intDelay = intDelay - 20; //ambil nilai darinya } } else { Serial.println("Tekan tombol salah"); tamat(); //jika tidak, permainan berakhir } } } } }
batalkan gameOver() {
Serial.println("Permainan Selesai!"); Serial.print("Skor Anda adalah: "); Serial.println(intScore); Serial.print("Kecepatan Anda adalah: "); Serial.println(intDelay); bolPlay = salah; }
// memeriksa input pemain
void input() { intEnter = digitalRead(btnEnter); //read enter //baca input lainnya yang mana, atau jika tidak ada yang disetel ke 4 if (digitalRead(btn1) == HIGH){intInput = 0;} else { if (digitalRead(btn2) == HIGH){intInput = 1;} else { if (digitalRead(btn3) == HIGH){intInput = 2;} else { if (digitalRead(btn4) == HIGH){intInput = 3;} else { intInput = 4; }}}} //serial print input if (intEnter == 1){Serial.println("Enter Pressed! ");} if (intInput != 4){ Serial.print("Button Press: "); Serial.println(intInput); } else { //jika tidak ada tombol yang ditekan reset bolTilePressed bolTilePressed = false; } }
//memeriksa bagian bawah papan untuk kegagalan
void bottomCheck() { for (int i = 0; i <= 3; i++){ //untuk 4 kolom if (arrGame[15] == 1){ //jika sebuah ubin berada di bagian bawah Serial.println("Ubin di bagian bawah"); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); arrGame[15] = 2; drawBoard(); penundaan (400); arrGame[15] = 1; drawBoard(); penundaan (400); tamat(); } } }
//mencetak board ke serial monitor jika bolSerialBoard benar
void writeSerial() { if (bolSerialBoard == true){ for (int i = 0; i <= 15; i ++){ for (int ii = 0; ii <= 3; ii++){ Serial.print(arrGame [aku aku aku]); Serial.print(", "); } Serial.println(""); } } }
Setelah semua kode dimasukkan, unggah ke arduino Anda dan nikmatilah!
Direkomendasikan:
Air Piano Menggunakan Sensor Proximity IR dan Arduino Uno Atmega 328: 6 Langkah (Dengan Gambar)
Piano Udara Menggunakan Sensor Kedekatan IR dan Arduino Uno Atmega 328: Biasanya Piano baik itu listrik atau mekanik bekerja pada mekanisme sederhana menekan tombol. Tapi di sini ada twist, kita bisa menghilangkan kebutuhan kunci di piano dengan menggunakan beberapa sensor. Dan sensor Proximity Infra-merah paling sesuai dengan penyebabnya karena t
Belajar Kunci Piano Dengan Makey Makey: 6 Langkah (dengan Gambar)
Learn Piano Keys With Makey Makey: Saya membuat ini untuk malam Instuctables di The Maker Station. Game ini membantu Anda mempelajari letak not pada keyboard piano melalui permainan. Kelompok kami diundang untuk menjadi bagian dari Paviliun Stasiun Pembuat di sebuah pameran pendidikan. Saat berbicara dengan educa
Piano Buah Cepat Dengan MIDI: 6 Langkah (dengan Gambar)
Piano Buah Cepat Dengan MIDI: Ini adalah piano sentuh kapasitif yang sangat sederhana. Ketuk buah, kaleng soda, botol air, potongan aluminium foil, dll., dan Anda mendapatkan musik piano polifonik dari komputer Anda. Sekarang setelah perangkat lunak ditulis, proyek seharusnya tidak memakan waktu lebih
Modul Keypad Piano Dengan LED RGB: 5 Langkah (dengan Gambar)
Modul Keypad Piano Dengan LED RGB: IntroHalo para hadirin, selamat datang di instruksi pertama saya! Hari ini, saya akan mengajari Anda cara membuat piano dengan komponen utama modul keypad dan buzzer piezo dan membuatnya bisa memainkan DO-RE-MI dan sebagainya. Modul keypad m
Piano Ultrasonic Pi Dengan Kontrol Gerakan!: 10 Langkah (dengan Gambar)
Ultrasonic Pi Piano With Gesture Controls!: Proyek ini menggunakan sensor ultrasonik HC-SR04 yang murah sebagai input dan menghasilkan not MIDI yang dapat dimainkan melalui synthesizer pada Raspberry Pi untuk suara berkualitas tinggi. Proyek ini juga menggunakan bentuk dasar dari kontrol gerakan , dimana musiknya