//Includes
#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <EEPROM.h>
//LCD pins definition and instantiation
const int rs = 12, en = 11, d4 = 13, d5 = 10, d6 = 9, d7 = 8;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
//Software parameters
long shootingTime = 5000;
long configDelayTime = 3000; //must be under 5000
int giftsBurned;
bool burnedMsgFlag = true;
bool showMsgFlag = true;
//Led Matrix definition
//Array pos: 0->Order, 1->xPos, 2->yPos, 3->AlreadyBurned
int LEDMatrix[20][4]={
{1,A2,2,false}, {2,A4,2,false}, {3,A5,2,false}, {4,A0,2,false},
{5,A1,3,false},{6,A2,3,false}, {7,A4,3,false}, {8,A5,3,false}, {9,A0,3,false}, {10,A3,3,false},
{11,A1,4,false},{12,A2,4,false},{13,A4,4,false},{14,A5,4,false},{15,A0,4,false},{16,A3,4,false},
{17,A2,5,false},{18,A4,5,false},{19,A5,5,false},{20,A0,5,false},
};
int fullBurnedAddr = 20; //Address to store fullBurned value
//Special Chars
byte smile[8]={
B00000,
B10001,
B00000,
B00000,
B10001,
B01110,
B00000,
};
byte bar[8]={
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
//Messages
String msg[]=
{
" CHAVE ATIVADA! ",
" VAMOS JOGAR ",
"DESLIGUE A CHAVE",
" PARA CONTIN. ",
" PRESSIONE O ",
" GATILHO! ",
" BOA SORTE! ",
"GANHOU UM REGINA",
" EXPERIMENTE A ",
" SUA SORTE "
};
//List of Gifts
String gifts[20]=
{
" FRUTAS ANANAS ",
" FLOC-CHOC ",
" SOMBRINHA ",
"CHOCOLATE LEITE",
" CLASSIC ",
"EXTRA NOIRE 70%",
" FLOC-CHOC ",
"EXTRA NOIRE 70%",
" SOMBRINHA ",
" CLASSIC ",
"CHOCOLATE LEITE",
" FRUTAS MORANGO ",
"EXTRA NOIRE 70%",
" FLOC-CHOC ",
" CLASSIC ",
" SOMBRINHA ",
"FRUTAS SILVESTRE",
"CHOCOLATE LEITE",
" SOMBRINHA ",
" FRUTAS LARANJA ",
};
void setup() {
long initTimmer = millis();
//Serial communication just for debug (coment in the END)
Serial.begin(9600);
lcd.createChar(0, smile);
lcd.createChar(1, bar);
lcd.begin(16, 2);
lcd.clear();
//Inicialize LED matrix pins
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
//Inicialize common pin of LED matrix PWM
pinMode(6, OUTPUT);
//LED brightness
analogWrite(6, 255);
//Input Btn
pinMode(A6, INPUT); //pressure BT
pinMode(A7, INPUT); //key BT
checkConfig();
intializeArray();
}
void loop() {
randomSeed(millis());
if(isFullBurned()){
showBurnedLEDs();
if (burnedMsgFlag){
showBurnedMsg();
}
}
else{
showBurnedLEDs();
ckeckKeyActivation();
if(showMsgFlag){
showbaseMsg();
}
}
}
void showbaseMsg(){
showMsgFlag = !showMsgFlag;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" EXPERIMENTE ");
lcd.setCursor(0,1);
lcd.print(" A SUA SORTE ");
}
void checkConfig(){
if(analogRead(A6) >= 50 & analogRead(A7) <= 50){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" TO RESET TURN ");
lcd.setCursor(0,1);
lcd.print("THE KEY, HAVE 2s");
delay(2000);
if(analogRead(A7) >= 50){
resetArray();
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" RESETTING.. ");
lcd.setCursor(0,1);
lcd.print(" TURN THE KEY ");
while(analogRead(A7) >= 50);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" GAME RESETED ");
lcd.setCursor(0,1);
lcd.print(" LET's PLAY ");
delay(2000);
lcd.clear();
}
else
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" TIME OUT! ");
delay(2000);
}
}
showMsgFlag=true;
}
void showBurnedMsg(){
lcd.setCursor(0,0);
lcd.print(" JOGO COMPLETO ");
lcd.setCursor(0,1);
lcd.print(" OBRIGADO! ");
burnedMsgFlag = !burnedMsgFlag;
showMsgFlag=true;
}
void showBurnedLEDs(){
for(int n=0; n<=19; n++){
if(LEDMatrix[n][3]){
digitalWrite(LEDMatrix[n][1],HIGH);digitalWrite(LEDMatrix[n][2],HIGH);
digitalWrite(LEDMatrix[n][1],LOW);digitalWrite(LEDMatrix[n][2],LOW);
delay(0);
}
}
}
void ckeckKeyActivation()
{
if(analogRead(A7) >= 50){
letsPlay();
}
}
void letsPlay(){
lcd.clear();
lcd.setCursor(0,0);
lcd.print(msg[0]);
lcd.setCursor(0,1);
lcd.print(msg[1]);
delay(3000);
lcd.setCursor(0,0);
lcd.print(msg[2]);
lcd.setCursor(0,1);
lcd.print(msg[3]);
while(analogRead(A7) >=50){}
lcd.setCursor(0,0);
lcd.print(msg[4]);
lcd.setCursor(0,1);
lcd.print(msg[5]);
while(analogRead(A6) <=50){}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(msg[6]);
randomShoot(shootingTime);
showMsgFlag=true;
}
void randomShoot(long timmer){
long initTime = millis();
long barTCtrl = millis();
long barLenghtRatio = timmer/16;
int barPos = 0;
int xPos, yPos, randNumber;
while(initTime >= millis()-timmer){
randNumber = int(random(0,20));
digitalWrite(LEDMatrix[randNumber][1],HIGH);digitalWrite(LEDMatrix[randNumber][2],HIGH);
delay(20);
digitalWrite(LEDMatrix[randNumber][1],LOW);digitalWrite(LEDMatrix[randNumber][2],LOW);
lcd.setCursor(barPos,1);
lcd.print(char(1));
if (millis() - (barTCtrl+barLenghtRatio) <= barLenghtRatio)
{
barPos++;
barTCtrl = millis();
}
}
int gift = nextUnBurned(randNumber);
LEDMatrix[gift][3] = true;
writeToEEPROM(gift, true);
digitalWrite(LEDMatrix[gift][1],HIGH);digitalWrite(LEDMatrix[gift][2],HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(msg[7]);
lcd.setCursor(0,1);
lcd.print(gifts[gift]);
while(analogRead(A6) <=50){}
lcd.clear();
showMsgFlag=true;
}
//Recursive function to give the next available Gift
int nextUnBurned(int rnd){
if(LEDMatrix[rnd][3]){
if (rnd >19) rnd = 0;
rnd++;
nextUnBurned(rnd);
}
else{
return rnd;
}
}
//Write to EEPROM function
void writeToEEPROM(int addr, bool val){
EEPROM.write(addr, val);
}
//Inicialize LEDMatrix from values stored in EEPROM
void intializeArray(){
for (int n=0; n<=19; n++){
if (EEPROM.read(n)==1){
LEDMatrix[n][3] = true;
}else{
LEDMatrix[n][3] = false;
}
}
}
bool isFullBurned(){
giftsBurned = 0;
for (int n=0; n<=19; n++){
if (LEDMatrix[n][3]==true){
giftsBurned++;
}
}
if (giftsBurned >= 20){
return true;
}else{
return false;
}
}
void resetArray(){
for (int n=0; n<=19; n++){
EEPROM.write(n,false);
}
}