protogen面罩LED点阵代码
由YT大佬的开源代码改来,主要是觉得太单调加了口型同步与其他表情,霍尔传感器是用来控制口型(张嘴闭嘴)的,需要一个磁铁
开发板:arduino nano
#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); }

浙公网安备 33010602011771号