Stap 4: Uw Arduino Gameboy Program
Er zijn veel programma's die u op dit systeem downloaden kunt. Een van hen is vrachtwagen lane (niet door mij gemaakt maar aangepast voor dit systeem)De code is:
#include < LiquidCrystal.h >
LiquidCrystal weergeven
initialiseren van de bibliotheek met de nummers van de pennen van de interface
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
Stuurwiel potentiometer
Const int POTPIN = 1;
Const int MAXPOT = 800; geen behoefte om te zetten van het wiel helemaal naar 1023 :)
Piëzo-luidspreker
Const int SPEAKERPIN = 9;
Const int RANDSEEDPIN = 0; een analoge pin die is niet met om het even wat verbonden
Const int MAXSTEPDURATION = 300; Begin langzaam, elke stap 1 millisec korter is.
Const int MINSTEPDURATION = 150; Dit is net zo snel als het wordt
Const int NGLYPHS = 6;
de glyphs worden gedefinieerd vanaf 1 (niet 0),
om lcd.print() van null eindigende tekenreeksen
byte glyphs [NGLYPHS] [8] = {}
1: auto omhoog
{B00000,
B01110,
B11111,
B01010,
B00000,
B00000,
B00000,
B00000}
2: auto neer
, {B00000,
B00000,
B00000,
B00000,
B01110,
B11111,
B01010,
B00000}
3: vrachtwagen omhoog
, {B00000,
B11110,
B11111,
B01010,
B00000,
B00000,
B00000,
B00000}
4: vrachtwagen neer
, {B00000,
B00000,
B00000,
B00000,
B11110,
B11111,
B01010,
B00000}
5: crash omhoog
, {B10101,
B01110,
B01110,
B10101,
B00000,
B00000,
B00000,
B00000}
6: crash naar beneden
, {B00000,
B00000,
B00000,
B10101,
B01110,
B01110,
B10101,
B00000}
};
Const int NCARPOSITIONS = 4;
Elke positie is toegewezen aan een kolom van 2 glyphs
Gebruikt voor het maken van gevoel als ik had een 5e positie
waar de auto of crash was getekend als 2 glyphs
(dat niet omdat 0 strijkers beëindigt),
dus het is nu beetje dom, maar het niet kapot :)
const char BLANK = 32;
char car2glyphs [NCARPOSITIONS] [2] = {}
{1, BLANK}, {2, LEEG}, {LEEG, 1}, {LEEG, 2}
};
char truck2glyphs [NCARPOSITIONS] [2] = {}
{3, LEGE}, {4, LEEG}, {LEEG, 3}, {LEEG, 4}
};
char crash2glyphs [NCARPOSITIONS] [2] = {}
{5, LEEG}, {6, LEEG}, {LEEG, 5}, {LEEG, 6}
};
Const int ROADLEN = 15; LCD breedte (niet tellen onze auto)
int weg [ROADLEN]; standpunten van andere auto 's
char line_buff [2 + ROADLEN]; AUX tekenreeks voor drawRoad()
int road_index;
int car_pos;
Off-the-grid positie betekent lege kolom, zo MAXROADPOS
Hiermee bepaalt u de waarschijnlijkheid van een auto in een kolom
bijvoorbeeld 3 * NCARPOSITIONS geeft p = 1/3
Const int MAXROADPOS = 3 * NCARPOSITIONS;
int step_duration;
int crash; True als crashte
unsigned int crashtime; Millis() bij neergestort
Const int CRASHSOUNDDURATION = 250;
const char * INTRO1 = "Trucks vooruit,";
const char * INTRO2 = "Drive zorgvuldig";
Const int INTRODELAY = 2000;
VOID Setup
{
crash = crashtime = road_index = 0;
step_duration = MAXSTEPDURATION;
line_buff [1 + ROADLEN] = '\0'; Null beëindigen
randomSeed(analogRead(RANDSEEDPIN));
for (int i = 0; ik < NGLYPHS; i ++) {}
lcd.createChar(i+1,glyphs[i]);
}
for (int i = 0; ik < ROADLEN; i ++) {}
weg [i] =-1;
}
pinMode(SPEAKERPIN,OUTPUT);
analogWrite(SPEAKERPIN,0); om op de veilige kant
LCD.begin(16,2);
getSteeringWheel();
drawRoad();
lcd.setCursor(1,0);
LCD.Print(INTRO1);
lcd.setCursor(1,1);
LCD.Print(INTRO2);
delay(INTRODELAY);
}
void loop {}
niet-ondertekende lang = millis ()-INTRODELAY;
Als (! crash) {}
getSteeringWheel();
crash = (car_pos==road[road_index]);
}
Als (crash) {}
Als (! crashtime) {}
crashtime = nu;
drawRoad();
Spel over tekst
(eerste 2 kolommen van de "crash" intact houden)
lcd.setCursor(2,0);
LCD.Print ("gecrashte na");
lcd.setCursor(2,1);
LCD.Print(Now/1000);
LCD.Print ("seconden.");
}
Als ((now-crashtime) < CRASHSOUNDDURATION) {}
analogWrite(SPEAKERPIN,random(255)); witte ruis
}
else {}
analogWrite(SPEAKERPIN,0); dramatische na crush zwijgen :)
}
delay(10); Wachten een beetje tussen schrijft
}
else {}
int prev_pos weg = [(road_index-1) % ROADLEN];
int this_pos = random(MAXROADPOS);
terwijl (abs(this_pos-prev_pos) < 2) {/ / de weg niet jam
this_pos = random(MAXROADPOS);
}
weg [road_index] = this_pos;
road_index = (road_index + 1) % ROADLEN;
drawRoad();
delay(step_duration);
Als (step_duration > MINSTEPDURATION) {}
step_duration--; sneller gaan
}
}
}
ongeldig getSteeringWheel() {}
car_pos = map(analogRead(POTPIN),0,1024,0,NCARPOSITIONS);
}
ongeldig drawRoad() {}
for (int i = 0; ik < 2; i ++) {}
Als (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 weg = [(j+road_index) % ROADLEN];
line_buff [j + 1] = pos > = 0 & & pos < NCARPOSITIONS? truck2glyphs [pos] [i]: leeg;
}
lcd.setCursor(0,i);
LCD.Print(line_buff);
}
}