Greetings everyone,
In the code below, i would like to point to two sections. Specifically the final part of the "setup" function, where high score should be printed on a LCD screen when My arduino mega is plugged in to mains...and the function "void checkIfStopWasPressed", where when stop is pressed, the program would compare the current score (runningTotal) with the highscore, that would already be stored on the SD card. And if the new runningTotal is higher than the highscore on the SD card, the given high score should be deleted from the SD card and the new one should be saved...So that the high score stays saved when arduino is unplugged from power supply, and can be displayed again when the arduino powers on again...But in my case...the high score doesnt always get saved on the SD card as it should..which is not good...It only saves the high score every 10-15 events maybe...Am i doing something wrong?
/*
BASED ON State change detection (edge detection) changed for INPUT PULLUP
and with a struct array
delay()-less millis()-based pulse pin 13
*/
#include <SD.h>
#include <SPI.h>
#include <TMRpcm.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define SD_ChipSelectPin 53 //example uses hardware SS pin 53 on Mega2560
TMRpcm audio; // create an object for use in this sketch
File myFile;
char line[25];
byte index = 0;
unsigned long prejsni = 0;
const long interval = 100;
// the buttons
struct buttons
{
byte pin;
byte led;
bool state;
bool prevState;
byte score;
byte pressed;
char muzika[10];//tu dodam string ki bo vseboval ime datoteke z muziko/////lahko se znajša na manj znakov/////////////////////////////////////////////////////////////
};
const byte buttonPins[] = {13, 14, 15, 16, 17}; //Senz za M A R I O
const byte numberOfButtons = sizeof(buttonPins) / sizeof(buttonPins[0]);
buttons mybuttons[numberOfButtons];
const byte ledPins[] = {23, 24, 25, 26, 27};
const byte scores[] = {10, 20, 30, 40, 50};
const char *ImenaMuzik[] = {"boo.wav", "coin.wav", "opica.wav", "bomba.wav", "shyguy.wav",}; //tu dodam polje stringov ki vsebujejo imena datotek z muziko////////preimenuj v imena datotek/////////////////////////////////////////////////////////
bool reading;
const int button = 49;
bool prevState;
long highscore = 0;
long runningTotal;
byte numberOfButtonsPressed = 0;
//the pulse led
int pulseLedInterval = 500;
unsigned long previousMillisPulse;
bool pulseState = false;
//the effect led
int effectLedInterval;
int effectLedIntervalMax = 100;
int effectLedIntervalMin = 30;
unsigned long previousMillisEffect;
bool effectState;
bool doEffect = false;
void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("SUPER MARIO");
lcd.setCursor(5, 1);
lcd.print("PINBALL");
delay(2500);
// initialize the button pins as input with pullup so active low
// make sure the button is from pin to ground
Serial.println(" ");
Serial.print("Initialising "); Serial.print(numberOfButtons); Serial.println(" buttons");
for (int i = 0; i < numberOfButtons; i++)
{
mybuttons[i].pin = buttonPins[i];
pinMode(mybuttons[i].pin, INPUT_PULLUP);
mybuttons[i].led = ledPins[i];
pinMode(mybuttons[i].led, OUTPUT);
mybuttons[i].state = digitalRead(mybuttons[i].pin);
mybuttons[i].prevState = mybuttons[i].state;
mybuttons[i].score = scores[i];
mybuttons[i].pressed = 0;
Serial.print("Button: "); Serial.print(i);
Serial.print(", Pin: "); Serial.print(mybuttons[i].pin);
Serial.print(", Led: "); Serial.print(mybuttons[i].led);
Serial.print(", Score: "); Serial.print(mybuttons[i].score);
Serial.print(", Pressed: "); Serial.print(mybuttons[i].pressed);
Serial.print(", State: "); Serial.print(mybuttons[i].state);
Serial.print(", Prev state: "); Serial.println(mybuttons[i].prevState);
strcpy(mybuttons[i].muzika, ImenaMuzik[i]);//tu vstavim ime muzike v spremenljivko za ta button////////////////////////////////////////////////////////////////////
}
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
pinMode(49, INPUT_PULLUP);
audio.speakerPin = 6; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
audio.setVolume(5);
if (!SD.begin(SD_ChipSelectPin)) {
return;
} else {
Serial.println("SD OK");
}
////////////////////////////////////////////////////////////////////////
//Izpis high score-a iz SD kartice ob ponovnem zagonu.
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
line[index] = (myFile.read());
// check if character is '\r'
if (line[index] == '\r')
{
// add terminatin NUL character
line[index] == '\0';
// done
break;
}
// next character will go in next element of line
index++;
}
// close the file:
highscore = atol(line);
myFile.close();
}
}
void loop()
{
checkForButtonStateChange();
if (doEffect) blinkLedsAndMakeANoise();
// checkForbuttons1tateChange();
// if (doEffect1) blinkled1sAndMakeANoise();
checkIfStopWasPressed();
text();
} //loop
void checkForButtonStateChange()
{
for (int i = 0; i < numberOfButtons; i++)
{
mybuttons[i].state = digitalRead(mybuttons[i].pin);
// compare the buttonState to its previous state
if (mybuttons[i].state != mybuttons[i].prevState) // means it changed... but which way?
{
if (mybuttons[i].state == HIGH) // changed to pressed
{
if (audio.isPlaying() == 0) { //returns 1 if music playing, 0 if not
audio.play(mybuttons[i].muzika);//tu igra muziko za ta specifičen button/////////////////////////////////////////////////////////////////////////////
}
Serial.print(i);
Serial.print(" newly pressed");
if (mybuttons[i].pressed == 0)
{
mybuttons[i].pressed = 1;
numberOfButtonsPressed++;
Serial.print(", Unique buttons pressed "); Serial.print(numberOfButtonsPressed);
}
digitalWrite(mybuttons[i].led, HIGH);
runningTotal = runningTotal + mybuttons[i].score;
Serial.print(", Score "); Serial.println(runningTotal);
}
// poor man's de-bounce
delay(50);
}
// save the current state as the last state, for next time through the loop
mybuttons[i].prevState = mybuttons[i].state;
}
if (numberOfButtonsPressed == 5)
{
Serial.print("All leds on, score "); Serial.println(runningTotal);
for (int i = 0; i < numberOfButtons; i++)
{
audio.play("mario.wav");
mybuttons[i].pressed = 0;
}
doEffect = true;
numberOfButtonsPressed = 0;
}
} // checkForButtonStateChange()
void blinkLedsAndMakeANoise()
{
static byte numberOfEffects = 0;
if (millis() - previousMillisEffect >= effectLedInterval)
{
effectLedInterval = random(effectLedIntervalMin, effectLedIntervalMax);
previousMillisEffect = millis();
effectState = !effectState;
for (int i = 0; i < numberOfButtons; i++)
{
digitalWrite(mybuttons[i].led, effectState);
}
numberOfEffects++;
}
if (numberOfEffects == 25)
{
doEffect = false;
numberOfEffects = 0;
for (int i = 0; i < numberOfButtons; i++)
{
digitalWrite(mybuttons[i].led, LOW);
}
}
}
void checkIfStopWasPressed()
{
reading = digitalRead(49);
if (reading == 0) { //button was pressed
delay(200);
if (runningTotal > highscore) { //check if current score > highsore
highscore = runningTotal; //if current score> highscore, write that score to SD card
SD.remove("test.txt"); //izbriše file z starim rezultatom, ustvari nov file z novim high score-om.
myFile = SD.open("test.txt", FILE_WRITE);
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println(highscore);
myFile.close();
}
}
doEffect = true;
numberOfButtonsPressed = 0;
audio.play("over.wav");
runningTotal = 0;
}
}
void text() {
if (millis() - prejsni >= interval) {
prejsni = millis();
lcd.clear();
lcd.setCursor(4, 0);
lcd.print(runningTotal);
lcd.setCursor(4, 1);
lcd.print(highscore);
}
}