Sisällysluettelo:
- Vaihe 1: Johdotus
- Vaihe 2: Ilmoituslausumat
- Vaihe 3: Asennustoiminto
- Vaihe 4: Silmukkatoiminto
- Vaihe 5: ClearLCD -toiminto
- Vaihe 6: DrawBoard -toiminto
- Vaihe 7: PlayBoard -toiminto
- Vaihe 8: ClearBoard -toiminto
- Vaihe 9: Otsikkotoiminto
- Vaihe 10: ButtonsMenu -toiminto
- Vaihe 11: ButtonsGame -toiminto
- Vaihe 12: GameOver -toiminto
- Vaihe 13: Tulotoiminto
- Vaihe 14: BottomCheck -toiminto
- Vaihe 15: WriteSerial -toiminto
- Vaihe 16: Valmistuminen
Video: Arduino - pianolaatat: 16 vaihetta (kuvilla)
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:02
Hei Internet -ihmiset, tässä on kyse siitä, kuinka tehdä se, mikä EI KIINTÄNÄ ole mobiilipelin kopiointia arduino uno r3: lla.
joten aluksi tarvitset kaikki osat, jotka ovat seuraavat! 1x Arduino Uno r3 (42 dollaria)
2x LCD -näppäimistön suoja (19 dollaria kukin)
5x painikkeet
5x 220Ω vastukset
28x johdot
Okei, kun olet saanut kaikki osat, on aika aloittaa!
Vaihe 1: Johdotus
Aloita johdotamalla arduino ja ystävät kaavion mukaisesti, Varmista, että painikkeet on kytketty oikein päin, ja A0-4-aukot painikekiskojen pohjapuolella, tai arduino luulee sen sijaan, että painikkeita pidetään jatkuvasti painettuina.
Vaihe 2: Ilmoituslausumat
Kaikkien tässä olevien koodien pitäisi mennä ennen tyhjiöasetustasi ja tyhjäkäyntiä, koska kaikkia näitä muuttujia ja objekteja käytetään useissa toiminnoissa, jotka asetamme.
Aloita laittamalla:
#sisältää
koodisi yläosassa tämä kertoo arduinoa käyttämään kirjastoa "LiquidCrystal.h" ja sen toimintoja.
Seuraava askel on määritellä nappeihimme käyttämämme nastat asettamalla tämä koodi #include: n alle:
#define btnAde A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
Määrittelemme termit btnEnter ja btn1 - btn 4 helpottaaksemme koodin lukemista tai muuttaaksemme sitä tarvittaessa. Se tarkoittaa, että kun kirjoitamme btn1, arduino tietää, että me itse asiassa tarkoitamme painiketta 15. Vaikka kutsumme portteja portteiksi 15, 16, 17 ja 18, ne on merkitty arduinoon nimellä A1 A2 A3 ja A4, koska ne ovat portteja, joita käytetään erityisesti analogisille tuloille, vaikka käytämme niitä vain digitaalituloihin.
Seuraavaksi aiomme luoda objekteja, jotka ohjaavat nestekidenäyttöjä. Voit tehdä tämän asettamalla tämän koodin määritelmämme alle
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
Tämä kertoo arduinolle, että kun kutsumme lcdLeft tai lcdRight, viittaamme LiquidCrystal -objektiin. Oheisissa suluissa olevat numerot kertovat arduinolle, mitä portteja objekti käyttää viestien lähettämiseen nestekidenäyttöön, kun käytämme niiden toimintoja.
Nyt meidän on ilmoitettava muuttujat asettamalla seuraava koodibitti objektideklaraatioiden alle:
// nämä muuttujat ovat vaihtoehtoja, joita voit muuttaa - suurempia numeroita = nopeampi pelin nopeus upint intameGeSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// asetetaan muuttujia pelin boolean bolPlay; // kappaleet jos soitin int intScore; // seuraa pelaajan pistettä intDiff; // vain esteettinen asia kertoakseen, kuinka vaikeassa pelissä on kyse // asetetaan muuttujat syötteelle int intEnter; // seuraa, jos käyttäjä painaa enter -painiketta int intInput; // seuraa mitä painikkeita käyttäjä painaa boolean bolTilePressed; // varmista, että pelaaja ei vahingossa paina painiketta 5x ja häviä // aseta muuttujia turn int intTick; // laskee milliä (silmukkaa kohden) asti intDelay int intDelay; // aika, jonka ohjelma odottaa seuraavaan kierrokseen millis int intGameSpeed; // abit of debug options boolean bolSerialBoard; // kun true, tulostaa levyn sarjamonitorissa
Ilmoitamme muuttujan ilmoittamalla tietotyypin ja sitten muuttujan nimen, esim. int thisIsAnInteger
Boolen muuttujilla, kuten bolSerialBoard ja bolPlay, voi olla vain yksi kahdesta arvosta, tosi tai epätosi.
Kokonaislukumuuttuja (int), kuten intScore ja intInput, voi ottaa kokonaislukuja arvoina, kuten 1, 5 tai 100.
Jotkut muut merkittävät tietotyypit, joita emme käytä tässä, ovat merkkijono, joka on tekstinpala, ja kelluva, joka on desimaaliluku.
Ohjelma käyttää kaikkia muuttujia useissa eri paikoissa, tässä on tiivistelmä siitä, mitä kukin tekee
bolPlay kertoo ohjelmalle, onko valikko näytettävä vai onko varsinainen peli käynnissä.
intScore seuraa pelaajan pisteitä, kun he osuvat laattoihin, intDiff -toimintoa käytetään päävalikossa kertomaan ohjelmalle, minkä verran tekstiä tulostetaan nestekidenäytöille, intEnter -ohjelmaa käytetään ilmoittamaan ohjelmalle, jos Enter -painiketta (kauimpana vasemmalla) painetaan, intInput -ohjelmaa käytetään ilmoittamaan ohjelmalle, mitä neljästä muusta painikkeesta painetaan.
bolTilePressed -ohjelmaa käytetään varmistamaan, että ohjelma lukee vain painiketta painettaessa eikä sitä pidettäessä.
intGameSpeed, intGameSpeedEasy, intGameSpeedMedium ja intGameSpeedHard käytetään ohjaamaan kuinka nopeasti peli nopeutuu valitun vaikeuden perusteella.
intTick- ja intDelay -ohjelmia käytetään estämään ohjelma siirtämästä taulua joka kerta, kun se silmukoidaan.
bolSerialBoardin avulla voit saada ohjelman lähettämään levyn arduinon sarjamonitorille numerosarjana testausta varten.
Lopuksi on aika julistaa aluksemme taulukkona käyttämällä tätä koodia:
// aseta pelimatriisi 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}};
Matriisi on matriisi, joka tahansa piste, josta voidaan kutsua matematiikkaa tai muuttaa.
Koodisi pitäisi nyt näyttää tältä;
// sisällytä kirjastoja#include
// nämä muuttujat ovat vaihtoehtoja, joita voit muuttaa - suuremmat luvut = nopeampi pelin nopeus
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Määritä nastat
Syötä A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// luo LCD -objekteja (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// aseta peliryhmä
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}};
// asettaa muuttujia pelille
boolean bolPlay; // kappaleet, jos pelaaja int intScore; // seuraa pelaajan pistettä intDiff; // vain esteettinen asia kertomaan, kuinka vaikeaa peli on
// määritä muuttujat syötettäväksi
int intEnter; // seuraa, jos käyttäjä painaa enter -painiketta int intInput; // seuraa mitä painikkeita käyttäjä painaa boolean bolTilePressed; // Varmista, että pelaaja ei vahingossa paina painiketta 5x ja häviä
// aseta muuttujat käännökselle
int intTick; // laskee milliä (silmukkaa kohden) asti intDelay int intDelay; // aika, jonka ohjelma odottaa seuraavaan kierrokseen millis int intGameSpeed;
// virheenkorjausvaihtoehtojen lopettaminen
boolean bolSerialBoard; // kun true, tulostaa levyn sarjamonitorissa
Vaihe 3: Asennustoiminto
Asetussilmukka on funktio, jonka arduino lukee vain kerran, kun se aluksi käynnistyy.
Asetussilmukassa asetamme vain muutamien muuttujien arvoja, koska sen sijaan, että asetamme heille arvon ilmoittaessamme ne, teemme sen täällä.
Aloita lisäämällä tämä koodi Void -asetukseesi.
bolPlay = epätosi; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;
Jokainen rivi asettaa vain muuttujan arvoksi.
bolPlay on asetettu arvoon false, jotta peli ei käynnisty.
intScore on asetettu arvoon 0, koska pisteet alkavat luonnollisesti nollasta.
intTick alkaa nollasta, koska ohjelma ei tällä hetkellä laske mitään.
intDelay -arvoksi on asetettu 1000, koska ruutujen aloitusnopeus on tämä.
intDiff on vain askeettinen asia, jotta ohjelma tietää mitä kirjoittaa pelin vaikeuden vuoksi.
intGameSpeed on asetettu mihin tahansa intGameSpeedMedium on, eli se on asetettu keskivaikeuteen.
Seuraavaksi laita tämä koodi Void Setupiin juuri syöttämäsi koodin alle.
lcdLeft.begin (16, 2); lcdRight.begin (16, 2);
Sarja.alku (9600);
Tämä käskee arduinoa aloittamaan viestinnän tietokoneen kanssa sarjamonitorin kautta (näkyy napsauttamalla arduino IDE: n oikeassa yläkulmassa olevaa painiketta).
Void -asennuksesi pitäisi nyt näyttää tältä!
void setup () {Serial.begin (9600); // sarjamonitorin käynnistäminen // muuttujien määrittäminen bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // aloita lcd: n lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }
Vaihe 4: Silmukkatoiminto
Silmukotoiminto suoritetaan arduinon toimesta joka kerta.
Kopioi seuraava koodi Void Loopiin.
tyhjä silmukka () {input (); // tarkista pelinsyöttö jos (bolPlay == true) {if (intTick> = intDelay) {// tarkista onko pelin pelattava vuoro vai odotettava edelleen Serial.println ("~~~~~~~ ~~ "); // tulosta merkitsemään taulun siirtymistä // writeSerial (); // jos vaihtoehto on käytössä, kirjoita levy sarjapainikkeisiinGame (); // tarkista pelaajatulot playBoard (); // siirrä levyä ja lisää uusi ruutu clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä levy LCD -näytön pohjaanCheck (); intTick = 0; // nollaa intTick} else {buttonsGame (); // tarkista pelaajatulot clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä taulu lcd: n intTick = intTick + intGameSpeed; // lisää rasti}} else {clearLcd (); // puhdista nestekidenäytöt ennen otsikon () piirtämistä; // näytä otsikko- ja pistetiedot -painikkeetValikko (); // lukea soittimen tulo clearBoard (); // varmista koko levy = 0} viive (10); // viivyttää arduinoa lyhyellä hetkellä}
kun bolPlay on yhtä kuin tosi, se tarkoittaa, että peliä pelataan, ja kaikki pelin pelaamiseen tarvittavat koodit on suoritettava, mutta haluamme vain, että lauta lisää uuden laatan ja siirtyy alas, kun intTick on suurempi kuin intDelay, muutoin haluamme edelleen sallia käyttäjän painaa painiketta osuakseen ruutuun ja intTickin nopeuden lisäämiseksi.
Suurin osa tästä koodista käyttää toimintoja, joita olemme vielä tekemättä, ja teemme ne seuraavissa vaiheissa. Näiden toimintojen tarkoitus on seuraava.
Syöttö lukee mitä painikkeita käyttäjä on painanut.
buttonGame ohjaa, mitä painikkeet tekevät pelissä, ei valikossa
playBoard lisää uuden laatan laudalle ja siirtää sitten kaikki pelilaudan yhden tilan alaspäin
clearLCD puhdistaa nestekidenäytöt varmistaakseen, ettei aaveita jää laattojen taakse
drawBoard käy läpi arrGame ja tulostaa sen nestekidenäytöille
clearBoard tyhjentää koko arrGame, kun peli ei ole pelissä
bottomCheck tarkistaa arrGamen pohjan vikatilanteen varalta
otsikko näyttää pelin otsikon ja tulokset, kun se on valikossa
-painikkeiden valikko ohjaa, mitä käyttäjän syötteet tekevät valikossa.
gameOver on toinen toiminto, vaikka sitä ei kutsuta täällä, koska sitä kutsutaan alhaalla Tarkista ja painikkeetPelitoiminnot.
Vaihe 5: ClearLCD -toiminto
funktion luomiseksi aloitamme lisäämällä tämän koodiin
void functionName () {
}
"functionName" voi olla mikä tahansa, kunhan sitä ei ole jo olemassa.
Kopioi tämä koodi ohjelmaan:
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 (""); }}}
tämä kulkee koko taulukon läpi käyttämällä 2 laskettua silmukkaa kulkemaan jokaisen nestekidenäytön pisteen läpi ja kirjoittamaan välilyönti.
Ilman nollaus mitään nestekidenäytöt säilyttävät sen, mitä aiemmin on kirjoitettu
Vaihe 6: DrawBoard -toiminto
kopioi tämä koodi ohjelmaan
void drawBoard () {for (int i = 1; i <= 15; i ++) {// piirrä kollot 1 ja 2 vasemmalla nestekidenäytöllä // jos ruutu = 0 kirjoita mitään, = 1 kirjoita "#", = 2 kirjoita "@" lcdLeft.setCursor (i, 1); // aseta ensimmäiseen sarakkeeseen (kauimpana vasemmalla), jos (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // aseta toiseen sarakkeeseen (keskellä vasemmalla), jos (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // aseta kolmanteen sarakkeeseen (keskellä oikealla) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // asetetaan neljännelle sarakkeelle (kauimpana oikealla) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}
tämä käyttää silmukkaa kulkemaan taulun jokaisen rivin läpi ja tarkistaa sitten, onko rivin sarake yhtä kuin 1 tai 2, minkä perusteella se tulostaa nestekidenäytölle joko hashtagin, jotta ruutu on vielä osuma tai @ osumatilaatalle.
Vaihe 7: PlayBoard -toiminto
kopioi tämä koodi ohjelmaan.
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // tyhjennä ylärivi arrGame [0] [satunnainen (0, 4)] = 1; // aseta yläriville satunnainen piste ruutuksi (int i = 15; i> = 1; i-) {// joka toimii levyn alareunasta ylöspäin (int ii = 0; ii <= 3; ii ++) {// kullekin kollumille arrGame [ii] = arrGame [i - 1] [ii]; }}}
tämä koodi alkaa tyhjentämällä koko ylärivin 0: ksi tai ei ollenkaan laattaksi ja asettaa sitten yhden satunnaisen ruudun 1: ksi.
Sitten se kulkee lasketun silmukan läpi taaksepäin, 15: stä 1: een, asettamalla rivin yhtä suureksi sen yläpuolella olevan rivin kanssa, jolloin levy siirtyy LCD -näytön alaspäin
Vaihe 8: ClearBoard -toiminto
kopioi tämä koodi ohjelmaan.
void clearBoard () {// nollaa rasti- ja viivearvot intTick = 0; intDelay = 1000; // käy läpi lauta ja aseta kaikki arvoksi 0 (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
Tämä koodi ajetaan, kun peliä ei pelata, jotta varmistetaan, että koko arrGame on asetettu arvoon 0 tai ei yhtään laattaa, käyttämällä laskettuja silmukoita matriisin läpi.
Koodi nollaa myös intDelay- ja intTick -arvot.
Vaihe 9: Otsikkotoiminto
kopioi seuraava koodi ohjelmaan
void title () {// kirjoita otsikko nestekidenäyttöön ja tilaa pisteille lcdRight.setCursor (0, 0); lcdRight.write ("Piano Laatat"); lcdRight.setCursor (0, 1); lcdRight.write ("Pisteet:"); // muuntaa pisteet merkkijonoksi char strScore [3]; sprintf (strScore, "%d", intScore); // näyttää pisteet nestekidenäytölle lcdRight.write (strScore); // lisää vaikeasti lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Helppo"); } jos (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Kova"); } // Paina hieman käskyä lcdLeft.setCursor (0, 0); lcdLeft.write ("Paina Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("aloittaa!"); }
Tämä koodi kirjoittaa pelin nimen ja pistemäärän nestekidenäytöille. Se tekee tämän kertomalla nestekidenäytölle, mistä aloittaa kirjoittaminen LCD.setCursorilla ja kirjoittamalla merkkijono LCD.write -muodossa.
Täällä luodaan myös uusi muuttuja, strScore, jota käytetään muuntamaan intScore merkkijonoksi tai char -tietotyypiksi sprintf -funktion avulla.
Tässä käytetään myös intDiffia, joka tulostaa eri vaikeusvaihtoehdot arvojensa perusteella.
Vaihe 10: ButtonsMenu -toiminto
lisää seuraava koodi ohjelmaan
void buttonsMenu () {// kun enter -näppäintä painetaan, aloita peli ja nollaa pistearvo, jos (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kun painiketta 3 painetaan, ota käyttöön virheenkorjausmahdollisuus tulostaa levy sarjana, jos (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = tosi; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = epätosi; }} // aseta pelin nopeus vaikeaksi, jos (intInput == 0) {Serial.print ("Game set to easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms kiihdytys" "); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // aseta pelin nopeus keskivaikeaksi, jos (intInput == 1) {Serial.print ("Game set to medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms kiihdytys" "); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // aseta pelin nopeus vaikeaksi, jos (intInput == 2) {Serial.print ("Game set to hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms kiihdytys" "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
tämä koodi suoritetaan vain, kun bolPlay on yhtä kuin epätosi silmukassa
jos intEnter on asetettu arvoon 1, se tarkoittaa, että enter -painiketta on painettu, ja jos sitä painetaan, ohjelma asettaa bolPlay -asetukseksi tosi ja peli alkaa.
Ohjelma lukee sitten, mitä intInput on yhtä suuri. jos se on 0, ensimmäistä painiketta vasemmalta painetaan, oikealle ylöspäin 3. Jos intInput on 4, mitään painiketta ei paineta.
Jos painat painikkeita 0-2, peli muuttaa vaikeutta ja muuttaa myös pelin nopeusarvoa, mikä tarkoittaa, että se kiihtyy nopeammin.
Jos painiketta 3 painetaan, peli aktivoi tai poistaa käytöstä virheenkorjaustilan, jossa koko levy on tulostettu sarjamonitoriin helpottamaan ohjelman ongelmien löytämistä.
Vaihe 11: ButtonsGame -toiminto
kopioi seuraava koodi ohjelmaan
void buttonsGame () {if (intInput! = 4) {// jos painiketta painetaan, jos (bolTilePressed == false) {// vain jos bolTilePressed on väärä laukaisutoiminto painikkeen painamisen tarkistamiseksi bolTilePressed = true; // aseta sitten bolTilePressed arvoon true, jotta se ei käynnisty vahingossa uudelleen int intLowestTile = 0; // asetetaan ruutuun, jossa on alin ruutu int intCheckedTile = 15; // seurataksesi mitä ruutuja on tarkistettu (intLowestTile == 0) {// niin kauan kuin se ei ole asetettu mihinkään tarkista ruudut (int i = 0; i 100) {// niin kauan kuin int viive on vähintään 100 intDelay = intDelay - 20; // ota siitä arvo}} else {Serial.println ("Väärää painiketta painettu"); peli ohi(); // muuten peli ohi}}}}}
Koodi suoritetaan vain, kun bolPlay on yhtä kuin tyhjä silmukka.
Kuten painikkeetValikko intInput -arvon perusteella tarkistaa, onko pelaaja osunut ruutuun vai ohittanut sen.
Se tekee tämän käymällä arrGame alhaalta ylös käyttämällä while -silmukkaa etsimään, mikä rivi on alin unhit -ruudun kanssa. Sitten se tarkistaa, onko kyseisellä rivillä oleva kohta, joka vastaa painettua painiketta, unhi laatta vai ei, jos se on unhit, se asettaa sen arvoksi 2 eikä 1, mikä tarkoittaa, että se näkyy @: na, muuten se käynnistää pelin toiminto, jota emme ole vielä luoneet.
Tämä toiminto käyttää myös bolTilePressed -muuttujaa asettamalla sen arvoksi true, kun painiketta painetaan, ja false, kun mitään painiketta ei paineta. Tällä varmistetaan, että käyttäjä ei vahingossa menetä peliä, koska ohjelma luuli painavansa painiketta useita kertoja pitäessään sitä painettuna.
Vaihe 12: GameOver -toiminto
Kopioi seuraava koodi ohjelmaan
void gameOver () {Serial.println ("Game Over!"); Serial.print ("Pisteesi oli:"); Sarja.println (intScore); Serial.print ("Nopeutesi oli:"); Serial.println (intDelay); bolPlay = epätosi; }
Tämä käynnistyy joko checkBottom- tai painikepeli -toiminnoilla ja laukaisee pelin päättymisen asettamalla bolPlay -arvon vääriksi.
Se tulostaa myös viestin sarjamonitoriin käyttäjien pisteistä ja nopeusruudut lisättiin millisekunteina.
Vaihe 13: Tulotoiminto
Kopioi seuraava koodi ohjelmaan.
void input () {intEnter = digitalRead (btnEnter); // read enter // lue, mitkä muut tulot, tai jos mikään ei ole asetettu arvoon 4, jos (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; }}}} // sarja tulostaa syötteet if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Sarja.println (intInput); } else {// jos mitään painiketta ei paineta, nollaa bolTilePressed bolTilePressed = false; }}
Tätä koodia käytetään painikkeiden Peli ja painikkeet Valikkotoimintojen kanssa. Käyttäjä on painanut painikkeiden perusteella intInput -arvon tai jos mitään painiketta ei paineta, intInput -arvoksi tulee 4.
Jos mitään painiketta ei paineta, bolTilePressed nollataan painikkeilleGame -toiminto.
Se tulostaa myös viestin sarjamonitorille, jossa painiketta painetaan.
Vaihe 14: BottomCheck -toiminto
kopioi seuraava koodi ohjelmaan.
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 sarakkeelle if (arrGame [15] == 1) {// jos ruutu on alareunassa Sarja.println ("Laatta alareunassa"); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); peli ohi(); }}}
silmukan avulla tämä koodi tarkistaa arrGame -rivin alimman rivin mahdollisten unhit -laattojen varalta (laatat yhtä suuret kuin 1). Jos näytön alareunassa on unhit -laatta, se vilkuttaa ruutua ja käynnistää pelin.
Vaihe 15: WriteSerial -toiminto
kopioi seuraava koodi ohjelmaan
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 (","); } Sarja.println (""); }}}
Tätä toimintoa seuraa debug -vaihtoehto, joka voidaan ottaa käyttöön painikkeilla Valikko. Jos bolSerialBoard on asetettu arvoon true tässä toiminnossa, se käy läpi arrGame -ohjelman ja tulostaa koko kortin sarjamonitoriksi testausta varten taulukon avulla.
Vaihe 16: Valmistuminen
Koko koodisi ei pitäisi olla täydellinen ja näyttää tältä!
/ * * Nimi - pianolaatat; Arduino * By - Domenic Marulli * Päivämäärä - 11/ *
/ sisältää kirjastoja
#sisältää
// nämä muuttujat ovat vaihtoehtoja, joita voit muuttaa - suuremmat luvut = nopeampi pelin nopeus
int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;
// Määritä nastat
Syötä A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18
// luo LCD -objekteja (n, ~, n, ~, ~, n)
LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);
// aseta peliryhmä
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}};
// asettaa muuttujia pelille
boolean bolPlay; // kappaleet, jos pelaaja int intScore; // seuraa pelaajan pistettä intDiff; // vain esteettinen asia kertomaan, kuinka vaikeaa peli on
// määritä muuttujat syötettäväksi
int intEnter; // seuraa, jos käyttäjä painaa enter -painiketta int intInput; // seuraa mitä painikkeita käyttäjä painaa boolean bolTilePressed; // Varmista, että pelaaja ei vahingossa paina painiketta 5x ja häviä
// aseta muuttujat käännökselle
int intTick; // laskee milliä (silmukkaa kohden) asti intDelay int intDelay; // aika, jonka ohjelma odottaa seuraavaan kierrokseen millis int intGameSpeed;
// virheenkorjausvaihtoehtojen lopettaminen
boolean bolSerialBoard; // kun true, tulostaa levyn sarjamonitorissa
// asetus, joka suoritetaan kerran
void setup () {Serial.begin (9600); // sarjamonitorin käynnistäminen // muuttujien määrittäminen bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // aloita lcd: n lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }
// silmukka, joka suoritetaan 10 millisekunnin välein
tyhjä silmukka () {input (); // tarkista pelinsyöttö jos (bolPlay == true) {if (intTick> = intDelay) {// tarkista onko pelin pelattava vuoro vai odotettava edelleen Serial.println ("~~~~~~~ ~~ "); // tulosta merkitsemään taulun siirtymistä // writeSerial (); // jos vaihtoehto on käytössä, kirjoita levy sarjapainikkeisiinGame (); // tarkista pelaajatulot playBoard (); // siirrä levyä ja lisää uusi ruutu clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä levy LCD -näytön pohjaanCheck (); intTick = 0; // nollaa intTick} else {buttonsGame (); // tarkista pelaajatulot clearLcd (); // puhdista nestekidenäytöt ennen piirtämistä drawBoard (); // piirrä taulu lcd: n intTick = intTick + intGameSpeed; // lisää rasti}} else {clearLcd (); // puhdista nestekidenäytöt ennen otsikon () piirtämistä; // näytä otsikko- ja pistetiedot -painikkeetValikko (); // lukea soittimen tulo clearBoard (); // varmista koko levy = 0} viive (10); // viivyttää arduinoa lyhyellä hetkellä}
// puhdistaa lcd: n, joten kaikki syöttämättömät solut eivät jää sinne
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 (""); }}}
// vetää taulun lcd: n päälle
void drawBoard () {for (int i = 1; i <= 15; i ++) {// piirrä kollot 1 ja 2 vasemmalla nestekidenäytöllä // jos ruutu = 0 kirjoita mitään, = 1 kirjoita "#", = 2 kirjoita "@" lcdLeft.setCursor (i, 1); // aseta ensimmäiseen sarakkeeseen (kauimpana vasemmalla), jos (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // aseta toiseen sarakkeeseen (keskellä vasemmalla), jos (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // aseta kolmanteen sarakkeeseen (keskellä oikealla) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // asetetaan neljännelle sarakkeelle (kauimpana oikealla) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}
// siirtää taulua alaspäin ja asettaa satunnaisen arvon laattaksi
void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // tyhjennä ylärivi arrGame [0] [satunnainen (0, 4)] = 1; // aseta yläriville satunnainen piste ruutuksi (int i = 15; i> = 1; i-) {// joka toimii levyn alareunasta ylöspäin (int ii = 0; ii <= 3; ii ++) {// kullekin kollumille arrGame [ii] = arrGame [i - 1] [ii]; }}}
// asettaa koko kortin 0: ksi ja palauttaa muuttujat esipeliksi
void clearBoard () {// nollaa rasti- ja viivearvot intTick = 0; intDelay = 1000; // käy läpi lauta ja aseta kaikki arvoksi 0 (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}
// näyttää päävalikon nestekidenäytöissä
void title () {// kirjoita otsikko nestekidenäyttöön ja tilaa pisteille lcdRight.setCursor (0, 0); lcdRight.write ("Piano Laatat"); lcdRight.setCursor (0, 1); lcdRight.write ("Pisteet:"); // muuntaa pisteet merkkijonoksi char strScore [3]; sprintf (strScore, "%d", intScore); // näyttää pisteet nestekidenäytölle lcdRight.write (strScore); // lisää vaikeasti lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Helppo"); } jos (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Kova"); } // Paina hieman käskyä lcdLeft.setCursor (0, 0); lcdLeft.write ("Paina Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("aloittaa!"); }
// tarkistaa painikkeet ja mitä tehdä niille pelin ulkopuolella
void buttonsMenu () {// kun enter -näppäintä painetaan, aloita peli ja nollaa pistearvo, jos (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // kun painiketta 3 painetaan, ota käyttöön virheenkorjausmahdollisuus tulostaa levy sarjana, jos (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = tosi; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = epätosi; }} // aseta pelin nopeus vaikeaksi, jos (intInput == 0) {Serial.print ("Game set to easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms kiihdytys" "); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // aseta pelin nopeus keskivaikeaksi, jos (intInput == 1) {Serial.print ("Game set to medium ("); Serial.print (intGameSpeedMedium); Serial.println ("ms kiihdytys" "); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // aseta pelin nopeus vaikeaksi, jos (intInput == 2) {Serial.print ("Game set to hard ("); Serial.print (intGameSpeedHard); Serial.println ("ms kiihdytys" "); intDiff = 2; intGameSpeed = intGameSpeedHard; }}
// tarkistaa painikkeet ja mitä tehdä niille pelin aikana
void buttonsGame () {if (intInput! = 4) {// jos painiketta painetaan, jos (bolTilePressed == false) {// vain jos bolTilePressed on väärä laukaisutoiminto painikkeen painamisen tarkistamiseksi bolTilePressed = true; // aseta sitten bolTilePressed arvoon true, jotta se ei käynnisty vahingossa uudelleen int intLowestTile = 0; // asetetaan ruutuun, jossa on alin ruutu int intCheckedTile = 15; // seurataksesi mitä ruutuja on tarkistettu (intLowestTile == 0) {// niin kauan kuin se ei ole asetettu mihinkään tarkista ruudut (int i = 0; i 100) {// niin kauan kuin int viive on vähintään 100 intDelay = intDelay - 20; // ota siitä arvo}} else {Serial.println ("Väärää painiketta painettu"); peli ohi(); // muuten peli ohi}}}}}
void gameOver () {
Serial.println ("Peli ohi!"); Serial.print ("Pisteesi oli:"); Sarja.println (intScore); Serial.print ("Nopeutesi oli:"); Serial.println (intDelay); bolPlay = epätosi; }
// tarkistaa pelaajan syötteen
void input () {intEnter = digitalRead (btnEnter); // read enter // lue, mitkä muut tulot, tai jos mikään ei ole asetettu arvoon 4, jos (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; }}}} // sarja tulostaa syötteet if (intEnter == 1) {Serial.println ("Enter Pressed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Sarja.println (intInput); } else {// jos mitään painiketta ei paineta, nollaa bolTilePressed bolTilePressed = false; }}
// tarkistaa levyn pohjan vikojen varalta
void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 sarakkeelle if (arrGame [15] == 1) {// jos ruutu on alareunassa Sarja.println ("Laatta alareunassa"); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); arrGame [15] = 2; drawBoard (); viive (400); arrGame [15] = 1; drawBoard (); viive (400); peli ohi(); }}}
// tulostaa levyn sarjamonitoriin, jos bolSerialBoard on tosi
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 (","); } Sarja.println (""); }}}
Kun kaikki koodi on syötetty, lataa arduinoosi ja nauti!
Suositeltava:
Arduino Nano - Arduino Uno -sovitin: 6 vaihetta (kuvilla)
Arduino Nano - Arduino Uno -sovitin: Arduino Nano on mukava, pieni ja halpa Arduino -perheen jäsen. Se perustuu Atmega328 -siruun, mikä tekee siitä yhtä voimakkaan kuin hänen veljensä Arduino Uno, mutta sen voi saada pienemmällä rahalla. Ebayssa kiinalaiset versiot voivat nyt
Pultti - DIY -langaton latauskello (6 vaihetta): 6 vaihetta (kuvilla)
Pultti - DIY -langaton latausyökello (6 vaihetta): Induktiiviset lataukset (tunnetaan myös nimellä langaton lataus tai langaton lataus) on langattoman voimansiirron tyyppi. Se käyttää sähkömagneettista induktiota sähkön tuottamiseen kannettaville laitteille. Yleisin sovellus on langaton Qi -latauslaite
Pitkä kantama, 1,8 km, Arduino-Arduino Langaton tiedonsiirto HC-12: n kanssa: 6 vaihetta (kuvilla)
Pitkä kantama, 1,8 km, Arduino-Arduino Langaton tiedonsiirto HC-12: n avulla: Tässä ohjeessa opit kommunikoimaan Arduinojen välillä pitkän matkan, jopa 1,8 km: n päässä ulkona. HC-12 on langaton sarjaportti viestintämoduuli, joka on erittäin hyödyllinen, erittäin tehokas ja helppokäyttöinen. Ensin otat
Halvin Arduino -- Pienin Arduino -- Arduino Pro Mini -- Ohjelmointi -- Arduino Neno: 6 vaihetta (kuvilla)
Halvin Arduino || Pienin Arduino || Arduino Pro Mini || Ohjelmointi || Arduino Neno: …………………………. Tilaa YouTube -kanavani saadaksesi lisää videoita ……. Tässä projektissa keskitytään kaikkien aikojen pienimpään ja halvinan arduinoon. Pienin ja halvin arduino on arduino pro mini. Se muistuttaa arduinoa
LED -matriisijoukon ohjaaminen Arduino Unolla (Arduino -käyttöinen robotti): 4 vaihetta (kuvilla)
LED -matriisiohjaimen ohjaaminen Arduino Unolla (Arduino -käyttöinen robottikasvo): Tämä ohje näyttää kuinka hallita 8x8 LED -matriisiryhmää Arduino Unolla. Tätä opasta voidaan käyttää luomaan yksinkertainen (ja suhteellisen halpa näyttö) omille projekteillesi. Tällä tavalla saatat näyttää kirjaimia, numeroita tai mukautettuja animaatioita