#include <LiquidCrystal.h>
#define REAL_TIME 450
#define POT_VALUE(pin) map(analogRead(pin),0,1023,1000,200)
#define REPLAY_SPEED(pin) ((float)REAL_TIME)/((float)POT_VALUE(pin))
const int rs=4, en=5, d4=8, d5=9, d6=10, d7=11;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
const int led=2;
const int pot=A0;
int delayTime=REAL_TIME;
int mil, count=0;
// characters
byte stand[] = {
B00100,
B01010,
B00100,
B01110,
B10101,
B00100,
B01010,
B01010
};
byte go1[] = {
B00100,
B01010,
B00100,
B00110,
B01100,
B00100,
B00110,
B01010
};
byte go2[] = {
B00100,
B01010,
B00100,
B01100,
B00110,
B10100,
B01110,
B00010
};
byte strike[] = {
B00100,
B01010,
B00100,
B00110,
B01100,
B00101,
B11111,
B10000
};
byte ball1[] = {
B00000,
B00000,
B00000,
B00000,
B00000,
B01000,
B10100,
B01000
};
byte ball2[] = {
B00000,
B00000,
B00000,
B00000,
B00010,
B00101,
B00010,
B00000
};
byte keepa[] = {
B00010,
B00101,
B00010,
B01011,
B0110,
B10100,
B1110,
B00011
};
byte dream[] = {
B00100,
B01011,
B00101,
B01110,
B10100,
B00100,
B00110,
B01010
};
byte* chars[]={stand,go1,go2,strike,dream,ball1,ball2,keepa};
void setup() {
lcd.begin(16, 2);
// Serial.begin(115200);
pinMode(led, OUTPUT);
pinMode(pot, INPUT_PULLUP);
for(int i=0;i<8;i++){
lcd.createChar(i+1, chars[i]);
}
lcd.setCursor(0,0);
lcd.print("Last minute...");
lcd.setCursor(0,1);
lcd.print("Penalty was set");
delay(3000);
lcd.clear();
mil=millis();
}
void loop() {
// replay text show
if(millis()>mil){
lcd.setCursor(0,0);
lcd.print("Loop replay #");
lcd.print(++count);
//replay speed show
if(count!=0){
delayTime=POT_VALUE(pot);
lcd.setCursor(0,1);
if((REPLAY_SPEED(pot))>1)
lcd.print(">>");
else
lcd.print("<<");
lcd.print(REPLAY_SPEED(pot),1);
}
delay(1200);
lcd.clear();
}
//main event
for(int i=0, j=1;i<9;i++,j++){
runAndStrike(i,j);//i-column, j-character
if(i<4){
lcd.setCursor(4, 0);
lcd.write(6);
}
else{
lcd.setCursor(3, 0);
lcd.write(5);
}
switch(i){
case 3:
j+=2;
i+=2;
//delayTime=300;
break;
case 6:
i++;
break;
case 8:
lcd.setCursor(3,0);
lcd.write(1);
if(count==0){
for(int i=1;i<=2;i++){
digitalWrite(led, HIGH);
delay(300);
digitalWrite(led, LOW);
delay(200);
}
lcd.setCursor(5,1);
lcd.print("GOAAAL!!");
delay(400);
}
else{
delay(200);
}
break;
}
delay(delayTime);
lcd.clear();
}
}
void runAndStrike(const int i, const int j){
if(i<8){//run and strike, keepa stands
lcd.setCursor(i, 0);
lcd.write(j);
lcd.setCursor(7,0);
lcd.print("| ");
lcd.write(1);//keepa stand
lcd.setCursor(10,0);
lcd.print(" |");
}//last scene, ball in the net,keepa jumps
else{
lcd.setCursor(7,0);
lcd.print("|");
lcd.setCursor(i,0);
lcd.write(j-1);//ball
lcd.setCursor(9,0);
lcd.print(" ");
lcd.setCursor(10,0);
lcd.write(8);//keepa
lcd.setCursor(11,0);
lcd.print("|");
}
}