Mundarija:
- 1 -qadam: simlarni ulash
- 2 -qadam: Deklaratsiya bayonotlari
- 3 -qadam: O'rnatish funktsiyasi
- 4 -qadam: Loop funktsiyasi
- 5 -qadam: ClearLCD funktsiyasi
- 6 -qadam: DrawBoard funktsiyasi
- 7 -qadam: PlayBoard funktsiyasi
- 8 -qadam: ClearBoard funktsiyasi
- 9 -qadam: Sarlavha funktsiyasi
- 10 -qadam: ButtonsMenu funktsiyasi
- 11 -qadam: ButtonsGame funktsiyasi
- 12 -qadam: GameOver funktsiyasi
- 13 -qadam: kirish funktsiyasi
- 14 -qadam: BottomCheck funktsiyasi
- 15 -qadam: WriteSerial funktsiyasi
- 16 -qadam: tugatish
Video: Arduino - pianino plitalari: 16 qadam (rasmlar bilan)
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:26
Assalomu alaykum, internet odamlari, bu arduino uno r3 -dagi mobil o'yinni qanday qilib aniq qilib olib tashlash mumkinligi haqida.
Boshlash uchun sizga quyidagi qismlar kerak bo'ladi! 1x Arduino Uno r3 (42 dollar)
2x LCD klaviatura qalqoni (har biri 19 dollar)
5x tugmalar
5x 220Ω qarshilik
28x simlar
Yaxshi, hamma qismlar tayyor bo'lgach, boshlash vaqti keldi!
1 -qadam: simlarni ulash
Diagrammada ko'rsatilgandek, arduino va do'stlaringizni ulashdan boshlang.
Tugmalar to'g'ri yo'nalishda bog'langanligiga ishonch hosil qiling, A0-4 tugmachalari relslarning pastki tomonida, yoki arduino tugmachalarni faqat bosish o'rniga doimiy ushlab turiladi deb o'ylaydi.
2 -qadam: Deklaratsiya bayonotlari
Bu erdagi barcha kodlar sizning bo'sh sozlamangiz va bo'shligingizdan oldin bo'lishi kerak, chunki bu o'zgaruvchilar va ob'ektlarning barchasi biz o'rnatadigan bir qancha funktsiyalarda ishlatiladi.
Quyidagilarni qo'yishdan boshlang:
#qo'shing
Sizning kodingizning yuqori qismida, bu arduino -ga "LiquidCrystal.h" kutubxonasidan va uning bir qismi bo'lgan funktsiyalardan foydalanishni aytadi.
Keyingi qadam, bu kodni #include ostiga qo'yish orqali tugmalarimiz uchun ishlatadigan pinlarni aniqlash:
#tashrif btnA0 kiriting #btn1 aniqlang 15 #btn2 aniqlang 16 #btn3 aniqlang 17 #btn4 aniqlang 18
Kodni o'qishni osonlashtirish yoki kerak bo'lganda o'zgartirish uchun btnEnter va btn1 dan btn 4 gacha bo'lgan shartlarni belgilaymiz. Bu shuni anglatadiki, btn1 yozilganda, arduino biz 15 -tugmani anglatishini bilib oladi, garchi biz portlarni 15, 16, 17 va 18 deb atasak ham, ular arduino -da A1 A2 A3 va A4 deb yozilgan. ular analog kirish uchun maxsus ishlatiladigan portlar, lekin biz ularni faqat raqamli kirish uchun ishlatamiz.
Keyin biz suyuq kristalli displeylarni boshqaradigan moslamalarni yaratmoqchimiz. Buning uchun ushbu kodni ta'riflarimiz ostiga qo'ying
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
Bu nima qilayotgani arduinoga lcdLeft yoki lcdRight -ga qo'ng'iroq qilganimizda biz LiquidCrystal ob'ektiga ishora qilayotganimizni aytadi. Qavslar ichidagi raqamlar arduinoga biz ularning vazifalarini ishlatganda LCD displeyga xabar yuborish uchun qaysi portlardan foydalanishi kerakligini aytadi.
Endi biz ob'ekt deklaratsiyalari ostiga kodning keyingi bitini qo'yish orqali o'zgaruvchilarni e'lon qilishimiz kerak:
// bu o'zgaruvchilar - siz o'zgartirishingiz mumkin bo'lgan variantlar - yuqori raqamlar = intGameSpeedEasy = 10 tez o'yin tezligi; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// gameboolean bolPlay uchun o'zgaruvchilarni o'rnatish; // int intScore o'yinchi bo'lsa, izlar; // o'yinchining int intiff reytingini kuzatadi; // o'yinning qanday qiyinligini aytish uchun estetik narsa // int intEnter kiritish uchun o'zgaruvchilarni sozlash; // foydalanuvchi int intInput kiritish tugmasini bosganligini kuzatadi; // foydalanuvchining boolean bolTilePressed tugmachalarini bosishini izlar; // o'yinchi tasodifan 5x tugmachani bosmasligiga ishonch hosil qiling // int intTickni aylantirish uchun o'zgaruvchilarni o'rnating; // intDelay int intDelay bo'lgunga qadar millimetrni hisoblaydi (bir tsikl uchun); // dastur millis int intGameSpeed -da keyingi burilishni kutadigan vaqt; // abit disk raskadrovka variantlari boolean bolSerialBoard; // qachon taxtani ketma -ket monitorda chop etadi
Ma'lumot turini, so'ngra o'zgaruvchining nomini aytib, o'zgaruvchini e'lon qilamiz. int thisIsAnInteger
BolSerialBoard va bolPlay kabi mantiqiy o'zgaruvchilar faqat ikkita qiymatdan biriga ega bo'lishi mumkin: haqiqiy yoki noto'g'ri.
IntScore va intInput kabi butun sonlar o'zgaruvchisi (int) 1, 5 yoki 100 kabi butun sonlarni qiymat sifatida qabul qilishi mumkin.
Biz foydalanmaydigan ba'zi boshqa ma'lumot turlari - bu matn qismi bo'lgan satr va o'nlik raqamli float.
Bu erda o'zgaruvchilarning har biri dastur tomonidan har xil joylarda ishlatiladi, bu erda ularning har biri nima qilayotgani haqida qisqacha ma'lumot
bolPlay dasturga menyu ko'rsatilishi yoki haqiqiy o'yin ishlayotganligini aytadi.
intScore o'yinchining plitkalarga urgan vaqtidagi natijalarini kuzatib boradi, intDiff asosiy menyuda dasturga LCD displeyda qanday matnni chop etish kerakligini aytib berish uchun ishlatiladi.
intEnter dasturga kirish tugmasi (eng chapda) bosilganda xabar berish uchun ishlatiladi, intInput dasturga qolgan 4 tugmachaning qaysi biri bosilganligini aytib berish uchun ishlatiladi.
bolTilePressed dastur faqat tugma bosilganda o'qiladi va ushlab turilmaydi.
intGameSpeed, intGameSpeedEasy, intGameSpeedMedium va intGameSpeedHard o'yin qaysi tezlik tanlanganiga qarab tezlashishini nazorat qilish uchun ishlatiladi.
intTick va intDelay dastur har safar aylanayotganda, taxtaning harakatlanishini to'xtatish uchun ishlatiladi.
bolSerialBoard - bu dasturni sinov maqsadlari uchun taxtani arduino seriyali monitoriga bir qator raqamlar sifatida yuborishga imkon berish uchun ishlatiladi.
Nihoyat, bizning taxtamizni ushbu kod yordamida massiv sifatida e'lon qilish vaqti keldi:
// arrayint arrGame o'yinini sozlash [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}};
Massiv - bu matritsadir, uni istalgan nuqtani matematikaga chaqirish yoki o'zgartirish mumkin.
Sizning kodingiz endi shunday bo'lishi kerak;
// kutubxonalarni o'z ichiga oladi#o'z ichiga oladi
// bu o'zgaruvchilar siz o'zgartirishingiz mumkin bo'lgan variantlar - yuqori raqamlar = tezroq o'yin tezligi
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Pimlarni aniqlang
A0 kiriting
// LCD obyektlarini yaratish (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// o'yinlar qatorini o'rnatish
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}};
// o'yin uchun o'zgaruvchilarni o'rnating
boolean bolPlay; // int intScore o'yinchi bo'lsa, izlar; // o'yinchining int intiff reytingini kuzatadi; // o'yin qanday qiyinchilikda ekanligini aytish uchun estetik narsa
// kiritish uchun o'zgaruvchilarni o'rnating
int intEnter; // foydalanuvchi int intInput kiritish tugmasini bosganligini kuzatadi; // foydalanuvchining boolean bolTilePressed tugmachalarini bosishini izlar; // o'yinchi tasodifan 5x tugmachasini bosmasligiga ishonch hosil qiling
// burilish uchun o'zgaruvchilarni o'rnating
int intTick; // intDelay int intDelay bo'lmaguncha millimetrni (bir tsikl uchun) hisoblaydi; // dastur millis int intGameSpeed -da keyingi burilishni kutadigan vaqt;
// disk raskadrovka variantlari
boolean bolSerialBoard; // qachon taxtani ketma -ket monitorda chop etadi
3 -qadam: O'rnatish funktsiyasi
O'rnatish tsikli - bu arduino tomonidan boshlanganda faqat bir marta o'qiladigan funksiya.
O'rnatish tsiklida biz bir nechta o'zgaruvchilarning qiymatlarini belgilaymiz, chunki ularni e'lon qilishda qiymatni qo'yish o'rniga biz buni bu erda qilamiz.
Ushbu kodni Void Setup -ga kiritishni boshlang.
bolPlay = noto'g'ri; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;
Har bir satr shunchaki o'zgaruvchini qiymatga o'rnatadi.
O'yin o'ynashni boshlamaslik uchun bolPlay "false" ga o'rnatiladi.
intScore 0 ga o'rnatilgan, chunki tabiiyki sizning balingiz 0 dan boshlanadi.
intTick 0 dan boshlanadi, chunki dastur hozircha hech narsani hisoblamaydi.
intDelay 1000 ga o'rnatiladi, chunki plitkalar shu tezlikda boshlanadi.
intDiff - bu oddiy narsa, shuning uchun dastur o'yin qiyinligi uchun nima yozishni biladi.
intGameSpeed intGameSpeedMedium nima bo'lishidan qat'i nazar o'rnatiladi, ya'ni u o'rtacha qiyinchilik darajasida o'rnatiladi.
Keyin bu kodni siz kiritgan kod ostidagi Void Setup -ga qo'ying.
lcdLeft.begin (16, 2); lcdRight.begin (16, 2);
Serial.begin (9600);
Bu arduino -ga ketma -ket monitor orqali kompyuter bilan muloqot qilishni boshlashini aytadi (arduino IDE -ning yuqori o'ng burchagidagi tugmani bosish orqali ko'rinadi).
Sizning bo'sh joy sozlamangiz endi shunga o'xshash bo'lishi kerak!
void setup () {Serial.begin (9600); // ketma -ket monitorni ishga tushiring // o'zgaruvchilarni o'rnating bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd's lcdLeft.begin boshlang (16, 2); lcdRight.begin (16, 2); }
4 -qadam: Loop funktsiyasi
Loop funktsiyasi arduino tomonidan har bir iteratsiya tomonidan boshqariladi.
Quyidagi kodni Void Loop -ga nusxalash.
void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// o'yinning burilish yoki yo'qligini tekshirish uchun Serial.println ("~~~~~~~ ~~ "); // taxtada harakatlanishini bildirish uchun chop etish // writeSerial (); // agar parametr yoqilgan bo'lsa, taxtani ketma -ket tugmalarga yozingGame (); // pleer kirishini tekshirish playBoard (); // taxtani siljiting va yangi plitka qo'shing clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd tubiga tortingCheck (); intTick = 0; // reset intTick} else {{buttonGame (); // pleer kirishini tekshiring clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd's intTick = intTick + intGameSpeed -ga torting; // belgilashga qo'shish}} else {clearLcd (); // sarlavha chizishdan oldin LCD displeylarni tozalang (); // sarlavha va ballar haqida ma'lumot tugmachalarini ko'rsatishMenu (); // pleer kirishini o'qish clearBoard (); // butun taxtani ta'minlash = 0} kechikish (10); // arduinoni qisqa vaqtga kechiktiring}
qachon bolPlay haqiqatga teng bo'lsa, demak, o'yin o'ynayapti va o'yin vaqtidagi barcha kodlar ishga tushirilishi kerak, lekin biz faqat intTick bizning intDelaydan kattaroq bo'lganda, taxtaga yangi plitka qo'shib, pastga tushishini xohlaymiz, aks holda biz hali ham foydalanuvchiga tugmachani bosish va intTick tezligini oshirishga ruxsat berishni xohlaymiz.
Ushbu kodning aksariyati biz hali bajarmaydigan funktsiyalarni ishlatadi va biz ularni keyingi bosqichlarda bajaramiz. Bu funktsiyalarning maqsadi quyidagicha.
Kirish foydalanuvchi qaysi tugmachalarni bosganini o'qiydi.
buttonGame menyuda emas, o'yin paytida tugmalar nima qilishini boshqaradi
playBoard taxtaga yangi plitka qo'shadi va keyin taxtadagi hamma narsani bitta bo'shliqqa siljitadi
clearLCD LCD -larni tozalaydi, shunda plitkalar ortida hech qanday arvoh qolmaydi
drawBoard arrGame orqali o'tadi va uni LCD displeyda chop etadi
clearBoard o'yin o'tkazilmaganda arrGame -ni tozalaydi
bottomCheck, arrGame ning pastki qismini muvaffaqiyatsizlikka uchragan holatini tekshiradi
sarlavha o'yin menyusida o'yin sarlavhasi va ballar haqidagi ma'lumotlarni ko'rsatadi
tugmachalari menyusi foydalanuvchining kiritgan menyusida nima qilishini boshqaradi.
gameOver - bu boshqa funktsiya, lekin bu erda chaqirilmagan, lekin pastki qismda chaqirilganidek Chex va tugmalar O'yin funktsiyalari.
5 -qadam: ClearLCD funktsiyasi
funktsiyani yaratish uchun biz buni kodga qo'shish bilan boshlaymiz
void functionName () {
}
"functionName" har qanday bo'lishi mumkin, agar u mavjud bo'lmasa.
Ushbu kodni dasturingizga nusxalash:
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 (""); }}}
LCD displeylaridagi har bir nuqtadan o'tish va bo'sh joy yozish uchun bu 2 ta hisoblangan ko'chadan foydalanib, butun qator bo'ylab o'tadi.
Hech narsaga qaytarilmasdan, LCD displeylari avval yozilgan narsalarni saqlaydi
6 -qadam: DrawBoard funktsiyasi
ushbu kodni dasturingizga nusxalash
void drawBoard () {for (int i = 1; i <= 15; i ++) {// chap LCD displeyda 1 va 2 raqamlarni chizish // agar plitka = 0 hech narsa yozmasa, = 1 "#" yozsa, = 2 "@" lcdLeft.setCursor (i, 1) yozing; // agar birinchi qatorga o'rnatilgan bo'lsa (eng chapda) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // ikkinchi qatorga (markazda chapda), agar (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // uchinchi qatorga o'rnatiladi (o'ngda), agar (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // to'rtinchi ustunni o'rnating (eng o'ngda) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.yozish ("@");}}}
Bu doskaning har bir satridan o'tish uchun pastadirdan foydalanadi, so'ngra satrdagi ustunlar 1 yoki 2 ga tengligini tekshiradi, shundan so'ng LCD displeyda xashtag bosiladi. urish, yoki urilgan kafel uchun @.
7 -qadam: PlayBoard funktsiyasi
ushbu kodni dasturingizga nusxalash.
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // yuqori qatorni tozalash arrGame [0] [tasodifiy (0, 4)] = 1; // yuqori satrda tasodifiy nuqtani (int i = 15; i> = 1; i-) {// uchun taxtaning pastidan tepasiga (int ii = 0; ii <= 3; ii ++) {// har bir collum arrGame uchun [ii] = arrGame [i - 1] [ii]; }}}
bu kod butun yuqori qatorni 0 yoki kafelsiz qilib tozalashdan boshlanadi, so'ngra bitta tasodifiy plitani 1 va ko'rinmas katakka o'rnatadi.
Keyin teskari hisoblangan tsikldan o'tadi, 15 dan 1 gacha, satrni yuqoridagi satrga teng bo'ladigan qilib o'rnatadi, bu esa taxtani LCD displeyidan pastga siljitadi.
8 -qadam: ClearBoard funktsiyasi
ushbu kodni dasturingizga nusxalash.
void clearBoard () {// belgilashni tiklash va qiymatlarni kechiktirish intTick = 0; intDelay = 1000; // doskadan o'ting va hamma narsani 0 ga qo'ying (int i = 0; i <= 15; i ++) {uchun (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
Bu kod, o'yin o'tkazilmaganda, arrGame -ning 0 ga o'rnatilganligiga ishonch hosil qilish uchun yoki hech qanday kafel yo'q, qatordan o'tish uchun hisoblangan tsikllar yordamida bajariladi.
Kod shuningdek intDelay va intTick qiymatlarini tiklaydi.
9 -qadam: Sarlavha funktsiyasi
quyidagi kodni dasturingizga nusxa ko'chiring
void title () {// sarlavhani LCD -ga yozish va lcdRight.setCursor uchun bo'sh joy (0, 0); lcdRight.write ("Pianino plitalari"); lcdRight.setCursor (0, 1); lcdRight.write ("Hisob:"); // balni string strScore ga aylantirish strScore [3]; sprintf (strScore, "%d", intScore); // ballarni LCD lcdRight.write (strScore) da ko'rsatish; // diffictuly lcdRight.setCursor qo'shing (10, 1); agar (intDiff == 0) {lcdRight.write ("Oson"); } agar (intDiff == 1) {lcdRight.write ("O'rta"); } agar (intDiff == 2) {lcdRight.write ("Qattiq"); } // lcdLeft.setCursor (0, 0) ko'rsatmasini biroz bosing; lcdLeft.write ("Enter tugmasini bosing"); lcdLeft.setCursor (0, 1); lcdLeft.write ("boshlash uchun!"); }
Bu kod o'yin nomini va hisobni LCD displeylarga yozib qo'yadi, buni LCD -ga LCD.setCursor yordamida yozishni qaerdan boshlash kerakligini aytib, keyin LCD.write -ga yozish orqali amalga oshiradi.
Bu erda strScore yangi o'zgaruvchisi ham yaratiladi, u intScore -ni sprintf funktsiyasidan foydalanib mag'lubiyatga yoki ma'lumotlar turiga aylantirish uchun ishlatiladi.
intDiff bu erda ham ishlatiladi, uning qiymatlariga asoslanib, u turli xil qiyinchilik variantlarini chop etadi.
10 -qadam: ButtonsMenu funktsiyasi
dasturingizga quyidagi kodni kiriting
void buttonMenu () {// Enter bosilganda o'yinni boshlang va agar (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 tugma bosilganda taxtani ketma -ket chop etishning disk raskadrovka variantini yoqing, agar (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = to'g'ri; } else {Serial.println ("Seriya taxtasi o'chirilgan"); bolSerialBoard = noto'g'ri; }} // o'yin tezligini osonlikcha qiyinchilik bilan belgilang, agar (intInput == 0) {Serial.print ("O'yin oson" ()); Serial.print (intGameSpeedEasy); Serial.println ("ms tezlashtirish)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // o'yin tezligini o'rtacha qiyinchilik darajasiga o'rnating, agar (intInput == 1) {Serial.print ("O'yin o'rta darajaga o'rnatilsa ("); Serial.print (intGameSpeedMedium); Serial.println ("ms tezlashtirish)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // o'yin tezligini qiyin qiyinchiliklarga o'rnating, agar (intInput == 2) {Serial.print ("O'yin qattiq" ("); Serial.print (intGameSpeedHard); Serial.println (" ms tezlashtirish) "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
bu kod faqat bolPlay bo'sh Loopda yolg'onga teng bo'lganda ishlaydi
agar intEnter 1 ga o'rnatilgan bo'lsa, bu kirish tugmasi bosilganligini anglatadi, agar u bosilsa, dastur bolPlay -ni rost qilib qo'yadi va o'yin boshlanadi.
Keyin dastur intInput nimaga tengligini o'qiydi. agar u 0 ga teng bo'lsa, chapdan birinchi tugma bosiladi, o'ngga 3 gacha ko'tariladi. Agar intInput 4 ga teng bo'lsa, hech qanday tugma bosilmaydi.
Agar 0-2 tugmachalari bosilsa, o'yin qiyinchilikni o'zgartiradi, shuningdek o'yin tezligi qiymatini o'zgartiradi, ya'ni u tezroq tezlashadi.
agar 3 -tugma bosilsa, o'yin disk raskadrovka rejimini faollashtiradi yoki o'chiradi, bunda dasturdagi muammolarni topishga yordam berish uchun butun taxta ketma -ket monitorda chop etiladi.
11 -qadam: ButtonsGame funktsiyasi
quyidagi kodni dasturingizga nusxa ko'chiring
void tugmalariGame () {if (intInput! = 4) {// agar tugma bosilsa if (bolTilePressed == false) {// agar bolTilePressed noto'g'ri bo'lsa, tugmani tekshirish uchun bolTilePressed = rost tugmasini bosing; // keyin yana tasodifan tetiklanmasligiga ishonch hosil qilish uchun bolTilePressed ni rost qilib qo'ying int intLowestTile = 0; // eng past plitkali plitaga o'rnatiladi int intCheckedTile = 15; // (intLowestTile == 0) {// hech narsa belgilanmagan bo'lsa, plitalar tekshirilganligini kuzatish uchun (int i = 0; i 100) {// kechikish 100 dan past emas intDelay = intDelay - 20; // undan qiymat oling}} else {Serial.println ("Noto'g'ri tugma bosildi"); O'yin tamom(); // aks holda o'yin tugadi}}}}}
Kod faqat bolPlay bo'sh Loop -da haqiqiyga teng bo'lganda ishlaydi.
Tugmalar menyusi kabi intInput qiymatiga asoslanib, o'yinchi plitka urganmi yoki yo'qmi, tekshiradi.
Buni arrGame orqali pastdan yuqoriga o'tish orqali, pastadir pastdagi chiziq qaysi satr eng past ekanligini ko'radi. Keyin tugma bosilgan mos keladigan satrdagi nuqta ko'rilmagan plitka yoki yo'qligini tekshiradi, agar ko'rsatilmagan bo'lsa, u 1 o'rniga 2 ga teng bo'ladi, ya'ni u @sifatida ko'rsatiladi, aks holda bu o'yinOverni ishga tushiradi. biz hali yaratmaydigan vazifa.
Bu funksiya bolTilePressed o'zgaruvchisini tugma bosilganda rost, tugma bosilmaganda esa yolg'on qilib o'rnatadi. Bu foydalanuvchining o'yinni tasodifan yo'qotmasligini ta'minlash uchun, chunki dastur tugmachani bosib turganda uni bir necha marta bosgan deb o'ylardi.
12 -qadam: GameOver funktsiyasi
Quyidagi kodni dasturingizga nusxa ko'chiring
void gameOver () {Serial.println ("O'yin tugadi!"); Serial.print ("Sizning balingiz:"); Serial.println (intScore); Serial.print ("Sizning tezligingiz:"); Serial.println (intDelay); bolPlay = noto'g'ri; }
Bu checkBottom yoki buttonGame funktsiyalari tomonidan chaqiriladi va bolPlay -ni noto'g'ri deb belgilash orqali o'yinning oxiriga olib keladi.
Shuningdek, u foydalanuvchilarning reytingi va milisaniyalarda tezlik plitalari qo'shilganligi haqidagi xabarni ketma -ket monitorga chiqaradi.
13 -qadam: kirish funktsiyasi
Quyidagi kodni dasturingizga nusxa ko'chiring.
void input () {intEnter = digitalRead (btnEnter); // o'qishni kiriting // boshqa kirishlar qaysi birini o'qiydi yoki hech kim 4 ga o'rnatilmagan bo'lsa (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} boshqa {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} boshqa {intInput = 4; }}}} // kirishni ketma -ket chop eting (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// agar biror tugma bosilmasa reset bolTilePressed bolTilePressed = false; }}
Bu kod tugmaGame va buttonMenu funktsiyalari bilan ishlatiladi. foydalanuvchi bosgan tugmalar asosida intInput qiymatini belgilaydi, yoki tugma bosilmasa intInput -ni 4 ga o'rnatadi.
Hech qanday tugma bosilmasa, bu erda bolTilePressed tugmalari O'yin funktsiyasi uchun qayta o'rnatiladi.
Bundan tashqari, ketma -ket monitorga qaysi tugma bosilganligi haqida xabar chop etiladi.
14 -qadam: BottomCheck funktsiyasi
quyidagi kodni dasturingizga nusxa ko'chiring.
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns uchun if (arrGame [15] == 1) {// agar plitka pastki qismda bo'lsa.println ("Plitka pastda"); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); O'yin tamom(); }}}
pastadir yordamida bu kod arrGame -ning pastki qatorini har qanday ko'rinmaydigan plitalar uchun tekshiradi (plitalar 1 ga teng), agar ekranning pastki qismida ko'rsatilmagan plitka bo'lsa, u plitkani yonib o'chiradi va keyin o'yin funktsiyasini ishga tushiradi.
15 -qadam: WriteSerial funktsiyasi
quyidagi kodni dasturingizga nusxa ko'chiring
void writeSerial () {if (bolSerialBoard == true) {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {Serial.print (arrGame) [ii]); Serial.print (","); } Serial.println (""); }}}
Bu tugmalar menyusida yoqilishi mumkin bo'lgan disk raskadrovka opsiyasi. Agar bolSerialBoard bu funktsiyani rost qilib qo'ygan bo'lsa, u arrGame orqali o'tadi va massiv yordamida tekshirish uchun butun taxtani ketma -ket monitorga chop etadi.
16 -qadam: tugatish
Sizning kodingiz to'liq bo'lmasligi va shunga o'xshash bo'lishi kerak!
/ * * Ism - pianino plitalari; Arduino * By - Domenik Marulli * Sana - 11/ *
/ kutubxonalarni o'z ichiga oladi
#qo'shing
// bu o'zgaruvchilar siz o'zgartirishingiz mumkin bo'lgan variantlar - yuqori raqamlar = tezroq o'yin tezligi
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Pimlarni aniqlang
A0 kiriting
// LCD obyektlarini yaratish (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// o'yinlar qatorini o'rnatish
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}};
// o'yin uchun o'zgaruvchilarni o'rnating
boolean bolPlay; // int intScore o'yinchi bo'lsa, izlar; // o'yinchining int intiff reytingini kuzatadi; // o'yin qanday qiyinchilikda ekanligini aytish uchun estetik narsa
// kiritish uchun o'zgaruvchilarni o'rnating
int intEnter; // foydalanuvchi int intInput kiritish tugmasini bosganligini kuzatadi; // foydalanuvchining boolean bolTilePressed tugmachalarini bosishini izlar; // o'yinchi tasodifan 5x tugmachasini bosmasligiga ishonch hosil qiling
// burilish uchun o'zgaruvchilarni o'rnating
int intTick; // intDelay int intDelay bo'lmaguncha millimetrni (bir tsikl uchun) hisoblaydi; // dastur millis int intGameSpeed -da keyingi burilishni kutadigan vaqt;
// disk raskadrovka variantlari
boolean bolSerialBoard; // qachon taxtani ketma -ket monitorda chop etadi
// bir marta ishlaydigan sozlamalar
void setup () {Serial.begin (9600); // ketma -ket monitorni ishga tushiring // o'zgaruvchilarni o'rnating bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // lcd's lcdLeft.begin boshlang (16, 2); lcdRight.begin (16, 2); }
// har 10 millisekundda bajariladigan tsikl
void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// o'yinning burilish yoki yo'qligini tekshirish uchun Serial.println ("~~~~~~~ ~~ "); // taxtada harakatlanishini bildirish uchun chop etish // writeSerial (); // agar parametr yoqilgan bo'lsa, taxtani ketma -ket tugmalarga yozingGame (); // pleer kirishini tekshirish playBoard (); // taxtani siljiting va yangi plitka qo'shing clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd tubiga tortingCheck (); intTick = 0; // reset intTick} else {{buttonGame (); // pleer kirishini tekshiring clearLcd (); // drawBoard () chizishdan oldin LCD displeylarni tozalang; // doskani lcd's intTick = intTick + intGameSpeed -ga torting; // belgilashga qo'shish}} else {clearLcd (); // sarlavha chizishdan oldin LCD displeylarni tozalang (); // sarlavha va ballar haqida ma'lumot tugmachalarini ko'rsatishMenu (); // pleer kirishini o'qish clearBoard (); // butun taxtani ta'minlash = 0} kechikish (10); // arduinoni qisqa vaqtga kechiktiring}
// LCD -ni tozalaydi, shuning uchun kiritilmagan hujayralar u erda qolmaydi
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 (""); }}}
// doskani lcd -ga tortadi
void drawBoard () {for (int i = 1; i <= 15; i ++) {// chap LCD displeyda 1 va 2 raqamlarni chizish // agar plitka = 0 hech narsa yozmasa, = 1 "#" yozsa, = 2 "@" lcdLeft.setCursor (i, 1) yozing; // agar birinchi qatorga o'rnatilgan bo'lsa (eng chapda) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // ikkinchi qatorga (markazda chapda), agar (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // uchinchi qatorga o'rnatiladi (o'ngda), agar (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // to'rtinchi ustunni o'rnating (eng o'ngda) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.yozish ("@");}}}
// taxtani pastga siljitadi va tasodifiy qiymatni plitka qilib qo'yadi
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // yuqori qatorni tozalash arrGame [0] [tasodifiy (0, 4)] = 1; // yuqori satrda tasodifiy nuqtani (int i = 15; i> = 1; i-) {// uchun taxtaning pastidan tepasiga (int ii = 0; ii <= 3; ii ++) {// har bir collum arrGame uchun [ii] = arrGame [i - 1] [ii]; }}}
// butun taxtani 0 ga o'rnatadi va o'zgaruvchilarni oldingi o'yinga qaytaradi
void clearBoard () {// belgilashni tiklash va qiymatlarni kechiktirish intTick = 0; intDelay = 1000; // doskadan o'ting va hamma narsani 0 ga qo'ying (int i = 0; i <= 15; i ++) {uchun (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
// LCD displeyda Bosh menyuni ko'rsatadi
void title () {// sarlavhani LCD -ga yozish va lcdRight.setCursor uchun bo'sh joy (0, 0); lcdRight.write ("Pianino plitalari"); lcdRight.setCursor (0, 1); lcdRight.write ("Hisob:"); // balni string strScore ga aylantirish strScore [3]; sprintf (strScore, "%d", intScore); // ballarni LCD lcdRight.write (strScore) da ko'rsatish; // diffictuly lcdRight.setCursor qo'shing (10, 1); agar (intDiff == 0) {lcdRight.write ("Oson"); } agar (intDiff == 1) {lcdRight.write ("O'rta"); } agar (intDiff == 2) {lcdRight.write ("Qattiq"); } // lcdLeft.setCursor (0, 0) ko'rsatmasini biroz bosing; lcdLeft.write ("Enter tugmasini bosing"); lcdLeft.setCursor (0, 1); lcdLeft.write ("boshlash uchun!"); }
// tugmalarni tekshiradi va o'yindan tashqarida ular uchun nima qilish kerak
void buttonMenu () {// Enter bosilganda o'yinni boshlang va agar (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 tugma bosilganda taxtani ketma -ket chop etishning disk raskadrovka variantini yoqing, agar (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = to'g'ri; } else {Serial.println ("Seriya taxtasi o'chirilgan"); bolSerialBoard = noto'g'ri; }} // o'yin tezligini osonlikcha qiyinchilik bilan belgilang, agar (intInput == 0) {Serial.print ("O'yin oson" ()); Serial.print (intGameSpeedEasy); Serial.println ("ms tezlashtirish)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // o'yin tezligini o'rtacha qiyinchilik darajasiga o'rnating, agar (intInput == 1) {Serial.print ("O'yin o'rta darajaga o'rnatilsa ("); Serial.print (intGameSpeedMedium); Serial.println ("ms tezlashtirish)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // o'yin tezligini qiyin qiyinchiliklarga o'rnating, agar (intInput == 2) {Serial.print ("O'yin qattiq" ("); Serial.print (intGameSpeedHard); Serial.println (" ms tezlashtirish) "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
// tugmachalarni va o'yin paytida ular uchun nima qilish kerakligini tekshiradi
bo'sh tugmalarGame () {if (intInput! = 4) {// agar tugma bosilsa, agar (bolTilePressed == false) {// faqat bolTilePressed noto'g'ri bo'lsa, tugmani tekshirish uchun bolTilePressed = rost tugmasini bosing; // keyin yana tasodifan tetiklanmasligiga ishonch hosil qilish uchun bolTilePressed ni rost qilib qo'ying int intLowestTile = 0; // eng past plitkali plitkaga o'rnatiladi int intCheckedTile = 15; // (intLowestTile == 0) {// hech narsa belgilanmagan bo'lsa, plitalar tekshirilganligini kuzatish uchun (int i = 0; i 100) {// kechikish 100 dan past emas intDelay = intDelay - 20; // undan qiymat oling}} else {Serial.println ("Noto'g'ri tugma bosildi"); O'yin tamom(); // aks holda o'yin tugadi}}}}}
void gameOver () {
Serial.println ("O'yin tugadi!"); Serial.print ("Sizning balingiz:"); Serial.println (intScore); Serial.print ("Sizning tezligingiz:"); Serial.println (intDelay); bolPlay = noto'g'ri; }
// o'yinchi kiritilishini tekshiradi
void input () {intEnter = digitalRead (btnEnter); // o'qishni kiriting // boshqa kirishlar qaysi birini o'qiydi yoki hech kim 4 ga o'rnatilmagan bo'lsa (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} boshqa {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} boshqa {intInput = 4; }}}} // kirishni ketma -ket chop eting (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// agar biror tugma bosilmasa reset bolTilePressed bolTilePressed = false; }}
// taxtaning pastki qismini muvaffaqiyatsizlikka tekshiradi
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns uchun if (arrGame [15] == 1) {// agar plitka pastki qismda bo'lsa.println ("Plitka pastda"); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); arrGame [15] = 2; drawBoard (); kechikish (400); arrGame [15] = 1; drawBoard (); kechikish (400); O'yin tamom(); }}}
// bolSerialBoard rost bo'lsa, taxtani ketma -ket monitorga chop etadi
void writeSerial () {if (bolSerialBoard == true) {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {Serial.print (arrGame) [ii]); Serial.print (","); } Serial.println (""); }}}
Barcha kodlar kiritilgandan so'ng, arduino -ga yuklang va zavqlaning!
Tavsiya:
NaTaLia ob -havo stantsiyasi: Arduino quyosh energiyasi bilan ishlaydigan ob -havo stantsiyasi to'g'ri yo'l bilan amalga oshirildi: 8 qadam (rasmlar bilan)
NaTaLia ob -havo stantsiyasi: Arduino quyosh energiyasi bilan ishlaydigan ob -havo stantsiyasi to'g'ri yo'lga qo'yildi: 1 yil davomida 2 xil joyda muvaffaqiyatli ishlaganimdan so'ng, men quyosh energiyasi bilan ishlaydigan ob -havo stantsiyasining loyiha rejalari bilan bo'lishaman va uning qanday qilib uzoq vaqt yashay oladigan tizimga aylanganini tushuntiraman. quyosh energiyasidan o'tgan davrlar. Agar ergashsangiz
Twinky bilan eng zo'r Arduino robot bilan tanishing: 7 qadam (rasmlar bilan)
Twinky bilan eng zo'r Arduino roboti bilan tanishing: Salom, men sizga "Jibo" ni o'zim qanday yaratganimni o'rgataman. lekin "Twinky" deb nomlangan, men buni ochib bermoqchiman … Bu nusxa emas! Men ikkiyuzlamachilik bilan qurardim va shundan keyingina shunga o'xshash narsaning mavjudligini tushundim: bu erda
Chladni plitalari: 5 qadam
Chladni Plitalar: Chladni plaat gemaaktdan keyin, yuqori tezlikda, zo'r zo'ravonlik bilan shug'ullanadi
Burilish effektori: bükme plitalari uchun robot -end effektori: 6 qadam
Burilish effektori: egiluvchi plastinkalar uchun robot -tugatish effektori: Maqsad: uchinchi darajali egiluvchi faol elementlarni birlamchi/ikkilamchi konstruktiv elementga/ramkaga shakllantirish va mahkamlash. Guruh a'zolari: Babasola Tomas, Niloofar Imani, Songxroh zavodi
Dasturga asoslangan aylanadigan quyosh plitalari: 9 qadam
Dasturga asoslangan aylanuvchi quyosh plitalari: o'sib borayotgan aholi va ehtiyojlarga ko'ra, biz kamroq xarajat bilan ko'proq mahsulot ishlab chiqarishni talab qilamiz. Biz dasturga asoslangan aylanadigan quyosh plitasini taklif qildik. U har doim quyosh nuri intensivligi yo'nalishi bo'yicha ishlaydi. Ushbu tanlovda biz maxsus turni taklif qildik