Arduino Game Boy (4 / 4 steg)
Steg 4: Programmera din Arduino Gameboy
Det finns många program som du kan ladda ner till detta system. En av dem är lastbil lane (inte skapad av mig men modifierade för detta system)Koden är:
#include < LiquidCrystal.h >
LiquidCrystal display
initiera bibliotek med numrerar av gränssnittet stiften
LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
Ratt potentiometer
CONST int POTPIN = 1;
CONST int MAXPOT = 800; utan att behöva vända hjulet hela vägen till 1023 :)
Piezo speaker
CONST int SPEAKERPIN = 9;
CONST int RANDSEEDPIN = 0; en analog stift som inte är kopplad till något
CONST int MAXSTEPDURATION = 300; Börja långsamt, varje steg är 1 millisekunder kortare.
CONST int MINSTEPDURATION = 150; Detta är så fort det blir
CONST int NGLYPHS = 6;
specialtecknen definieras från 1 (inte 0),
Aktivera lcd.print() av null-terminerade strängar
byte tecken [NGLYPHS] [8] = {
1: bil upp
{B00000,
B01110,
B11111,
B01010,
B00000,
B00000,
B00000,
B00000}
2: bil ner
, {B00000,
B00000,
B00000,
B00000,
B01110,
B11111,
B01010,
B00000}
3: lastbil upp
, {B00000,
B11110,
B11111,
B01010,
B00000,
B00000,
B00000,
B00000}
4: lastbil ner
, {B00000,
B00000,
B00000,
B00000,
B11110,
B11111,
B01010,
B00000}
5: crash upp
, {B10101,
B01110,
B01110,
B10101,
B00000,
B00000,
B00000,
B00000}
6: krascha ner
, {B00000,
B00000,
B00000,
B10101,
B01110,
B01110,
B10101,
B00000}
};
CONST int NCARPOSITIONS = 4;
Varje position mappas till en kolumn med 2 tecken
Används för att meningsfullt när jag hade en 5: e position
där bilen eller krasch drogs som 2 glyfer
(kan inte göra det eftersom 0 avslutar strängar),
så det är ganska dumt nu, men det inte är trasigt :)
CONST char BLANK = 32.
char car2glyphs [NCARPOSITIONS] [2] = {
{1, TOM}, {2, TOMT}, {TOMT, 1}, {TOM, 2}
};
char truck2glyphs [NCARPOSITIONS] [2] = {
{3, TOMT}, {4, TOM}, {TOMT, 3}, {TOMT, 4}
};
char crash2glyphs [NCARPOSITIONS] [2] = {
{5, TOM}, {6, TOM}, {TOMT, 5}, {TOMT, 6}
};
CONST int ROADLEN = 15. LCD bredd (inte räknar vår bil)
int road [ROADLEN]; positioner i andra bilar
char line_buff [2 + ROADLEN]; AUX sträng för drawRoad()
int road_index;
int car_pos;
Off-the-grid position betyder tom kolumn, så MAXROADPOS
anger Sannolikheten för att en bil i en kolumn
t.ex. 3 * NCARPOSITIONS ger p = 1/3
CONST int MAXROADPOS = 3 * NCARPOSITIONS;
int step_duration;
int krasch; sant om kraschade
unsigned int crashtime; Millis() när kraschade
CONST int CRASHSOUNDDURATION = 250;
CONST char * INTRO1 = "Lastbilar framåt,";
CONST char * INTRO2 = "Kör försiktigt";
CONST int INTRODELAY = 2000.
void setup()
{
krasch = crashtime = road_index = 0;
step_duration = MAXSTEPDURATION;
line_buff [1 + ROADLEN] = '\0'; null avsluta det
randomSeed(analogRead(RANDSEEDPIN));
för (int jag = 0; jag < NGLYPHS; i ++) {
lcd.createChar(i+1,glyphs[i]);
}
för (int jag = 0; jag < ROADLEN; i ++) {
Road [i] =-1;
}
pinMode(SPEAKERPIN,OUTPUT);
analogWrite(SPEAKERPIN,0); att vara på den säkra sidan
LCD.BEGIN(16,2);
getSteeringWheel();
drawRoad();
lcd.setCursor(1,0);
LCD.Print(INTRO1);
lcd.setCursor(1,1);
LCD.Print(INTRO2);
Delay(INTRODELAY);
}
void loop() {
osignerade långa nu = millis ()-INTRODELAY;
om (! krasch) {
getSteeringWheel();
krasch = (car_pos==road[road_index]);
}
om (krascha) {
om (! crashtime) {
crashtime = nu;
drawRoad();
Spel över text
(hålla första 2 "crash" kolumner intakt)
lcd.setCursor(2,0);
LCD.Print ("kraschade efter");
lcd.setCursor(2,1);
LCD.Print(Now/1000);
LCD.Print ("sekunder.");
}
om ((now-crashtime) < CRASHSOUNDDURATION) {
analogWrite(SPEAKERPIN,random(255)); vitt brus
}
annat {
analogWrite(SPEAKERPIN,0); dramatisk efter krossa tysta :)
}
Delay(10); Vänta lite mellan skriver
}
annat {
int prev_pos = road [(road_index-1) % ROADLEN];
int this_pos = random(MAXROADPOS);
medan (abs(this_pos-prev_pos) < 2) {/ / inte jam vägen
this_pos = random(MAXROADPOS);
}
Road [road_index] = this_pos;
road_index = (road_index + 1) % ROADLEN;
drawRoad();
Delay(step_duration);
om (step_duration > MINSTEPDURATION) {
step_duration--; gå fortare
}
}
}
void getSteeringWheel() {
car_pos = map(analogRead(POTPIN),0,1024,0,NCARPOSITIONS);
}
void drawRoad() {
för (int jag = 0; jag < 2; i ++) {
om (krascha) {
line_buff [0] = crash2glyphs [car_pos] [i];
}
annat {
line_buff [0] = car2glyphs [car_pos] [i];
}
för (int j = 0; j < ROADLEN; j ++) {
int pos = road [(j+road_index) % ROADLEN];
line_buff [j + 1] = pos > = 0 & & pos < NCARPOSITIONS? truck2glyphs [pos] [i]: Tom;
}
lcd.setCursor(0,i);
LCD.Print(line_buff);
}
}