// Use the MD_MAX72XX library to display a Pacman animation
// Just for fun!
#include <MD_MAX72xx.h>
#include <SPI.h>
#define DEBUG 0 // Enable or disable (default) debugging output
#if DEBUG
#define PRINT(s, v) { Serial.print(F(s)); Serial.print(v); } // Print a string followed by a value (decimal)
#define PRINTX(s, v) { Serial.print(F(s)); Serial.print(v, HEX); } // Print a string followed by a value (hex)
#define PRINTB(s, v) { Serial.print(F(s)); Serial.print(v, BIN); } // Print a string followed by a value (binary)
#define PRINTC(s, v) { Serial.print(F(s)); Serial.print((char)v); } // Print a string followed by a value (char)
#define PRINTS(s) { Serial.print(F(s)); } // Print a string
#else
#define PRINT(s, v) // Print a string followed by a value (decimal)
#define PRINTX(s, v) // Print a string followed by a value (hex)
#define PRINTB(s, v) // Print a string followed by a value (binary)
#define PRINTC(s, v) // Print a string followed by a value (char)
#define PRINTS(s) // Print a string
#endif
// --------------------
// MD_MAX72xx hardware definitions and object
// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
//
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 28
#define CLK_PIN 13 // or SCK
#define DATA_PIN 11 // or MOSI
#define CS_PIN 10 // or SS
#define g1 2
#define y1 3
#define r1 4
#define g2 7
#define y2 6
#define r2 5
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // SPI hardware interface
//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); // Arbitrary pins
// --------------------
// Constant parameters
//
long ANIMATION_DELAY = 240; // milliseconds
#define MAX_FRAMES 4 // number of animation frames
// ========== General Variables ===========
//
const uint8_t pacman[MAX_FRAMES][55] = // ghost pursued by a pacman
{
{ 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00 },
{ 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00 },
{ 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00 },
{ 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00, 0x60, 0xE0, 0xE0, 0x78, 0x48, 0x48, 0xF0, 0xE0, 0x40, 0x00, 0x00 },
};
const uint8_t DATA_WIDTH = (sizeof(pacman[0]) / sizeof(pacman[0][0]));
int prevTimeAnim = 0; // remember the millis() value in animations
int16_t idx; // display index (column)
uint8_t frame; // current animation frame
uint8_t deltaFrame; // the animation frame offset for the next frame
long arr[2];
// int i = 0;
// ========== Control routines ===========
//
void resetMatrix(void)
{
mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY / 2);
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
mx.clear();
}
void setup()
{
Serial.begin(115200);
pinMode(g1, OUTPUT);
pinMode(y1, OUTPUT);
pinMode(r1, OUTPUT);
pinMode(g2, OUTPUT);
pinMode(y2, OUTPUT);
pinMode(r2, OUTPUT);
mx.begin();
resetMatrix();
prevTimeAnim = millis();
#if DEBUG
Serial.begin(57600);
#endif
PRINTS("\n[MD_MAX72XX Pacman]");
}
void loop(void)
{
while (true) {
// i++;
static boolean bInit = true; // initialise the animation
// int data = digitalRead(2);
// Is it time to animate?
int Delay = millis() - prevTimeAnim;
if (Delay < ANIMATION_DELAY)
return;
prevTimeAnim = millis();
// starting point for next time
if (Delay > 1) {
Delay = 1;
}
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);
// Initialize
if (bInit)
{
mx.clear();
idx = 0;
frame = 0;
deltaFrame = 1;
bInit = false;
}
// now run the animation
PRINT("\nINV I:", idx);
PRINT(" frame ", frame);
// clear old graphic
for (uint8_t i = 0; i < DATA_WIDTH; i++)
mx.setColumn(idx - DATA_WIDTH + i, 0);
// move reference column and draw new graphic
idx++;
for (uint8_t i = 0; i < DATA_WIDTH; i++)
mx.setColumn(idx - DATA_WIDTH + i, pacman[frame][i]);
// advance the animation frame
frame += deltaFrame;
if (frame == 0 || frame == MAX_FRAMES - 1)
deltaFrame = -deltaFrame;
// check if we are completed and set initialise for next time around
bInit = (idx == mx.getColumnCount() + DATA_WIDTH);
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
if (idx <= 108) {
digitalWrite(g1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(r1, LOW);
digitalWrite(g2, LOW);
digitalWrite(y2, LOW);
digitalWrite(r2, HIGH);
} else if (idx > 108 && idx <= 111) {
digitalWrite(g1, LOW);
digitalWrite(y1, HIGH);
digitalWrite(r1, LOW);
digitalWrite(g2, LOW);
digitalWrite(y2, LOW);
digitalWrite(r2, HIGH);
} else if (idx > 111 && idx <= 224) {
digitalWrite(g1, LOW);
digitalWrite(y1, LOW);
digitalWrite(r1, HIGH);
digitalWrite(g2, LOW);
digitalWrite(y2, LOW);
digitalWrite(r2, HIGH);
// } else if (idx > 224 && idx <= )
} else if (idx > 224 && idx <= 279) {
digitalWrite(g1, LOW);
digitalWrite(y1, LOW);
digitalWrite(r1, HIGH);
digitalWrite(g2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(r2, LOW);
}
Serial.println(idx);
if (idx >= 279) {
break;
}
// Serial.println(idx);
return;
}
digitalWrite(g1, LOW);
digitalWrite(y1, LOW);
digitalWrite(r1, HIGH);
digitalWrite(g2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(r2, LOW);
delay(22000);
digitalWrite(g1, LOW);
digitalWrite(y1, LOW);
digitalWrite(r1, HIGH);
digitalWrite(g2, LOW);
digitalWrite(y2, LOW);
digitalWrite(r2, HIGH);
delay(72000);
}