#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// -------- Display Setup --------
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CS_PIN 10
#define DATA_PIN 11
#define CLK_PIN 13
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// -------- Quiz State --------
enum QuizState { SHOW_QUESTION, WAIT_QUESTION, SHOW_ANIM, SHOW_ANSWER, WAIT_ANSWER };
QuizState state = SHOW_QUESTION;
unsigned long stateTimer = 0;
int num1, num2, result;
// -------- Animation Frames --------
const char* animFrames[] = { " * ", " ** ", " *** ", " ** ", " * " };
const int animCount = sizeof(animFrames)/sizeof(animFrames[0]);
int animIndex = 0;
// -------- Timing --------
const unsigned long QUESTION_DELAY = 3000;
const unsigned long ANSWER_DELAY = 3000;
const unsigned long ANIM_DELAY = 200;
// -------- Setup --------
void setup() {
randomSeed(analogRead(0));
P.begin();
P.setIntensity(3);
P.displayClear();
generateQuestion();
}
// -------- Loop --------
void loop() {
P.displayAnimate();
unsigned long now = millis();
switch (state) {
case SHOW_QUESTION:
// Display question immediately, then move to WAIT_QUESTION
displayQuestion();
state = WAIT_QUESTION;
stateTimer = now;
break;
case WAIT_QUESTION:
if (now - stateTimer >= QUESTION_DELAY) {
state = SHOW_ANIM;
animIndex = 0;
stateTimer = now;
}
break;
case SHOW_ANIM:
if (now - stateTimer >= ANIM_DELAY) {
stateTimer = now;
displayAnimation();
animIndex++;
if (animIndex >= animCount) {
state = SHOW_ANSWER;
stateTimer = now;
}
}
break;
case SHOW_ANSWER:
displayAnswer();
state = WAIT_ANSWER;
stateTimer = now;
break;
case WAIT_ANSWER:
if (now - stateTimer >= ANSWER_DELAY) {
generateQuestion();
}
break;
}
}
// -------- Functions --------
// Generate a new random question
void generateQuestion() {
num1 = random(1, 10);
num2 = random(1, 10);
result = num1 + num2;
state = SHOW_QUESTION;
}
// Display the question
void displayQuestion() {
char q[10];
sprintf(q, "%d+%d=?", num1, num2);
P.displayClear();
P.displayText(q, PA_CENTER, 50, 0, PA_PRINT, PA_NO_EFFECT);
P.displayReset();
}
// Display animation
void displayAnimation() {
P.displayClear();
P.displayText((char*)animFrames[animIndex], PA_CENTER, 50, 0, PA_PRINT, PA_NO_EFFECT);
P.displayReset();
}
// Display the answer
void displayAnswer() {
char a[10];
sprintf(a, "%d+%d=%d", num1, num2, result);
P.displayClear();
P.displayText(a, PA_CENTER, 50, 0, PA_PRINT, PA_NO_EFFECT);
P.displayReset();
}