Агуулгын хүснэгт:
- Алхам 1: Цахилгааны утас
- Алхам 2: Тунхаглалын мэдэгдэл
- Алхам 3: Тохируулах функц
- Алхам 4: Loop функц
- Алхам 5: ClearLCD функц
- Алхам 6: DrawBoard функц
- Алхам 7: PlayBoard функц
- Алхам 8: ClearBoard функц
- Алхам 9: Гарчигны үүрэг
- Алхам 10: ButtonsMenu функц
- Алхам 11: ButtonsGame функц
- Алхам 12: GameOver функц
- Алхам 13: Оруулах функц
- Алхам 14: BottomCheck функц
- Алхам 15: WriteSerial функц
- Алхам 16: Дуусгах
Видео: Ардуино - төгөлдөр хуурын хавтан: 16 алхам (зурагтай)
2024 Зохиолч: John Day | [email protected]. Хамгийн сүүлд өөрчлөгдсөн: 2024-01-30 11:04
Сайн байцгаана уу интернет хүмүүс ээ, энэ бол arduino uno r3 дээр гар утасны тоглоомыг таслахгүй байгаа зүйлийг хэрхэн яаж хийх талаар хийх болно.
Эхлэхийн тулд танд дараах бүх хэсгүүд хэрэгтэй болно! 1x Arduino Uno r3 (42 доллар)
2 ширхэг LCD товчлуурын бамбай (тус бүр нь 19 доллар)
5х товчлуур
5х 220Ω эсэргүүцэл
28х утас
За, бүх эд ангиудыг авсны дараа эхлэх цаг боллоо!
Алхам 1: Цахилгааны утас
Диаграммд үзүүлсэн шиг arduino болон найзуудаа утсаар холбож эхэл.
Товчнууд нь зөв чиглэлд холбогдсон эсэхийг шалгаарай, товчлууруудын доод талд A0-4 үүртэй байх ёстой, эс тэгвээс arduino товчлуурыг дарах биш харин байнга дарж байгаа гэж бодох болно.
Алхам 2: Тунхаглалын мэдэгдэл
Энд байгаа бүх код нь таны хоосон тохиргоо болон хоосон давталтаас өмнө байх ёстой, учир нь эдгээр бүх хувьсагч, объектуудыг бидний тохируулах хэд хэдэн функцэд ашигладаг.
Дараахаас эхэлнэ үү.
#оруулах
Таны кодын дээд хэсэгт энэ нь arduino -д "LiquidCrystal.h" номын сан болон түүний нэг хэсэг болох функцуудыг ашиглахыг хэлж байна.
Дараагийн алхам бол бидний товчлуурт ашиглаж буй тээглүүрийг тодорхойлохын тулд энэ кодыг манай #include хэсэгт оруулна уу.
#тодорхойлох btnА0 оруулна уу #тодорхойлох btn1 15 #тодорхойлох btn2 16 #тодорхойлох btn3 17 #тодорхойлох btn4 18
Бид кодыг уншихад хялбар болгохын тулд btnEnter ба btn1 to btn 4 гэсэн нэр томъёог тодорхойлдог, эсвэл шаардлагатай бол өөрчилдөг. Энэ нь btn1 гэж бичихэд arduino нь товчлуур 15 гэсэн үг болохыг бид мэдэх болно гэсэн үг юм. Хэдийгээр бид 15, 16, 17, 18 портуудыг дууддаг боловч тэдгээрийг arduino дээр A1 A2 A3 ба A4 гэж тэмдэглэсэн байдаг. Эдгээр нь тусгайлан аналог оролтод ашиглагддаг портууд боловч бид тэдгээрийг зөвхөн дижитал оролтод ашигладаг.
Дараа нь бид шингэн болор дэлгэцийг хянах объектуудыг бий болгох гэж байна. Үүнийг хийхийн тулд энэ кодыг бидний тодорхойлсон зүйлсийн доор оруулна уу
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
Энэ нь юу хийх вэ гэдэг нь arduino -д lcdLeft эсвэл lcdRight руу залгахдаа бид LiquidCrystal объектыг хэлдэг болохыг хэлдэг. Хавсаргасан хаалтанд байгаа тоонууд нь бидний функцийг ашиглах үед LCD дэлгэц рүү мессеж илгээхдээ ямар порт ашиглах ёстойг arduino -д хэлдэг.
Одоо бид объектын мэдүүлгийн доор кодын дараагийн битийг оруулах замаар хувьсагчдыг зарлах хэрэгтэй болно.
// эдгээр хувьсагчууд нь таны өөрчилж болох сонголтууд юм - өндөр тоо = тоглоомын хурд илүү хурдан intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// gameboolean bolPlay -ийн хувьсагчдыг тохируулах; // int intScore тоглогч байгаа эсэхийг шалгадаг; // тоглогчийн оноог хянадаг int intiff; // тоглоом ямар бэрхшээлтэй байгааг хэлж өгөх гоо зүйн зүйл // int intEnter оролтод хувьсагчдыг тохируулах; // хэрэглэгч int intInput оруулах товчийг дарсан эсэхийг хянадаг; // хэрэглэгчийн boolean bolTilePressed товчлуурыг дардаг хэсгүүдийг; // тоглуулагч 5x товчлуурыг санамсаргүй дарж, алдахгүй байхыг баталгаажуулах // int intTick -ийг эргүүлэхийн тулд хувьсагчдыг тохируулах; // intDelay int intDelay болтол миллиг (давталт бүрт) тоолно; // програмыг millis int intGameSpeed дахь дараагийн ээлж хүртэл хүлээх хугацаа; // abit of debug options boolean bolSerialBoard; // хэзээ true нь самбарыг цуваа дэлгэц дээр хэвлэх болно
Бид өгөгдлийн төрөл, дараа нь хувьсагчийн нэрийг дурдах замаар хувьсагчийг зарлана. int thisIsAnInteger
BolSerialBoard, bolPlay гэх мэт логик хувьсагчид үнэн эсвэл худал гэсэн хоёр утгын аль нэгийг агуулсан байж болно.
IntScore, intInput гэх мэт бүхэл тоон хувьсагч (int) нь бүхэл тоонуудыг 1, 5, 100 гэх мэт утга болгон авч болно.
Бидний энд ашигладаггүй зарим бусад алдартай өгөгдлийн төрлүүд нь текстийн хэсэг бөгөөд хөвөгч нь аравтын бутархай тоо юм.
Энд байгаа хувьсагч бүрийг програм өөр өөр газруудад ашигладаг бөгөөд тус бүрийн хийдэг зүйлийн тоймыг энд харуулав
bolPlay нь цэсийг харуулах эсвэл жинхэнэ тоглоом ажиллаж байгаа эсэхийг програмд хэлдэг.
intScore нь тоглогчийн плита цохих үед авсан оноог нь хянадаг.
intDiff нь үндсэн цэсэнд LCD дэлгэц дээр ямар текст бичихийг програмд хэлэхэд ашиглагддаг.
intEnter нь enter товчлуур (хамгийн зүүн талд) дарагдсан тохиолдолд програмыг хэлэхэд хэрэглэгддэг.
intInput нь бусад 4 товчлуурын аль нь дарагдсан болохыг програмд хэлэхэд хэрэглэгддэг.
bolTilePressed нь програмыг зөвхөн товчлуур дарагдсан үед л уншигдах эсэхийг шалгахад хэрэглэгддэг.
intGameSpeed, intGameSpeedEasy, intGameSpeedMedium болон intGameSpeedHard нь тоглоомыг ямар хүндрэлээс шалтгаалан хэр хурдан хурдасгахыг хянахад ашиглагддаг.
intTick болон intDelay нь програмыг самбарыг эргүүлэх бүртээ шилжүүлэхийг зогсооход хэрэглэгддэг.
bolSerialBoard нь програмыг туршилтын зорилгоор хэд хэдэн тоогоор arduino -ийн цуваа монитор руу самбарыг илгээх боломжийг олгодог.
Эцэст нь энэ кодыг ашиглан манай самбарыг массив гэж зарлах цаг болжээ.
// 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}};
Массив гэдэг нь математикийг дуудах эсвэл өөрчлөх боломжтой аливаа матриц юм.
Таны код одоо иймэрхүү харагдах ёстой;
// номын сангуудыг оруулах#оруулах
// эдгээр хувьсагчууд нь таны өөрчилж болох сонголтууд юм - илүү их тоо = тоглоомын хурдыг хурдасгах
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Зүүг тодорхойлох
#тодорхойлох btnА0 оруулах #btn1 15 тодорхойлох #btn2 16 #тодорхойлох btn3 17 #тодорхойлох btn4 18
// LCD объект үүсгэх (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// тоглоомын массивыг тохируулах
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}};
// тоглоомын хувьсагчдыг тохируулах
boolean bolPlay; // int intScore тоглогч байгаа эсэхийг шалгадаг; // тоглогчийн оноог хянадаг int intiff; // тоглоом ямар бэрхшээлтэй байгааг хэлэх гоо зүйн зүйл
// оролтонд хувьсагчдыг тохируулах
int intEnter; // хэрэглэгч int intInput оруулах товчийг дарсан эсэхийг хянадаг; // хэрэглэгчийн boolean bolTilePressed товчлууруудыг дарж байгааг хянадаг; // тоглогч 5x товчлуурыг санамсаргүй дарж, алдахгүй байхыг баталгаажуулах
// ээлжээр хувьсагчдыг тохируулах
int intTick; // intDelay int intDelay болтол миллиг тоолно (давталт тутамд); // програмыг millis int intGameSpeed дахь дараагийн ээлж хүртэл хүлээх хугацаа;
// дибаг хийх сонголтууд
boolean bolSerialBoard; // хэзээ true нь самбарыг цуваа дэлгэц дээр хэвлэх болно
Алхам 3: Тохируулах функц
Тохиргооны давталт нь arduino -г анх эхлэхэд ганцхан удаа уншдаг функц юм.
Тохиргооны гогцоонд бид хэд хэдэн хувьсагчийнхаа утгыг тохируулж өгдөг, учир нь тэдгээрийг зарлахдаа утгыг нь тохируулахын оронд бид үүнийг энд хийдэг.
Энэ кодыг хүчин төгөлдөр бус тохиргоонд оруулахаас эхэлнэ үү.
bolPlay = худал; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;
Мөр бүр зөвхөн хувьсагчийг утга болгон тохируулж байна.
bolPlay -ийг худал гэж тохируулсан тул тоглоом тоглож эхлэхгүй болно.
intScore -ийг 0 болгож тохируулсан, учир нь таны оноо 0 -ээс эхэлдэг.
intTick нь 0 -ээс эхэлдэг, учир нь програм одоогоор юу ч тоолохгүй байна.
intDelay -ийг 1000 болгож тохируулсан бөгөөд энэ нь хавтангуудын эхлэх ханш юм.
intDiff бол зүгээр л аскетик зүйл бөгөөд ингэснээр програм нь тоглоомын хүндрэлд зориулж юу бичихээ мэддэг болно.
intGameSpeed нь intGameSpeedMedium -ийг ямар ч байсан тохируулдаг бөгөөд энэ нь дунд зэргийн бэрхшээлтэй байдаг.
Дараа нь энэ кодыг оруулсан кодынхоо доор Void Setup хэсэгт оруулна уу.
lcdLeft.begin (16, 2); lcdRight.begin (16, 2);
Цуваа эхлэх (9600);
Энэ нь arduino -д цуваа дэлгэцээр дамжуулан компьютертэй харилцаж эхлэхийг хэлнэ (arduino IDE -ийн баруун дээд буланд байгаа товчлуур дээр дарж харагдана).
Таны Void Setup одоо иймэрхүү харагдах ёстой!
void setup () {Serial.begin (9600); // цуваа мониторыг эхлүүлэх // хувьсагчдыг тохируулах bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // эхлэх lcd -ийн lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }
Алхам 4: Loop функц
Давталтын функцийг arduino -ийн давталт бүрт arduino ажиллуулдаг.
Дараах кодыг Void Loop руу хуулж оруулна уу.
void loop () {input (); // if (bolPlay == true) if if (intPlay == true) {if (intTick> = intDelay) {// Тоглоом эргэх эсэхийг харах эсвэл Serial.println ("~~~~~~~ ~~ "); // самбар дээр явж байгааг илтгэхийн тулд хэвлэх // writeSerial (); // хэрэв сонголт идэвхжсэн бол самбарыг цуваа buttonGame () дээр бичнэ үү; // тоглогчийн оролтыг шалгах playBoard (); // самбарыг зөөж, шинэ хавтан нэмэх clearLcd (); // drawBoard () зурахаасаа өмнө LCD дэлгэцийг цэвэрлэх; // самбарыг lcd -ийн ёроолд зурнаCheck (); intTick = 0; // reset intTick} өөр {buttonGame (); // тоглогчийн оролтыг шалгах clearLcd (); // drawBoard () зурахаасаа өмнө LCD дэлгэцийг цэвэрлэх; // самбарыг lcd's intTick = intTick + intGameSpeed дээр зурна уу; // тэмдэглэгээнд нэмэх}} өөр {clearLcd (); // гарчгийг зурахаас өмнө LCD дэлгэцийг цэвэрлэх (); // гарчиг болон онооны мэдээллийн товчлууруудыг харуулнаMenu (); // тоглогчийн оролтыг унших clearBoard (); // самбарыг бүхэлд нь хангах = 0} саатал (10); // arduino -г богино хугацаанд хойшлуулаарай}
bolPlay нь үнэнтэй тэнцүү бол энэ нь тоглоом тоглож байгаа гэсэн үг бөгөөд тоглоом тоглож байх үеийн бүх кодыг ажиллуулах ёстой, гэхдээ intTick нь бидний intDelay -ээс том байх үед самбарыг шинэ хавтан нэмж, доошоо буулгахыг л хүсч байна. Үгүй бол бид хэрэглэгчид товчлуур дарахад хавтан дээр дарж, intTick -ийн хурдыг нэмэгдүүлэхийг зөвшөөрөхийг хүсч байна.
Энэ кодын ихэнх нь бидний хийж амжаагүй байгаа функцуудыг ашигладаг бөгөөд бид тэдгээрийг дараагийн алхамуудад хийх болно. Эдгээр функцүүдийн зорилго нь дараах байдалтай байна.
Оролт нь хэрэглэгч ямар товчлуур дарсан болохыг уншдаг.
buttonGame нь товчлуурууд цэснээс биш тоглоомын үед юу хийхийг хянадаг
playBoard нь самбар дээр шинэ хавтан нэмж, дараа нь самбар дээрх бүх зүйлийг нэг зай руу зөөнө
clearLCD нь хавтангуудын ард хий үзэгдэл үлдэхгүйн тулд LCD дэлгэцийг цэвэрлэдэг
drawBoard нь arrGame -ээр дамжин LCD дэлгэц дээр хэвлэгддэг
clearBoard нь тоглоом тоглоогүй байхад arrGame -ийг бүхэлд нь цэвэрлэнэ
bottomCheck нь arrGame -ийн доод хэсгийг бүтэлгүйтсэн эсэхийг шалгадаг
гарчиг нь цэс дээр байгаа тоглоомын нэр, онооны мэдээллийг харуулдаг
товчлууруудын цэс нь хэрэглэгчийн оролт цэсэнд байхдаа юу хийхийг хянадаг.
gameOver бол өөр нэг функц боловч энд дуудагддаггүй, харин доод хэсэгт нь дуудагддаг Чек ба товчлуурууд Тоглоомын функцууд.
Алхам 5: ClearLCD функц
Функцийг бий болгохын тулд үүнийг кодонд нэмж оруулна уу
void functionName () {
}
"functionName" нь аль хэдийн байхгүй бол юу ч байж болно.
Энэ кодыг програмдаа хуулж оруулна уу:
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 (""); }}}
Энэ нь 2 тоолсон гогцоо ашиглан LCD дэлгэц дээрх цэг бүрээр дамжиж зай бичих замаар массивыг бүхэлд нь дамжуулдаг.
Дахин тохируулахгүйгээр LCD дэлгэц нь өмнө нь бичсэн зүйлийг хадгалах болно
Алхам 6: DrawBoard функц
энэ кодыг програмдаа хуулж оруулна уу
void drawBoard () {for (int i = 1; i <= 15; i ++) {// зүүн LCD дээр collums 1 ба 2 зурна уу // хэрэв хавтан = 0 юу ч бичээгүй бол, = 1 "#", = 2 гэж бичнэ үү "@" lcdLeft.setCursor (i, 1) гэж бичих; // бол эхний баганыг (хамгийн зүүн талд) тохируулсан бол (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft. бичих ("@");} lcdLeft.setCursor (i, 0); // бол (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft. бичих ("@");} lcdRight.setCursor (i, 1); // (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight бол гурав дахь баганыг (баруун баруун талд) тохируулна уу. бичих ("@");} lcdRight.setCursor (i, 0); // хэрэв (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight бол дөрөв дэх баганыг (хамгийн баруун талд) тохируулна уу.. бичих ("@");}}}
Энэ нь самбарын мөр бүрийг давах гогцоог ашигладаг бөгөөд дараа нь эгнээний аль нэг багана нь 1 эсвэл 2 -тэй тэнцүү эсэхийг шалгадаг бөгөөд үүний үндсэн дээр LCD дээр хэштег хэвлэж, хавтанг хараахан байрлуулаагүй болно. цохих, эсвэл хит хавтангийн хувьд @.
Алхам 7: PlayBoard функц
энэ кодыг програмдаа хуулж оруулна уу.
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // дээд мөрийг арилгах arrGame [0] [random (0, 4)] = 1; // дээд эгнээний санамсаргүй цэгийг (int i = 15; i> = 1; i-) {// хавтангийн доороос дээд тал руу (int ii = 0; ii <= 3; ii ++) {// collum arrGame [ii] = arrGame [i - 1] [ii] бүрийн хувьд; }}}
Энэ код нь дээд мөрийг бүхэлд нь 0 болгож, эсвэл хавтангүй болгож эхэлж, дараа нь нэг санамсаргүй хавтанг 1 болгож, үл үзэгдэгч хавтан болгож тохируулна.
Дараа нь 15 -аас 1 хүртэл урвуугаар тоолсон давталтыг дамжуулж, мөрийг дээрх эгнээтэй тэнцүү болгож, самбарыг LCD дэлгэцээр доошлуулна.
Алхам 8: ClearBoard функц
энэ кодыг програмдаа хуулж оруулна уу.
void clearBoard () {// тэмдэглэлийг дахин тохируулах ба intTick = 0 утгыг хойшлуулах; intDelay = 1000; // самбараар явж, бүх зүйлийг 0 болгож (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
Тоглоом тоглогдоогүй үед энэ кодыг ажиллуулж, arrGame -ийг бүхэлд нь 0 болгож тохируулсан эсэхийг шалгана уу.
Энэ код нь intDelay болон intTick -ийн утгыг дахин тохируулдаг.
Алхам 9: Гарчигны үүрэг
Дараах кодыг програмдаа хуулна уу
void title () {// гарчгийг LCD дээр бичээд lcdRight.setCursor онооны зай (0, 0); lcdRight.write ("Төгөлдөр хуурын хавтан"); lcdRight.setCursor (0, 1); lcdRight.write ("Оноо:"); // оноог string strScore болгон хөрвүүлэх [3]; sprintf (strScore, "%d", intScore); // оноог LCD lcdRight.write дээр харуулах (strScore); // diffictuly lcdRight.setCursor (10, 1) нэмэх; хэрэв (intDiff == 0) {lcdRight.write ("Хялбар"); } if (intDiff == 1) {lcdRight.write ("Medium"); } бол (intDiff == 2) {lcdRight.write ("Хатуу"); } // lcdLeft.setCursor (0, 0) зааврыг бага зэрэг дарна уу; lcdLeft.write ("Enter дарна уу"); lcdLeft.setCursor (0, 1); lcdLeft.write ("эхлэх!"); }
Энэ код нь тоглоомын нэр, оноог LCD дэлгэц дээр бичдэг бөгөөд үүнийг LCD дэлгэц дээр хаанаас бичиж эхлэхээ LCD.setCursor ашиглан хэлээд LCD.write дээр бичдэг.
Энд strScore гэсэн шинэ хувьсагчийг бий болгож, үүнийг sprintf функцийг ашиглан intScore -ийг өгөгдлийн төрөл эсвэл тэмдэгт болгон хөрвүүлэхэд ашигладаг.
intDiff -ийг энд бас ашигладаг бөгөөд түүний үнэ цэнэ дээр үндэслэн янз бүрийн бэрхшээлийн сонголтуудыг хэвлэдэг.
Алхам 10: ButtonsMenu функц
Дараах кодыг програмдаа оруулна уу
void keysMenu () {// enter дарагдсан үед тоглоомыг эхлүүлж, хэрэв (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 -р товчлуурыг дарахад самбарыг цувралаар хэвлэх дибаг хийх сонголтыг идэвхжүүлнэ үү (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = үнэн; } өөр {Serial.println ("Цуваа самбар идэвхгүй болсон"); bolSerialBoard = худал; }} // тоглоомын хурдыг хялбар байдалд тохируулна уу (intInput == 0) {Serial.print ("Тоглоомыг хялбар болгож тохируулсан ("); Serial.print (intGameSpeedEasy); Serial.println ("ms хурдатгал)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // тоглоомын хурдыг дунд зэргийн хэцүү байдалд тохируулна уу (intInput == 1) {Serial.print ("Тоглоом дунд зэрэг ("); Serial.print (intGameSpeedMedium); Serial.println ("ms хурдатгал)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // тоглоомын хурдыг хүнд хэцүү байдалд тохируулна уу (intInput == 2) {Serial.print ("Тоглоомыг хатуу тохируулсан ("); Serial.print (intGameSpeedHard); Serial.println ("ms хурдатгал)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
Энэ код нь bolPlay нь хоосон Loop дахь худал утгатай тэнцүү үед л ажилладаг
Хэрэв intEnter -ийг 1 болгож тохируулсан бол энэ нь оруулах товчийг дарсан гэсэн үг бөгөөд хэрэв дарж байвал програм bolPlay -ийг үнэн болгож, тоглоом эхэлнэ.
Дараа нь програм нь intInput нь юутай тэнцүү болохыг уншдаг. Хэрэв энэ нь 0 -тэй тэнцүү бол зүүн талд байгаа эхний товчлуур дарагдаж, баруун тийш 3 хүртэл дарагдаж байвал intInput 4 -тэй тэнцүү бол ямар ч товчлуур дарагдахгүй болно.
Хэрэв 0-2 товчлуур дарагдсан бол тоглоом нь хүндрэлийг өөрчилж, тоглоомын хурдны утгыг тохируулж өгдөг бөгөөд энэ нь илүү хурдан хурдасгах болно гэсэн үг юм.
Хэрэв 3 -р товчлуур дарагдсан бол тоглоом нь дибаг хийх горимыг идэвхжүүлж, идэвхгүй болгох бөгөөд энэ нь програмын асуудлуудыг олоход туслах зорилгоор самбарыг бүхэлд нь цуваа монитор дээр хэвлэнэ.
Алхам 11: ButtonsGame функц
Дараах кодыг програмдаа хуулна уу
void buttonGame () {if (intInput! = 4) {// хэрэв (bolTilePressed == false) бол товчлуур дарагдсан бол {// хэрэв bolTilePressed хуурамч байвал товчлуурыг шалгах bolTilePressed = true; // дараа нь дахин эхлүүлэхгүй байхын тулд bolTilePressed -ийг үнэн болгож тохируулна уу intLowestTile = 0; // хамгийн бага хавтантай хавтан дээр тохируулах int intCheckedTile = 15; // (intLowestTile == 0) {// ямар ч зүйл тохируулагдаагүй байхад шалгасан хавтангуудыг хянах зорилгоор (int i = 0; i 100) {// int байхад л саатал 100 -аас доошгүй байна intDelay = intDelay - 20; // үүнээс утга авна}} өөр {Serial.println ("Буруу товчлуур дарагдсан"); Тоглоом дууслаа(); // тэгэхгүй бол тоглоом дууслаа}}}}}
BolPlay нь хоосон Loop дахь үнэнтэй тэнцүү байх үед л кодыг ажиллуулдаг.
IntInput -ийн утга дээр үндэслэсэн buttonMenu -ийн нэгэн адил тоглогч плита оносон эсвэл алдсан эсэхийг шалгадаг.
Энэ нь arrGame -ийг доороос дээш чиглүүлж, давталтыг ашиглан аль эгнээ нь хамгийн бага нь харагдахгүй хавтантай болохыг олж хардаг. Дараа нь товчлуур дарагдсан тухайн эгнээний цэг нь үл үзэгдэгч хавтан мөн эсэхийг шалгадаг, хэрэв задлаагүй бол үүнийг 1 -ийн оронд 2 -тэй тэнцүү болгож, @гэж харуулах болно, эс тэгвээс тоглоомыг тоглуулах болно. бидний үүсгэж амжаагүй байгаа функц.
Энэ функц нь bolTilePressed хувьсагчийг ашигладаг бөгөөд товчлуур дарагдсан үед үүнийг үнэн болгож, товчлуур дарагдаагүй бол худал болгодог. Энэ нь хэрэглэгч тоглоомыг санамсаргүйгээр алдахгүй байхыг баталгаажуулахын тулд юм. Учир нь програм товчлуурыг дарж байхдаа олон удаа дарсан гэж бодсон.
Алхам 12: GameOver функц
Дараах кодыг програмдаа хуулна уу
void gameOver () {Serial.println ("Тоглоом дууслаа!"); Serial.print ("Таны оноо:"); Serial.println (intScore); Serial.print ("Таны хурд ийм байсан:"); Serial.println (intDelay); bolPlay = худал; }
Энэ нь checkBottom эсвэл buttonGame функцуудын аль нэгээр өдөөгдөж, bolPlay -ийг худал гэж тохируулснаар тоглоомын төгсгөлийг өдөөдөг.
Энэ нь хэрэглэгчийн оноо, хурдны хавтанг миллисекундээр нэмсэн тухай цуваа монитор руу мессеж хэвлэнэ.
Алхам 13: Оруулах функц
Дараах кодыг програмдаа хуулна уу.
void input () {intEnter = digitalRead (btnEnter); // унших оруулна уу // бусад оролтуудын алийг нь уншина, эсвэл хэрэв 4 -ийг тохируулаагүй бол (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} өөр {if (digitalRead (btn3) == HIGH) {intInput = 2;} өөр {if (digitalRead (btn4) == HIGH) {intInput = 3;} өөр {intInput = 4; }}}} // оролтуудыг цувралаар if (intEnter == 1) {Serial.println ("Enter дарагдсан!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// хэрэв ямар ч товчлуур дарагдаагүй бол reset bolTilePressed bolTilePressed = false; }}
Энэ кодыг Тоглоом болон buttonMenu товчлууруудад ашигладаг. Хэрэглэгч дарсан товчлуурууд дээр үндэслэн intInput -ийн утгыг тогтоодог бөгөөд хэрэв дарахгүй бол intInput -ийг 4 -тэй тэнцүү болгоно.
Хэрэв ямар ч товчлуур дарагдаагүй бол bolTilePressed товчлуурууд Тоглоомын функцийг дахин тохируулдаг.
Энэ нь аль товчлуур дээр дарагдсан болохыг цуваа монитор руу хэвлэдэг.
Алхам 14: BottomCheck функц
Дараах кодыг програмдаа хуулж аваарай.
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// for 4 collumns if (arrGame [15] == 1) {// хэрэв хавтан доод талд байгаа бол Цуваа.println ("Доод талд байгаа хавтан"); arrGame [15] = 2; drawBoard (); саатал (400); arrGame [15] = 1; drawBoard (); саатал (400); arrGame [15] = 2; drawBoard (); саатал (400); arrGame [15] = 1; drawBoard (); саатал (400); Тоглоом дууслаа(); }}}
Энэ код нь давталтын тусламжтайгаар arrGame -ийн доод эгнээнд ямар ч үл үзэгдэх хавтан байгаа эсэхийг шалгадаг (1 -тэй тэнцүү плита), хэрэв дэлгэцийн доод талд үл үзэгдэгч хавтан байгаа бол хавтанг анивчиж, тоглоомыг ажиллуулах болно.
Алхам 15: WriteSerial функц
Дараах кодыг програмдаа хуулна уу
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 (""); }}}
Энэ бол дибаг хийх сонголтыг дагасан функц бөгөөд buttonMenu функц дээр идэвхжүүлж болно. Хэрэв bolSerialBoard энэ функцэд тохируулагдсан бол энэ нь arrGame -ээр дамжих бөгөөд массив ашиглан туршилтын зорилгоор самбарыг бүхэлд нь цуваа монитор болгон хэвлэх болно.
Алхам 16: Дуусгах
Таны бүх код бүрэн байж болохгүй, иймэрхүү харагдах ёстой!
/ * * Нэр - төгөлдөр хуурын хавтан; Arduino * By - Domenic Marulli * Огноо - 11/ *
/ номын сан орно
#оруулах
// эдгээр хувьсагчууд нь таны өөрчилж болох сонголтууд юм - илүү их тоо = тоглоомын хурдыг хурдасгах
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Зүүг тодорхойлох
#тодорхойлох btnА0 оруулах #btn1 15 тодорхойлох #btn2 16 #тодорхойлох btn3 17 #тодорхойлох btn4 18
// LCD объект үүсгэх (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// тоглоомын массивыг тохируулах
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}};
// тоглоомын хувьсагчдыг тохируулах
boolean bolPlay; // int intScore тоглогч байгаа эсэхийг шалгадаг; // тоглогчийн оноог хянадаг int intiff; // тоглоом ямар бэрхшээлтэй байгааг хэлэх гоо зүйн зүйл
// оролтонд хувьсагчдыг тохируулах
int intEnter; // хэрэглэгч int intInput оруулах товчийг дарсан эсэхийг хянадаг; // хэрэглэгчийн boolean bolTilePressed товчлууруудыг дарж байгааг хянадаг; // тоглогч 5x товчлуурыг санамсаргүй дарж, алдахгүй байхыг баталгаажуулах
// ээлжээр хувьсагчдыг тохируулах
int intTick; // intDelay int intDelay болтол миллиг тоолно (давталт тутамд); // програмыг millis int intGameSpeed дахь дараагийн ээлж хүртэл хүлээх хугацаа;
// дибаг хийх сонголтууд
boolean bolSerialBoard; // хэзээ true нь самбарыг цуваа дэлгэц дээр хэвлэх болно
// нэг удаа ажиллуулах тохиргоо
void setup () {Serial.begin (9600); // цуваа мониторыг эхлүүлэх // хувьсагчдыг тохируулах bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // эхлэх lcd -ийн lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }
// 10 миллисекунд тутамд хийгдэх давталт
void loop () {input (); // if (bolPlay == true) if if (intPlay == true) {if (intTick> = intDelay) {// Тоглоом эргэх эсэхийг харах эсвэл Serial.println ("~~~~~~~ ~~ "); // самбар дээр явж байгааг илтгэхийн тулд хэвлэх // writeSerial (); // хэрэв сонголт идэвхжсэн бол самбарыг цуваа buttonGame () дээр бичнэ үү; // тоглогчийн оролтыг шалгах playBoard (); // самбарыг зөөж, шинэ хавтан нэмэх clearLcd (); // drawBoard () зурахаасаа өмнө LCD дэлгэцийг цэвэрлэх; // самбарыг lcd -ийн ёроолд зурнаCheck (); intTick = 0; // reset intTick} өөр {buttonGame (); // тоглогчийн оролтыг шалгах clearLcd (); // drawBoard () зурахаасаа өмнө LCD дэлгэцийг цэвэрлэх; // самбарыг lcd's intTick = intTick + intGameSpeed дээр зурна уу; // тэмдэглэгээнд нэмэх}} өөр {clearLcd (); // гарчгийг зурахаас өмнө LCD дэлгэцийг цэвэрлэх (); // гарчиг болон онооны мэдээллийн товчлууруудыг харуулнаMenu (); // тоглогчийн оролтыг унших clearBoard (); // самбарыг бүхэлд нь хангах = 0} саатал (10); // arduino -г богино хугацаанд хойшлуулаарай}
// lcd -ийг цэвэрлэдэг тул оруулаагүй нүднүүд тэнд үлддэггүй
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 дээр татдаг
void drawBoard () {for (int i = 1; i <= 15; i ++) {// зүүн LCD дээр collums 1 ба 2 зурна уу // хэрэв хавтан = 0 юу ч бичээгүй бол, = 1 "#", = 2 гэж бичнэ үү "@" lcdLeft.setCursor (i, 1) гэж бичих; // бол эхний баганыг (хамгийн зүүн талд) тохируулсан бол (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft. бичих ("@");} lcdLeft.setCursor (i, 0); // бол (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft. бичих ("@");} lcdRight.setCursor (i, 1); // (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight бол гурав дахь баганыг (баруун баруун талд) тохируулна уу. бичих ("@");} lcdRight.setCursor (i, 0); // хэрэв (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight бол дөрөв дэх баганыг (хамгийн баруун талд) тохируулна уу.. бичих ("@");}}}
// самбарыг доош нь хөдөлгөж, санамсаргүй утгыг хавтан болгон байрлуулна
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // дээд мөрийг арилгах arrGame [0] [random (0, 4)] = 1; // дээд эгнээний санамсаргүй цэгийг (int i = 15; i> = 1; i-) {// хавтангийн доороос дээд тал руу (int ii = 0; ii <= 3; ii ++) {// collum arrGame [ii] = arrGame [i - 1] [ii] бүрийн хувьд; }}}
// самбарыг бүхэлд нь 0 болгож, хувьсагчдыг урьдчилан тоглуулахаар тохируулна
void clearBoard () {// тэмдэглэлийг дахин тохируулах ба intTick = 0 утгыг хойшлуулах; intDelay = 1000; // самбараар явж, бүх зүйлийг 0 болгож (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
// LCD дэлгэц дээрх Үндсэн цэсийг харуулна
void title () {// гарчгийг LCD дээр бичээд lcdRight.setCursor онооны зай (0, 0); lcdRight.write ("Төгөлдөр хуурын хавтан"); lcdRight.setCursor (0, 1); lcdRight.write ("Оноо:"); // оноог string strScore болгон хөрвүүлэх [3]; sprintf (strScore, "%d", intScore); // оноог LCD lcdRight.write дээр харуулах (strScore); // diffictuly lcdRight.setCursor (10, 1) нэмэх; хэрэв (intDiff == 0) {lcdRight.write ("Хялбар"); } if (intDiff == 1) {lcdRight.write ("Medium"); } бол (intDiff == 2) {lcdRight.write ("Хатуу"); } // lcdLeft.setCursor (0, 0) зааврыг бага зэрэг дарна уу; lcdLeft.write ("Enter дарна уу"); lcdLeft.setCursor (0, 1); lcdLeft.write ("эхлэх!"); }
// тоглоомноос гадуур товчлуурууд болон тэдний төлөө юу хийх ёстойг шалгадаг
void keysMenu () {// enter дарагдсан үед тоглоомыг эхлүүлж, хэрэв (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 -р товчлуурыг дарахад самбарыг цувралаар хэвлэх дибаг хийх сонголтыг идэвхжүүлнэ үү (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = үнэн; } өөр {Serial.println ("Цуваа самбар идэвхгүй болсон"); bolSerialBoard = худал; }} // тоглоомын хурдыг хялбар байдалд тохируулна уу (intInput == 0) {Serial.print ("Тоглоомыг хялбар болгож тохируулсан ("); Serial.print (intGameSpeedEasy); Serial.println ("ms хурдатгал)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // тоглоомын хурдыг дунд зэргийн хэцүү байдалд тохируулна уу (intInput == 1) {Serial.print ("Тоглоом дунд зэрэг ("); Serial.print (intGameSpeedMedium); Serial.println ("ms хурдатгал)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // тоглоомын хурдыг хүнд хэцүү байдалд тохируулна уу (intInput == 2) {Serial.print ("Тоглоомыг хатуу тохируулсан ("); Serial.print (intGameSpeedHard); Serial.println ("ms хурдатгал)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
// тоглоомын үеэр товчлуурууд болон тэдний төлөө юу хийх ёстойг шалгадаг
void buttonGame () {if (intInput! = 4) {// хэрэв (bolTilePressed == false) бол товчлуур дарагдсан бол {// хэрэв bolTilePressed хуурамч байвал товчлуурыг шалгах bolTilePressed = true; // дараа нь дахин эхлүүлэхгүй байхын тулд bolTilePressed -ийг үнэн болгож тохируулна уу intLowestTile = 0; // хамгийн бага хавтантай хавтан дээр тохируулах int intCheckedTile = 15; // (intLowestTile == 0) {// ямар ч зүйл тохируулагдаагүй байхад шалгасан хавтангуудыг хянах зорилгоор (int i = 0; i 100) {// int байхад л саатал 100 -аас доошгүй байна intDelay = intDelay - 20; // үүнээс утга авна}} өөр {Serial.println ("Буруу товчлуур дарагдсан"); Тоглоом дууслаа(); // тэгэхгүй бол тоглоом дууслаа}}}}}
хүчингүй gameOver () {
Serial.println ("Тоглоом дууслаа!"); Serial.print ("Таны оноо:"); Serial.println (intScore); Serial.print ("Таны хурд ийм байсан:"); Serial.println (intDelay); bolPlay = худал; }
// тоглогчийн оролтыг шалгадаг
void input () {intEnter = digitalRead (btnEnter); // унших оруулна уу // бусад оролтуудын алийг нь уншина, эсвэл хэрэв 4 -ийг тохируулаагүй бол (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} өөр {if (digitalRead (btn3) == HIGH) {intInput = 2;} өөр {if (digitalRead (btn4) == HIGH) {intInput = 3;} өөр {intInput = 4; }}}} // оролтыг цувралаар хэвлэнэ if (intEnter == 1) {Serial.println ("Enter дарагдсан!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// хэрэв ямар ч товчлуур дарагдаагүй бол reset bolTilePressed bolTilePressed = false; }}
// самбарын доод хэсэгт алдаа гарсан эсэхийг шалгадаг
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns for if (arrGame [15] == 1) {// хэрэв хавтан доод талд байгаа бол.println ("Доод талд байгаа хавтан"); arrGame [15] = 2; drawBoard (); саатал (400); arrGame [15] = 1; drawBoard (); саатал (400); arrGame [15] = 2; drawBoard (); саатал (400); arrGame [15] = 1; drawBoard (); саатал (400); Тоглоом дууслаа(); }}}
// bolSerialBoard үнэн бол самбарыг цуваа дэлгэц дээр хэвлэнэ
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 (""); }}}
Бүх кодыг оруулсны дараа arduino дээрээ оруулаад сайхан өнгөрүүлээрэй!
Зөвлөмж болгож буй:
Батерейгаар ажилладаг оффис. Зүүн/Баруун нарны хавтан, салхин турбиныг автоматаар солих нарны систем: 11 алхам (зурагтай)
Батерейгаар ажилладаг оффис. Зүүн/Баруун нарны хавтан, салхин турбиныг автоматаар солих нарны систем: Төсөл: 200 хавтгай дөрвөлжин фут хэмжээтэй оффисыг батерейгаар тэжээх шаардлагатай. Оффис нь энэ системд шаардлагатай бүх хянагч, батерей, эд ангиудыг агуулсан байх ёстой. Нарны болон салхины эрчим хүч нь батерейг цэнэглэх болно. Бага зэргийн асуудал байна, зөвхөн
DIY GPU арын хавтан нь цахилгаан хэрэгсэлгүй: 16 алхам (зурагтай)
DIY GPU арын хавтан нь цахилгаан хэрэгсэлгүй: Сайн байцгаана уу, энэ зааварчилгаанд би WS2812b LED (Aka Neopixels) ашиглан RGB өөрчлөн тохируулсан график картны хавтанг хэрхэн яаж хийхийг танд үзүүлэх болно. Энэ тайлбар нь шударга ёсонд нийцэхгүй байгаа тул дээрх видеог үзээрэй! Анхаарна уу
Cat аудио даралтын хавтан W/ Makey Makey: 8 алхам (зурагтай)
Cat аудио даралтын хавтан W/ Makey Makey: Муур нь ядаргаатай байж болох ч энэ нь тэднийг дур булаам болгодоггүй. Асуудлаас эхэлж шийдлийг харцгаая. Доорх видеог үзээрэй
Сүүдэр хайгч болох нарны хавтан: 7 алхам (зурагтай)
СОНГООН ХАМГААЛАГЧИЙН НАРЫН ПАНЕ: Физик болон бусад шинжлэх ухаанд механик хөдөлгөөнийг тодорхойлоход ашигладаг үндсэн хэмжигдэхүүн бол хурд юм. Үүнийг хэмжих нь туршилтын ангиудад давтагдах үйл ажиллагаа байсаар ирсэн. Би ихэвчлэн видео камер, TRACKER програмыг ашиглан кертагийн хөдөлгөөнийг судалдаг
Чимэглэлийн үүрний хавтан: 7 алхам (зурагтай)
Чимэглэлийн үүрний арын хавтан: Энэ бол Nest термостатын гоёл чимэглэлийн утсан хүрээний заавар юм. Та хүссэн техник дээрээ ижил техникийг ашиглаж болно. Хэрэв таны уран бүтээлийг эргэн тойронд нь холбох шаардлагагүй бол бүх хүчийг унтраагаарай. Суулгахаас өмнө утсыг шошголох