#include <MaxMatrix.h>
char noseRight[] = {8, 8, B00000000, B00000000, B10000000, B11000000, B11000000, B11111100, B01111110, B00000000};
char icon01[] = {8, 8, B00100000,B01111000,B11011110,B11000111,B11111111,B00000000,B00000000,B00000000};
char icon02[] = {8, 8, B00000000,B00000000,B00000000,B10000000,B11100000,B01111000,B00011110,B00000111};
char icon03[] = {8, 8, B00000000,B00000000,B00000000,B00000000,B00000111,B00011110,B01111000,B11100000};
char icon04[] = {8, 8, B00000000,B00000000,B00000000,B11100000,B11111000,B00011110,B00000111,B00000001};
char Eye02[] = {8, 8, B00000000,B00000000,B00000000,B10000000,B11100000,B11111000,B11111110,B00011111};
char Eye01[] = {8, 8, B00010000,B00111100,B01111111,B11111111,B11111111,B00111111,B00000001,B00000000};
char Angry2[] = {8, 8,
B00000000,
B00000000,
B00000000,
B11000000,
B11110000,
B11111100,
B11111000,
B01110000,};
char Angry1[] = {8, 8,
B00001000,
B00001100,
B00001111,
B00001111,
B00000111,
B00000011,
B00000001,
B00000000,};
char Spooked1[] = {8, 8,
B00000000,
B11100000,
B11110000,
B11111000,
B11111000,
B11111100,
B00000000,
B00000000};
char Spooked2[] = {8, 8,
B00000000,
B00000111,
B00001111,
B00011111,
B00011111,
B00111111,
B00000000,
B00000000,};
char ZZZ2[] = {8, 8,
B00000000,
B00011111,
B00000001,
B00000010,
B11100100,
B01001000,
B10011111,
B11100000};
char ZZZ1[] = {8, 8,
B01111110,
B10000100,
B00001000,
B00010000,
B00100000,
B01111110,
B10000000,
B00000000};
char HAP02[] = {8, 8,
B00000000,
B00000000,
B00000110,
B00001111,
B11111111,
B11111110,
B11111100,
B11110000};
char HAP01[] = {8, 8, B00000000, B00000000, B10000000, B11100000, B01111111, B00011111, B00000111, B00000000};
char Glitch01[] = {8, 8,
B00100000,
B01111110,
B11011111,
B11000111,
B11111111,
B00000000,
B00000000,
B00000000};
char Glitch02[] = {8, 8,
B00000000,
B00000000,
B10000000,
B11110000,
B11111111,
B01111111,
B00011111,
B00000111};
char Glitch03[] = {8, 8,
B00000000,
B00000000,
B00000111,
B00011111,
B11111111,
B11111111,
B11111000,
B11100000};
char Glitch04[] = {8, 8,
B00011111,
B11111111,
B11111111,
B11111111,
B11111111,
B11111111,
B00011111,
B00001111};
//Left side of the helmet
char noseLeft[] = {8, 8, B00000000, B00000000, B00000001, B00000011, B00000011, B00111111, B01111110, B00000000};
char icon01L[] = {8, 8, B00001000, B00011110, B01111011, B11100011, B11111111, B00000000, B00000000, B00000000};
char icon02L[] = {8, 8, B00000000, B00000000, B00000000, B00000001, B00000111, B00011110, B01111000, B11100000};
char icon03L[] = {8, 8, B00000000, B00000000, B00000000, B00000000, B11100000, B01111000, B00011110, B00000111};
char icon04L[] = {8, 8, B00000000, B00000000, B00000000, B00000111, B00011111, B01111000, B11100000, B10000000};
char Eye02L[] = {8, 8, B00000000,B00000000,B00000000,B00000001,B00000111,B00011111,B01111111,B11111000};
char Eye01L[] = {8, 8, B00001000,B00111100,B11111110,B11111111,B11111111,B11111100,B10000000,B00000000};
char Angry2L[] = {8, 8,
B00000000,
B00000000,
B00000000,
B00000011,
B00001111,
B00111111,
B00011111,
B00001110,};
char Angry1L[] = {8, 8,
B00010000,
B00110000,
B11110000,
B11110000,
B11100000,
B11000000,
B10000000,
B00000000,};
char Spooked2L[] = {8, 8,
B00000000,
B11100000,
B11110000,
B11111000,
B11111000,
B11111100,
B00000000,
B00000000};
char Spooked1L[] = {8, 8,
B00000000,
B00000111,
B00001111,
B00011111,
B00011111,
B00111111,
B00000000,
B00000000,};
char ZZZ2L[] = {8, 8, B00000000,B00001111,B00000000,B00000001,B11110010,B00100100,B01001111,B11110000};
char ZZZ1L[] = {8, 8, B00111111,B11000010,B10000100,B00001000,B00010000,B00111111,B11000000,B00000000};
char none[] = {8, 8, B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000};
char Glitch01L[] = {8, 8,
B00001000,
B01111110,
B11111011,
B11100011,
B11111111,
B00000000,
B00000000,
B00000000};
char Glitch02L[] = {8, 8,
B00000000,
B00000000,
B00000001,
B00001111,
B11111111,
B11111110,
B11111000,
B11100000};
char Glitch03L[] = {8, 8,
B00000000,
B00000000,
B11100000,
B11111000,
B11111111,
B11111111,
B00011111,
B00000111};
char Glitch04L[] = {8, 8,
B11111000,
B11111111,
B11111111,
B11111111,
B11111111,
B11111111,
B11111000,
B11110000};
const int interruptPin = 2;
const int interruptPin2 = 3;
volatile long debounceTime = 0;
volatile long currentTime = 0;
char HAP02L[] = {8, 8, B00000000, B00000000, B01100000, B11110000, B11111111, B01111111, B00111111, B00001111};
char HAP01L[] = {8, 8, B00000000, B00000000, B00000001, B00000111, B11111110, B11111000, B11100000, B00000000};
int redPin = 5; //These pins are used for the expression indicating rgb LED.
int greenPin = 11;
int bluePin = 9;
//The terms DIN, CLK and CS state where you should connect the the cables from the matrix to the Arduino,
//so DIN is connected to digital pin 6 on the arduino and the CLK on digital pin 7
int DIN = 6; // DIN pin of MAX7219 module
int CLK = 7; // CLK pin of MAX7219 module
int CS = 8; // CS pin of MAX7219 module
int maxInUse = 14; //Change this number to the amount of matrixes you linked together
byte counter = 0;
byte counter2 = 0;
int column1L = 104;
int column2L = 112;
int column3L = 95;
int column4L = 103;
int column1 = 8;
int column2 = 16;
int column3 = -1;
int column4 = 7;
int state = 0;
int state2;
int stateSerial;
MaxMatrix m(DIN, CS, CLK, maxInUse);
void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
randomSeed(analogRead(0));
m.init();
m.setIntensity(0); // You can change the brightness of the matrices within a range of 0-15
m.clear();
pinMode(interruptPin, OUTPUT);
digitalWrite(2, HIGH);
attachInterrupt(digitalPinToInterrupt(2),ISR_button, FALLING);
pinMode(interruptPin2, INPUT);
attachInterrupt(digitalPinToInterrupt(3), hallSensor, CHANGE);
if (digitalRead(3) == 0) {
state2 = 1;
}
}
void loop()
{
if (Serial.available() > 0) { //Used for input through bluetooth or serial monitor instead of button.
stateSerial = Serial.read(); //Mainly for testing purposes
}
if (stateSerial == ‘0‘) {
state = 0;
}
if (stateSerial == ‘1‘) {
state = 1;
}
if (stateSerial == ‘2‘) {
state = 2;
}
if (stateSerial == ‘3‘) {
state = 3;
}
if (stateSerial == ‘4‘) {
state = 4;
}
if (counter2 > 17) { //The blinking animation begins here
for (int i = 0; i < 5; i++) {
column1L = column1L - 1;
column2L = column2L - 1;
column1 = column1 - 1;
column2 = column2 - 1;
column3L = column3L + 1;
column4L = column4L + 1;
column3 = column3 + 1;
column4 = column4 + 1;
m.setColumn(column1L, 00000000);
m.setColumn(column2L, 00000000);
m.setColumn(column3L, 00000000);
m.setColumn(column4L, 00000000);
m.setColumn(column1, 00000000);
m.setColumn(column2, 00000000);
m.setColumn(column3, 00000000);
m.setColumn(column4, 00000000);
delay(15);
counter2++;
}
column1L = 104;
column2L = 112;
column3L = 95;
column4L = 103;
column1 = 8;
column2 = 16;
column3 = -1;
column4 = 7;
counter2 = 0;
}
counter2++;
Serial.print(("Expression #"));
Serial.println(state);
switch (state) { //First button press: serious expression
case 0:
m.writeSprite(104, 0, Eye01L);
m.writeSprite(96, 0, Eye02L);
m.writeSprite(8, 0, Eye02);
m.writeSprite(0, 0, Eye01);
setColor(0, 32, 0);
if (digitalRead(3) == 0) {
m.writeSprite(88, 0, icon01L); //Icons for the mouth and nose are being turned on here
m.writeSprite(80, 0, icon02L);
m.writeSprite(72, 0, icon03L);
m.writeSprite(64, 0, icon04L);
m.writeSprite(56, 0, noseLeft);
m.writeSprite(48, 0, noseRight);
m.writeSprite(40, 0, icon04);
m.writeSprite(32, 0, icon03);
m.writeSprite(24, 0, icon02);
m.writeSprite(16, 0, icon01);
}
if (digitalRead(3) == 1) {
m.writeSprite(64, 0, Glitch04L);
m.writeSprite(72, 0, Glitch03L);
m.writeSprite(80, 0, Glitch02L);
m.writeSprite(88, 0, Glitch01L);
m.writeSprite(16, 0, Glitch01);
m.writeSprite(24, 0, Glitch02);
m.writeSprite(32, 0, Glitch03);
m.writeSprite(40, 0, Glitch04);
}
break;
case 1: //Second button press: Surprised
m.writeSprite(104, 0, Spooked2L);
m.writeSprite(96, 0, Spooked1L);
m.writeSprite(8, 0, Spooked1);
m.writeSprite(0, 0, Spooked2);
setColor(0, 0, 8);
if (digitalRead(3) == 0) {
m.writeSprite(88, 0, icon01L); //Icons for the mouth and nose are being turned on here
m.writeSprite(80, 0, icon02L);
m.writeSprite(72, 0, icon03L);
m.writeSprite(64, 0, icon04L);
m.writeSprite(56, 0, noseLeft);
m.writeSprite(48, 0, noseRight);
m.writeSprite(40, 0, icon04);
m.writeSprite(32, 0, icon03);
m.writeSprite(24, 0, icon02);
m.writeSprite(16, 0, icon01);
}
if (digitalRead(3) == 1) {
m.writeSprite(64, 0, Glitch04L);
m.writeSprite(72, 0, Glitch03L);
m.writeSprite(80, 0, Glitch02L);
m.writeSprite(88, 0, Glitch01L);
m.writeSprite(16, 0, Glitch01);
m.writeSprite(24, 0, Glitch02);
m.writeSprite(32, 0, Glitch03);
m.writeSprite(40, 0, Glitch04);
}
break;
case 2:
m.writeSprite(104, 0, HAP01L);
m.writeSprite(96, 0, HAP02L);
m.writeSprite(8, 0, HAP02);
m.writeSprite(0, 0, HAP01);
setColor(255, 242, 0);
if (digitalRead(3) == 0) {
m.writeSprite(88, 0, icon01L); //Icons for the mouth and nose are being turned on here
m.writeSprite(80, 0, icon02L);
m.writeSprite(72, 0, icon03L);
m.writeSprite(64, 0, icon04L);
m.writeSprite(56, 0, noseLeft);
m.writeSprite(48, 0, noseRight);
m.writeSprite(40, 0, icon04);
m.writeSprite(32, 0, icon03);
m.writeSprite(24, 0, icon02);
m.writeSprite(16, 0, icon01);
}
if (digitalRead(3) == 1) {
m.writeSprite(64, 0, Glitch04L);
m.writeSprite(72, 0, Glitch03L);
m.writeSprite(80, 0, Glitch02L);
m.writeSprite(88, 0, Glitch01L);
m.writeSprite(16, 0, Glitch01);
m.writeSprite(24, 0, Glitch02);
m.writeSprite(32, 0, Glitch03);
m.writeSprite(40, 0, Glitch04);
}
break;
case 3: //Third button press: zzz expression
m.writeSprite(104, 0, ZZZ1L);
m.writeSprite(96, 0, ZZZ2L);
m.writeSprite(8, 0, ZZZ1);
m.writeSprite(0, 0, ZZZ2);
setColor(255, 128, 64);
if (digitalRead(3) == 0) {
m.writeSprite(88, 0, icon01L); //Icons for the mouth and nose are being turned on here
m.writeSprite(80, 0, icon02L);
m.writeSprite(72, 0, icon03L);
m.writeSprite(64, 0, icon04L);
m.writeSprite(56, 0, noseLeft);
m.writeSprite(48, 0, noseRight);
m.writeSprite(40, 0, icon04);
m.writeSprite(32, 0, icon03);
m.writeSprite(24, 0, icon02);
m.writeSprite(16, 0, icon01);
}
if (digitalRead(3) == 1) {
m.writeSprite(64, 0, Glitch04L);
m.writeSprite(72, 0, Glitch03L);
m.writeSprite(80, 0, Glitch02L);
m.writeSprite(88, 0, Glitch01L);
m.writeSprite(16, 0, Glitch01);
m.writeSprite(24, 0, Glitch02);
m.writeSprite(32, 0, Glitch03);
m.writeSprite(40, 0, Glitch04);
}
break;
case 4: //Third button press: Angry expression
m.writeSprite(104, 0, Angry1L);
m.writeSprite(96, 0, Angry2L);
m.writeSprite(8, 0, Angry2);
m.writeSprite(0, 0, Angry1);
setColor(16, 0, 0);
if (digitalRead(3) == 0) {
m.writeSprite(88, 0, icon01L); //Icons for the mouth and nose are being turned on here
m.writeSprite(80, 0, icon02L);
m.writeSprite(72, 0, icon03L);
m.writeSprite(64, 0, icon04L);
m.writeSprite(56, 0, noseLeft);
m.writeSprite(48, 0, noseRight);
m.writeSprite(40, 0, icon04);
m.writeSprite(32, 0, icon03);
m.writeSprite(24, 0, icon02);
m.writeSprite(16, 0, icon01);
}
if (digitalRead(3) == 1) {
m.writeSprite(64, 0, Glitch04L);
m.writeSprite(72, 0, Glitch03L);
m.writeSprite(80, 0, Glitch02L);
m.writeSprite(88, 0, Glitch01L);
m.writeSprite(16, 0, Glitch01);
m.writeSprite(24, 0, Glitch02);
m.writeSprite(32, 0, Glitch03);
m.writeSprite(40, 0, Glitch04);
}
break;
}
}
void ISR_button() { //Stuff you shouldn‘t touch :P
currentTime = millis();
if ((currentTime - debounceTime) > 250) {
if (state < 4) {
state++;
}
else {
state = 0;
}
}
debounceTime = currentTime;
}
void hallSensor() { //Stuff you shouldn‘t touch :P
currentTime = millis();
if ((currentTime - debounceTime) > 25) {
if (digitalRead(3) == 0) {
state2 = 1;
}
else {
state2 = 0;
}
}
debounceTime = currentTime;
}
void setColor(int redValue, int greenValue, int blueValue) {
analogWrite(redPin, redValue);
analogWrite(greenPin, greenValue);
analogWrite(bluePin, blueValue);
}
由YT大佬的开源代码改来,主要是觉得太单调加了口型同步与其他表情
开发板:arduino nano
原文:https://www.cnblogs.com/ElecHex/p/14443119.html