simple car game
easy to make but take care for the wiring of lcd to arduino
let's make
material needed:-
- Arduino uno
- 16x2 lcd
- battery
- 10k potentiometer(2 pcs.)
- switch (needed for backlight)
- jumper wire
- breadbord(not necessary)
instructions:-
-
first connect arduino 5v & gnd to breadboard
_________________________________________________________________________________________
-
connect lcd to arduino
you should connect arduino to lcd
connections are as follow from left to right- lcd--->arduino
- 1--->gnd
- 2--->5v
- 3--->potentiometer(as shown in picture)
- 4--->D8
- 5--->gnd
- 6--->D9
- 7--->leave
- 8--->leave
- 9--->leave
- 10--->leave
- 11--->D6
- 12--->D5
- 13--->D4
- 14--->D3
- 15--->5v(using switch)
- 16--->gnd
connect potentiometer to A1
do as shown in image it will use to control the game
/* Simple Car game * by AREEBURRUB * Website http://areeburrub.page.tl */ #include <LiquidCrystal.h> // LiquidCrystal display // You can use any Hitachi HD44780 compatible. Wiring explained at // http://www.arduino.cc/en/Tutorial/LiquidCrystal LiquidCrystal lcd(8, 9, 6, 5, 4, 3); // Steering wheel potentiometer const int POTPIN = A1; const int MAXPOT = 690; // no need to turn the wheel all the way to 1023 :) // Piezo speaker const int SPEAKERPIN = A9; const int RANDSEEDPIN = A0; // an analog pin that isn't connected //to anything it is used for more random result const int MAXSTEPDURATION = 300; // Start slowly, each step is 1 millisec shorter. const int MINSTEPDURATION = 150; // This is as fast as it gets const int NGLYPHS = 6; // the glyphs will be defined starting from 1 (not 0), // to enable lcd.print() of null-terminated strings byte glyphs[NGLYPHS][8] = { // 1: car up { B00000, B01110, B11111, B01010, B00000, B00000, B00000, B00000} // 2: car down ,{B00000, B00000, B00000, B00000, B01110, B11111, B01010, B00000} // 3: truck up ,{B00000, B11110, B11111, B01010, B00000, B00000, B00000, B00000} // 4: truck down ,{B00000, B00000, B00000, B00000, B11110, B11111, B01010, B00000} // 5: crash up ,{B10101, B01110, B01110, B10101, B00000, B00000, B00000, B00000} // 6: crash down ,{B00000, B00000, B00000, B10101, B01110, B01110, B10101, B00000} }; const int NCARPOSITIONS = 4; // Each position is mapped to a column of 2 glyphs // Used to make sense when I had a 5th position // where car or crash was drawn as 2 glyphs // (can't do that since 0 terminates strings), // so it's kinda silly now, but it ain't broke :) const char BLANK=32; char car2glyphs[NCARPOSITIONS][2] = { {1,BLANK},{2,BLANK},{BLANK,1},{BLANK,2} }; char truck2glyphs[NCARPOSITIONS][2] = { {3,BLANK},{4,BLANK},{BLANK,3},{BLANK,4} }; char crash2glyphs[NCARPOSITIONS][2] = { {5,BLANK},{6,BLANK},{BLANK,5},{BLANK,6} }; const int ROADLEN = 15; // LCD width (not counting our car) int road[ROADLEN]; // positions of other cars char line_buff[2+ROADLEN]; // aux string for drawRoad() int road_index; int car_pos; // Off-the-grid position means empty column, so MAXROADPOS // determines the probability of a car in a column // e.g. 3*NCARPOSITIONS gives p=1/3 const int MAXROADPOS = 3*NCARPOSITIONS; int step_duration; int crash; // true if crashed unsigned int crashtime; // millis() when crashed const int CRASHSOUNDDURATION = 250; const char *INTRO1="Trucks by Areeb-ur-Rub";//don't change it const int INTRODELAY = 2000;//don't change it void setup() { crash = crashtime = road_index = 0; step_duration = MAXSTEPDURATION; line_buff[1+ROADLEN] = '\0'; // null terminate it randomSeed(analogRead(RANDSEEDPIN)); for (int i=0; i<NGLYPHS; i++) { lcd.createChar(i+1,glyphs[i]); } for (int i=0; i<ROADLEN; i++) { road[i]=-1; } pinMode(SPEAKERPIN,OUTPUT); analogWrite(SPEAKERPIN,0); // to be on the safe side lcd.begin(16,2); getSteeringWheel(); drawRoad(); lcd.setCursor(1,0); lcd.print(INTRO1); for (int positionCounter = 0; positionCounter < 40; positionCounter++) { // scroll one position right: lcd.scrollDisplayLeft(); // wait a bit: delay(250); } delay(INTRODELAY); } void loop() { unsigned long now = millis()-INTRODELAY; if (!crash) { drawRoad(); getSteeringWheel(); crash = (car_pos==road[road_index]); } if (crash) { if (!crashtime) { crashtime=now; // Game over text // (keep first 2 "crash" columns intact) lcd.clear(); lcd.setCursor(0,0); lcd.print("Crash in"); lcd.setCursor(9,0); lcd.print(now/1000); lcd.print("sec"); } if ((now-crashtime)<CRASHSOUNDDURATION) { analogWrite(SPEAKERPIN,random(255)); // white noise } else { analogWrite(SPEAKERPIN,0); // dramatic post-crush silence :) } delay(10); // Wait a bit between writes } else { int prev_pos = road[(road_index-1)%ROADLEN]; int this_pos = random(MAXROADPOS); while (abs(this_pos-prev_pos)<2) { // don't jam the road this_pos = random(MAXROADPOS); } road[road_index] = this_pos; road_index = (road_index+1)%ROADLEN; drawRoad(); delay(step_duration); if (step_duration>MINSTEPDURATION) { step_duration--; // go faster } } } void getSteeringWheel() { car_pos = map(analogRead(POTPIN),0,1023,0,NCARPOSITIONS); } void drawRoad() { for (int i=0; i<2; i++) { if (crash) { line_buff[0]=crash2glyphs[car_pos][i]; } else { line_buff[0]=car2glyphs[car_pos][i]; } for (int j=0; j<ROADLEN; j++) { int pos = road[(j+road_index)%ROADLEN]; line_buff[j+1] = pos>=0 && pos<NCARPOSITIONS ? truck2glyphs[pos][i] : BLANK; } lcd.setCursor(0,i); lcd.print(line_buff); } } |