/**
Simon Game for Arduino with Score display
Copyright (C) 2022, Uri Shaked
Released under the MIT License.
*/
π°πππππππ A Mulher no Jardim π²πππππππ π·π³ πΈπΆπΈπ» π³ππππππ π΄π πΏππππππΓͺπ πΎπππππ πΆπππππ π±πππ‘ππ πππππ ππππππ ππππππππ πππππππ ππ πππππππΓͺπ ππππ, π°ππππππ π πππππ πππππππ π πππππππππ ππ π·π³ π½πΈπΆπ ππππππ ππππππ. π²πππ ππππππππ πππππ πππππππ ππ πππππππΓͺπ πππππππ‘ ππ πππΓ§π?
| π³π
π³ (π±ππ-πππ’) | πΊπΊ ππ·π³ | π·π³-πΈπΆπΎπΆπ | π·π³-π½πΈπΆπ | ππ³-πΊπΎπΆπ | πΌπΏπΊ |
β€βΊβ€βΊ Asπistir Agora β€βΊ https://tinyurl.com/2zecxk47
β€βΊβ€βΊ Asπistir Agora β€βΊ https://tinyurl.com/2zecxk47
π°πππππππ π΅πππππ πΎπππππ π»ππΓ§ππππππ, π°πππππππ π΅πππππ πΎπππππ π³π π°πππ π³ππππππ πΆπππππ π²πππππππ π½πΈπΆπ, π·πΆπΎπΆπ, π³πππππ, π·ππππ πππππππ’*
π°πππππππ πΈπΆπΈπ» π΅ππππ π²πππππππ π΄π πΏππππππΓͺπ π³ππππππ πΆπππππ
π°πππππππ π ππππππ ππππππ | π΄πππππππ πππ ππΓ³π‘πππ πππππ ππππ ππππππππ
ππππππ π ππππ ππ ππππππππππππππππ πππ πππΓ‘ ππππππΓπππ.
π· ππ ππππ ππ πΈπΆπΈπ» π½π ππππππ | πΈπ πΆπΌπππ | π°Γ§Γ£π, π΅πππππππ
π³πππΓ§Γ£π: πΉπππ ππππππππ | πππππππ π»ππ ππππ-πΉππ, πΉπππππ π²πππ
π΄πππππ: π΅πππππππ πΏπππ, πππππππππ ππππ, π³ππππ π·ππππππ
πππππππ
π°πΓ³π ππππ πππππΓ§Γ΅ππ ππ π±ππππ πππππ π π·ππ πππ’π, π΅πππππππ πΏπππ πππππππ ππ ππππππππ πΌπππππ ππππ ππππππ π±πππππ, πππ πππππππππ ππππππΓ‘πππ πππ ππ πππ π ππ ππππ ππ ππππ-πππΓ³ππ ππ ππππΓ΅ππ ππππ π πππππππ πππ π΄ππππππ ππππππ. π΄π ππππππππππππ, ππππππ πππ£ πππππ ππ πππ ππππππ ππππππππ πππ ππ‘-ππππππππΓ΅ππ πππππππππ, πππππππ ππππ ππππ ππ ππππ ππ ππππππ ππππππππππππ. ππππππππππππ ππππ£ πππ ππππ πππππππππ ππ ππ‘ππππππ πππππππππππ ππππππππππππ π ππππ πππππ ππππππππ, ππππππππ πππππππππ ππππππππ ππ ππππ πππππ ππππ π πππππππ, ππππππππππ πΓ§Γ£π, πππππ π πππππππ ππππππ.
ππ.πππππππΊπ’ππ.ππππ Γ© ππ ππππ πππ πππππππ ππππ ππ πΈπΆ.πΆπΆπΆ ππππππ πππππππππ ππ πππππππππ ππ πππππ ππ πΓͺπππππ πππππππππππππ. π°π πππ£ππ πππππ, πππΓͺ πππππππππΓ‘ ππππππ ππ ππππ ππππππΓ§Γ£π π πππ πππππππ, ππ ππππππ πππΓ‘ππππ ππππ πππππππππ π πππ πππππ ππ ππππππππ ππππ ππππππππ πππ πππΓͺ ππππππππ πππππ ππ ππππππ πππ ππππππ πππ.
π°πππππππ π΅ππππ π²πππππππ π³ππππππ π΄π
πΏππππππΓͺππ πππππππ‘
πππππππ ππ πππ πππππππ ππ πππππππππ ππ πππππ ππππππ πππππππ ππ
πππππππππ πππππ ππ ππππππππππππ πππππππππππ ππ πππππππππ, ππππ
π½ππππππ‘, πππππππ, π°πππ£ππ πΏππππ π
ππππ, π½πΎπ,π°ππππ ππ
π ππππππ.
A Mulher no Jardim πΈπΆπΈπ» π΅ππππ π³ππππππ π°πππππππ π²πππππππ πΆπππππ
A Mulher no Jardim π΅ππππ π²πππππππ
A Mulher no Jardim π΅ππππ π²πππππππ π·π³ πΈπΆπΈπ»
A Mulher no Jardim π΅ππππ π²πππππππ π³ππππππ
A Mulher no Jardim π΅ππππ π²πππππππ π³ππππππ πππππππ‘
A Mulher no Jardim π΅πππππ π²πππππππ π³ππππππ π°πππππππ πΆπππππ
A Mulher no Jardim π΅ππππ π²πππππππ π»ππππππππ
A Mulher no Jardim π΅ππππ π²πππππππ π³ππππππ πΌπππ π΅πππππ
#include "pitches.h"
/* Constants - define pin numbers for LEDs,
buttons and speaker, and also the game tones: */
const uint8_t ledPins[] = {9, 10, 11, 12};
const uint8_t buttonPins[] = {2, 3, 4, 5};
#define SPEAKER_PIN 8
// These are connected to 74HC595 shift register (used to show game score):
const int LATCH_PIN = A1; // 74HC595 pin 12
const int DATA_PIN = A0; // 74HC595pin 14
const int CLOCK_PIN = A2; // 74HC595 pin 11
#define MAX_GAME_LENGTH 100
const int gameTones[] = { NOTE_G3, NOTE_C4, NOTE_E4, NOTE_G5};
/* Global variables - store the game state */
uint8_t gameSequence[MAX_GAME_LENGTH] = {0};
uint8_t gameIndex = 0;
/**
Set up the Arduino board and initialize Serial communication
*/
void setup() {
Serial.begin(9600);
for (byte i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
// The following line primes the random number generator.
// It assumes pin A3 is floating (disconnected):
randomSeed(analogRead(A3));
}
/* Digit table for the 7-segment display */
const uint8_t digitTable[] = {
0b11000000,
0b11111001,
0b10100100,
0b10110000,
0b10011001,
0b10010010,
0b10000010,
0b11111000,
0b10000000,
0b10010000,
};
const uint8_t DASH = 0b10111111;
void sendScore(uint8_t high, uint8_t low) {
digitalWrite(LATCH_PIN, LOW);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, low);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, high);
digitalWrite(LATCH_PIN, HIGH);
}
void displayScore() {
int high = gameIndex % 100 / 10;
int low = gameIndex % 10;
sendScore(high ? digitTable[high] : 0xff, digitTable[low]);
}
/**
Lights the given LED and plays a suitable tone
*/
void lightLedAndPlayTone(byte ledIndex) {
digitalWrite(ledPins[ledIndex], HIGH);
tone(SPEAKER_PIN, gameTones[ledIndex]);
delay(300);
digitalWrite(ledPins[ledIndex], LOW);
noTone(SPEAKER_PIN);
}
/**
Plays the current sequence of notes that the user has to repeat
*/
void playSequence() {
for (int i = 0; i < gameIndex; i++) {
byte currentLed = gameSequence[i];
lightLedAndPlayTone(currentLed);
delay(50);
}
}
/**
Waits until the user pressed one of the buttons,
and returns the index of that button
*/
byte readButtons() {
while (true) {
for (byte i = 0; i < 4; i++) {
byte buttonPin = buttonPins[i];
if (digitalRead(buttonPin) == LOW) {
return i;
}
}
delay(1);
}
}
/**
Play the game over sequence, and report the game score
*/
void gameOver() {
Serial.print("Game over! your score: ");
Serial.println(gameIndex - 1);
gameIndex = 0;
delay(200);
// Play a Wah-Wah-Wah-Wah sound
tone(SPEAKER_PIN, NOTE_DS5);
delay(300);
tone(SPEAKER_PIN, NOTE_D5);
delay(300);
tone(SPEAKER_PIN, NOTE_CS5);
delay(300);
for (byte i = 0; i < 10; i++) {
for (int pitch = -10; pitch <= 10; pitch++) {
tone(SPEAKER_PIN, NOTE_C5 + pitch);
delay(5);
}
}
noTone(SPEAKER_PIN);
sendScore(DASH, DASH);
delay(500);
}
/**
Get the user's input and compare it with the expected sequence.
*/
bool checkUserSequence() {
for (int i = 0; i < gameIndex; i++) {
byte expectedButton = gameSequence[i];
byte actualButton = readButtons();
lightLedAndPlayTone(actualButton);
if (expectedButton != actualButton) {
return false;
}
}
return true;
}
/**
Plays a hooray sound whenever the user finishes a level
*/
void playLevelUpSound() {
tone(SPEAKER_PIN, NOTE_E4);
delay(150);
tone(SPEAKER_PIN, NOTE_G4);
delay(150);
tone(SPEAKER_PIN, NOTE_E5);
delay(150);
tone(SPEAKER_PIN, NOTE_C5);
delay(150);
tone(SPEAKER_PIN, NOTE_D5);
delay(150);
tone(SPEAKER_PIN, NOTE_G5);
delay(150);
noTone(SPEAKER_PIN);
}
/**
The main game loop
*/
void loop() {
displayScore();
// Add a random color to the end of the sequence
gameSequence[gameIndex] = random(0, 4);
gameIndex++;
if (gameIndex >= MAX_GAME_LENGTH) {
gameIndex = MAX_GAME_LENGTH - 1;
}
playSequence();
if (!checkUserSequence()) {
gameOver();
}
delay(300);
if (gameIndex > 0) {
playLevelUpSound();
delay(300);
}
}