Introduction: DIY Game Console Using Arduino
In this tutorial I'm going to show you that how can you make a gaming console using Arduino nano. So if you want to see detailed video on it then check it out on my youtube channel
Supplies
If you buy from this links it will help me give you more projects
1) ARDUINO NANO
2) OLED DISPLAY
3) PUSH BUTTONS
4) WIRES
Step 1: Soldering All the Components
So, after getting all the components you have to solder all the components as shown in this circuit diagram
Step 2: Arrange All the Things in Places
After soldering everything arrange all the components like this to give it a nice look
Step 3: Programing
So, finally after following all the steps properly it's time to upload the code below to Arduino
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <Fonts/FreeSans9pt7b.h> //#include <Fonts/FreeSans12pt7b.h> #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); const int c = 261; const int d = 294; const int e = 329; const int f = 349; const int g = 391; const int gS = 415; const int a = 440; const int aS = 455; const int b = 466; const int cH = 523; const int cSH = 554; const int dH = 587; const int dSH = 622; const int eH = 659; const int fH = 698; const int fSH = 740; const int gH = 784; const int gSH = 830; const int aH = 880; const unsigned char PROGMEM dioda16 [] = { 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x3F, 0xF0, 0x3C, 0x00, 0x3C, 0x00, 0xFF, 0x00, 0x7F, 0xFF, 0x7F, 0xFF, 0xFF, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x1F, 0xF0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00 }; const unsigned char PROGMEM storm [] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x07, 0x80, 0x01, 0xE0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x00, 0x00, 0x18, 0x00, 0x00, 0x18, 0x00, 0x00, 0x30, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xE0, 0x00, 0x01, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xD7, 0xFF, 0xFF, 0xE1, 0x00, 0x01, 0xBF, 0xFC, 0x1F, 0xFA, 0x80, 0x01, 0xBF, 0xF1, 0xCF, 0xFA, 0x80, 0x01, 0x3F, 0xC2, 0x37, 0xF7, 0x80, 0x01, 0xEF, 0x9C, 0x01, 0xE7, 0xC0, 0x01, 0xE0, 0x70, 0x06, 0x06, 0x80, 0x01, 0xE0, 0xC0, 0x03, 0x06, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xFF, 0x80, 0x01, 0xF8, 0x00, 0x00, 0x1D, 0xC0, 0x03, 0x70, 0x00, 0x80, 0x0C, 0x60, 0x05, 0xB0, 0x07, 0xF0, 0x08, 0x90, 0x09, 0x10, 0x1F, 0xF8, 0x09, 0xD0, 0x0B, 0x90, 0x1F, 0x7C, 0x03, 0xF0, 0x0F, 0xC0, 0xFC, 0x0F, 0x07, 0x90, 0x0D, 0x43, 0xC0, 0x03, 0x07, 0x90, 0x05, 0x64, 0x00, 0x00, 0xCF, 0x10, 0x07, 0xFC, 0x00, 0x00, 0x26, 0x10, 0x01, 0x80, 0x00, 0x00, 0x10, 0x20, 0x01, 0x00, 0x00, 0x00, 0x0E, 0x40, 0x01, 0x80, 0x07, 0xF0, 0x01, 0x80, 0x00, 0x80, 0x07, 0xC8, 0x00, 0x80, 0x00, 0x80, 0x0B, 0xE8, 0x00, 0x80, 0x00, 0x87, 0x97, 0xE9, 0xE0, 0x80, 0x00, 0x87, 0xDF, 0xEF, 0xA0, 0x80, 0x00, 0x4B, 0xFF, 0xFF, 0xA0, 0x80, 0x00, 0x6B, 0xDF, 0xFB, 0xA3, 0x00, 0x00, 0x24, 0x97, 0xE8, 0x24, 0x00, 0x00, 0x1E, 0x1F, 0xC0, 0x2C, 0x00, 0x00, 0x07, 0xF8, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00 }; void setup() { pinMode(3,INPUT_PULLUP); pinMode(12,INPUT_PULLUP); pinMode(11,INPUT_PULLUP); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.display(); display.clearDisplay(); display.setTextSize(0); display.drawBitmap(6, 11,storm, 48,48, 1); display.setFont(&FreeSans9pt7b); display.setTextColor(WHITE); display.setCursor(65,14); display.println("xWing"); display.setFont(); display.setCursor(65,17); display.setTextSize(0); display.println("vs"); display.setCursor(0,0); float voltaza=readVcc()/1000; display.println(voltaza);; display.setFont(&FreeSans9pt7b); display.setCursor(65,39); display.println("Death"); display.setFont(); display.setCursor(65,42); display.println("star "); display.setTextSize(0); display.setCursor(65,55); display.println("by VRAJ"); display.setCursor(65,20); display.display(); display.setFont(); beep(a, 500); beep(a, 500); beep(a, 500); beep(f, 350); beep(cH, 150); beep(a, 500); beep(f, 350); beep(cH, 150); beep(a, 650); delay(500); delay(500); } int metx=0; int mety=0; int postoji=0; int nep=8; int smjer=0; int go=0; int rx=95; int ry=0; int rx2=95; int ry2=0; int rx3=95; int ry3=0; int bodovi=0; int brzina=3; //speed of bullet int bkugle=1; int najmanja=600; int najveca=1200; int promjer=10; int rx4=95; int ry4=0; int zivoti=5; int poc=0; int ispaljeno=0; int nivo=1; int centar=95; unsigned long pocetno=0; unsigned long odabrano=0; unsigned long trenutno=0; unsigned long nivovrije=0; int poz=30; void loop() { if(go==0){ display.clearDisplay(); display.drawPixel(50,30,1); display.drawPixel(30,17,1); display.drawPixel(60,18,1); display.drawPixel(55,16,1); display.drawPixel(25,43,1); display.drawPixel(100,43,1); display.drawPixel(117,52,1); display.drawPixel(14,49,1); display.drawPixel(24,24,1); display.drawPixel(78,36,1); display.drawPixel(80,57,1); display.drawPixel(107,11,1); display.drawPixel(150,11,1); display.drawPixel(5,5,1); display.drawPixel(8,7,1); display.drawPixel(70,12,1); display.drawPixel(10,56,1); display.drawPixel(70,25,1); if(poc==0){ pocetno=millis(); odabrano= random(400,1200); poc=1; } trenutno=millis(); //nivoi if((trenutno-nivovrije)>50000) { nivovrije=trenutno; nivo=nivo+1; brzina=brzina+1; //brizna neprijateljevog metka if ( nivo % 2 == 0 ) { bkugle=bkugle+1; promjer=promjer-1; } najmanja=najmanja-50; najveca=najveca-50; } if((odabrano+pocetno)<trenutno) { poc=0; ispaljeno=ispaljeno+1; if(ispaljeno==1) {rx=95; ry=nep;} if(ispaljeno==2){ rx2=95; ry2=nep;} if(ispaljeno==3) { rx3=95; ry3=nep; } if(ispaljeno==4){ rx4=95; ry4=nep; } } if(ispaljeno>0) { display.drawCircle(rx,ry,2,1); rx=rx-brzina;} if(ispaljeno>1) { display.drawCircle(rx2,ry2,1,1); rx2=rx2-brzina;} if(ispaljeno>2) { display.drawCircle(rx3,ry3,4,1); rx3=rx3-brzina;} if(ispaljeno>3) { display.drawCircle(rx4,ry4,2,1); rx4=rx4-brzina;} if(digitalRead(12)==0 && poz>=2){ poz=poz-2;} if(digitalRead(11)==0&& poz<=46){ poz=poz+2;} if(digitalRead(3)==0 && postoji==0) { postoji=1; metx=6; mety=poz+8; tone(9,1200,20); } if(postoji==1) { metx=metx+8 ; display.drawLine(metx,mety,metx+4,mety,1); } display.drawBitmap(4, poz,dioda16, 16,16, 1); display.fillCircle(centar,nep,promjer,1); display.fillCircle(centar+2,nep+3,promjer/3,0); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(33,57); display.println("score:"); display.setCursor(68,57); display.println(bodovi); display.setCursor(33,0); display.println("lives:"); display.setCursor(68,0); display.println(zivoti); display.setCursor(110,0); display.println("L:"); display.setCursor(122,0); display.println(nivo); display.setCursor(108,57); display.println(trenutno/1000); display.display(); if(metx>128)postoji=0; if(smjer==0){ nep=nep+bkugle;} else {nep=nep-bkugle;} if(nep>=(64-promjer)) smjer=1; if(nep<=promjer) smjer=0; if(mety>=nep-promjer && mety<=nep+promjer) if(metx>(centar-promjer)&&metx<(centar+promjer)) { metx=-20; tone(9,500,20); bodovi=bodovi+1; postoji=0; } int pozicija=poz+8; if(ry>=pozicija-8 && ry<=pozicija+8) if(rx<12&&rx>4) { rx=95; ry=-50; tone(9,100,100); zivoti=zivoti-1; } if(ry2>=pozicija-8 && ry2<=pozicija+8) if(rx2<12&&rx2>4) { rx2=-50; ry2=-50; tone(9,100,100); zivoti=zivoti-1; } if(ry3>=pozicija-8 && ry3<=pozicija+8) if(rx3<12&&rx3>4) { rx3=-50; ry3=-50; tone(9,100,100); zivoti=zivoti-1; } if(ry4>=pozicija-8 && ry4<=pozicija+8) if(rx4<12&&rx4>4) { rx4=200; ry4=-50; ispaljeno=0; tone(9,100,100); zivoti=zivoti-1; } if(rx4<1){ ispaljeno=0; rx4=200;} if(zivoti==0) go=1; } if(go==1) { if(zivoti==0){ tone(9,200,300); delay(300); tone(9,250,200); delay(200); tone(9,300,300); delay(300); zivoti=5; } display.clearDisplay(); display.setFont(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(7,10); display.println("GAME OVER!"); display.setTextSize(1); display.setCursor(7,30); display.println("score:"); display.setCursor(44,30); display.println(bodovi); display.setCursor(7,40); display.println("level:"); display.setCursor(44,40); display.println(nivo); display.setCursor(7,50); display.println("time(s):"); display.setCursor(60,50); display.println(trenutno/1000); display.display(); if(digitalRead(3)==0) { tone(9,280,300); delay(300); tone(9,250,200); delay(200); tone(9,370,300); delay(300); ponovo(); } } } void ponovo() { metx=0; mety=0; postoji=0; nep=8; smjer=0; go=0; rx=95; ry=0; rx2=95; ry2=0; rx3=95; ry3=0; bodovi=0; brzina=3; //brizna neprijateljevog metka bkugle=1; najmanja=600; najveca=1200; promjer=12; rx4=95; ry4=0; zivoti=5; poc=0; ispaljeno=0; nivo=1; pocetno=0; odabrano=0; trenutno=0; nivovrije=0; } long readVcc() { // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA,ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts } void beep(int note, int duration) { //Play tone on buzzerPin tone(9, note, duration); delay(duration); noTone(9); delay(50); }
Step 4: Enjoy!!!
Congratulations 🎊 you finally made it so if you liked it then do subscribe to my youtube channel