#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CS_PIN 10
#define BUTTON_PIN 2 // Button simulates wave
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
enum QuizState { SHOW_QUESTION, SHOW_ANIM, SHOW_ANSWER, WAIT_ANSWER };
QuizState state = SHOW_QUESTION;
unsigned long stateTimer = 0;
unsigned long blinkTimer = 0;
bool blinkOn = true;
int num1, num2, result;
const char* animFrames[] = { " * ", " ** ", " *** ", " ** ", " * " };
const int animCount = sizeof(animFrames)/sizeof(animFrames[0]);
int animIndex = 0;
const unsigned long BLINK_INTERVAL = 500;
const unsigned long ANIM_DELAY = 200;
const unsigned long ANSWER_DELAY = 4000;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
randomSeed(analogRead(0));
P.begin();
P.setIntensity(3);
P.displayClear();
generateQuestion();
}
void loop() {
P.displayAnimate();
unsigned long now = millis();
switch(state) {
case SHOW_QUESTION:
// Blink ?
if(now - blinkTimer >= BLINK_INTERVAL){
blinkTimer = now;
blinkOn = !blinkOn;
displayQuestion();
}
// Button pressed → show animation
if(digitalRead(BUTTON_PIN) == LOW){
delay(50); // debounce
if(digitalRead(BUTTON_PIN) == LOW){
state = SHOW_ANIM;
animIndex = 0;
stateTimer = now;
}
}
break;
case SHOW_ANIM:
if(now - stateTimer >= ANIM_DELAY){
stateTimer = now;
P.displayClear();
P.displayText((char*)animFrames[animIndex], PA_CENTER, 50, 0, PA_PRINT, PA_NO_EFFECT);
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 --------
void generateQuestion(){
num1 = random(1,10);
num2 = random(1,10);
result = num1 + num2;
blinkOn = true;
state = SHOW_QUESTION;
stateTimer = millis();
blinkTimer = millis();
displayQuestion();
}
void displayQuestion(){
char q[10];
if(blinkOn) sprintf(q, "%d+%d=?", num1, num2);
else sprintf(q, "%d+%d= ", num1, num2);
// Clear display only for blinking zone (simulate static + blinking)
P.displayClear();
P.displayText(q, PA_CENTER, 50, 0, PA_PRINT, PA_NO_EFFECT);
P.displayAnimate();
}
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.displayAnimate();
}