#include <LedControl.h>
// Define the number of MAX7219 modules in your setup
#define NUM_DEVICES 4
// Pins connected to MAX7219 module
#define DATA_IN 7
#define CLK 5
#define LOAD_CS 6
#define DATA_IN2 4
#define CLK2 2
#define LOAD_CS2 3
#define DATA_IN3 8
#define CLK3 10
#define LOAD_CS3 9
#define DATA_IN4 11
#define CLK4 13
#define LOAD_CS4 12
byte left[][8] = {
{ B00000100,
B00111101,
B01000010,
B01011011,
B01011010,
B01000010,
B00111100,
B00000000},
{ B00000000,
B00000101,
B01111110,
B01011011,
B01011010,
B01111110,
B00000000,
B00000000},
{ B00000000,
B00000000,
B00000101,
B01111111,
B01111110,
B00000000,
B00000000,
B00000000},
{ B00000000,
B00000000,
B00000000,
B00000100,
B00111101,
B01000010,
B00000000,
B00000000},
{ B00000000,
B00000000,
B00000000,
B00000100,
B00111101,
B01000010,
B00000000,
B00000000},
{ B00000000,
B00000000,
B00000101,
B01111111,
B01111110,
B00000000,
B00000000,
B00000000},
{ B00000000,
B00000101,
B01111110,
B01011011,
B01011010,
B01111110,
B00000000,
B00000000},
{ B00000100,
B00111101,
B01000010,
B01011011,
B01011010,
B01000010,
B00111100,
B00000000},
};
byte right[][8] = {
{ B00100000,
B10111100,
B01000010,
B11011010,
B01011010,
B01000010,
B00111100,
B00000000},
{ B00000000,
B10100000,
B01111110,
B11011010,
B01011010,
B01111110,
B00000000,
B00000000},
{ B00000000,
B00000000,
B10100000,
B11111110,
B01111110,
B00000000,
B00000000,
B00000000},
{ B00000000,
B00000000,
B00000000,
B01010000,
B00111100,
B01000010,
B00000000,
B00000000},
{ B00000000,
B00000000,
B00000000,
B01010000,
B00111100,
B01000010,
B00000000,
B00000000},
{ B00000000,
B00000000,
B10100000,
B11111110,
B01111110,
B00000000,
B00000000,
B00000000},
{ B00000000,
B10100000,
B01111110,
B11011010,
B01011010,
B01111110,
B00000000,
B00000000},
{ B00100000,
B10111100,
B01000010,
B11011010,
B01011010,
B01000010,
B00111100,
B00000000},
};
byte leftMouthFine[][8] = {
{ B00000000,
B00000000,
B00000000,
B00000001,
B11111110,
B00000000,
B00000000,
B00000000},
};
byte rightMouthFine[][8] = {
{ B00000000,
B00000000,
B00000000,
B10000000,
B01111111,
B00000000,
B00000000,
B00000000},
};
byte leftMouthTired[][8] = {
{ B00000000,
B00000000,
B00000000,
B00000000,
B11111111,
B00000000,
B00000000,
B00000000},
};
byte rightMouthTired[][8] = {
{ B00000000,
B00000000,
B00000000,
B00000000,
B01111111,
B10000000,
B00000000,
B00000000},
};
int frameCount = 0;
String robotState = "Fine";
boolean canBlink = false;
int blinkCount = 0;
int myTime = 0;
int lastBlinkTime = 0;
int blinkInterval = 6;
LedControl lc[NUM_DEVICES] = {
LedControl(DATA_IN, CLK, LOAD_CS, 0),
LedControl(DATA_IN2, CLK2, LOAD_CS2, 1),
LedControl(DATA_IN3, CLK3, LOAD_CS3, 2),
LedControl(DATA_IN4, CLK4, LOAD_CS4, 3),
};
void setup() {
// Initialize the MAX7219 modules
for (int i = 0; i < NUM_DEVICES; i++) {
lc[i].shutdown(0, false);
lc[i].setIntensity(0, 8);
lc[i].clearDisplay(0);
}
}
void loop() {
myTime++;
if(blinkCount >= 1)
{
canBlink = false;
blinkCount = 0;
}
// Blinking logic
if ((myTime - lastBlinkTime) >= blinkInterval && canBlink == false) {
canBlink = true;
lastBlinkTime = myTime;
blinkCount++;
}
// Display the arrays
for (int frameIndex = 0; frameIndex < sizeof(left) / sizeof(left[0]); frameIndex++) {
if (canBlink == true && blinkCount == 1) {
updateDisplay(right[frameIndex], 0);
if (robotState == "Tired") {
delay(200);
}
updateDisplay(left[frameIndex], 1);
}
else
{
updateDisplay(right[0], 0);
updateDisplay(left[0], 1);
if(robotState == "Fine")
{
updateDisplay(rightMouthFine[0], 2);
updateDisplay(leftMouthFine[0], 3);
}
else if(robotState == "Tired")
{
updateDisplay(rightMouthTired[0], 2);
updateDisplay(leftMouthTired[0], 3);
}
}
delay(50);
}
}
//cool function
void updateDisplay(byte frame[], int display) {
for (int row = 0; row < 8; row++) {
lc[display].setRow(0, row, frame[row]);
}
}