.

iT邦幫忙

0

MAX7219無法顯示

  • 分享至 

  • xImage

各位大大好,最近開始玩Arduino
那我遇到了一點問題…
我用了14塊MAX7219打算做顯示表情圖案的燈效
我程式什麼的都寫好了
但是我一旦上傳後,總是有4塊模組亮不了
硬體也檢查過了沒什麼問題…
我現在只能懷疑到程式上了

下面程式碼

#include <MaxMatrix.h>

//#define visorSensor

//Right side of the helmet
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 Glitch01[] = {8, 8, B00001100, B00000000, B11010100, B10001001, B00010100, B01000111, B11010001, B10100101};
char Glitch011[] = {8, 8, B00000000, B00000000, B00000000, B11010101, B10000101, B11101010, B00010111, B00000100};
char Glitch02[] = {8, 8, B01110100, B00000000, B01001011, B10010110, B00010010, B00000000, B00000000, B00000000};
char Glitch022[] = {8, 8, B10100010, B01010100, B10000110, B00010010, B00000101, B00000000, B00000000, B00000000};
char Glitch03[] = {8, 8, B00101001, B10101001, B01001011, B00101100, B01110100, B00000000, B00000000, B00000000};
char Glitch033[] = {8, 8, B01001101, B10011010, B01101001, B10100000, B00001000, B00000000, B00000000, B00000000};
char Glitch04[] = {8, 8, B00000000, B00000000, B10010101, B10011010, B10010111, B11101010, B10111010, B11010000};
char Glitch044[] = {8, 8, B00000000, B00000000, B10001000, B10101010, B00011011, B10010101, B00000001, B00000000};
char Eye02[] = {8, 8, B00000000, B00000000, B00000110, B00001111, B11111111, B11111110, B11111100, B11110000};
char Eye01[] = {8, 8, B00000000, B00000000, B10000000, B11100000, B01111111, B00011111, B00000111, B00000000};
char Angry1[] = {8, 8, B00000000, B11000000, B11110000, B11111000, B11111100, B11111100, B11111000, B00000000};
char Angry2[] = {8, 8, B00000000, B00000001, B00000111, B00011111, B00111111, B01111111, B00111111, B00000000};
char Spooked1[] = {8, 8, B00000001, B00000111, B00000111, B00001111, B00001111, B00000111, B00000111, B00000001};
char Spooked2[] = {8, 8, B10000000, B11100000, B11100000, B11110000, B11110000, B11100000, B11100000, B10000000};

//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 Glitch01L[] = {8, 8, B10100101, B11010001, B01000111, B00001010, B10001001, B11010100, B00001100, B00000000};
char Glitch011L[] = {8, 8, B00000000, B00000000, B00000000, B10101011, B10100001, B01010111, B11101000, B00100000};
char Glitch02L[] = {8, 8, B00000000, B00000000, B00000000, B00000000, B00010010, B10010110, B01001011, B01110100};
char Glitch022L[] = {8, 8, B00000000, B00000000, B00000000, B00000101, B00010010, B10000110, B01010100, B10100010};
char Glitch03L[] = {8, 8, B00000000, B00000000, B00000000, B01110100, B00101100, B01001011, B10101001, B00101001};
char Glitch033L[] = {8, 8, B00000000, B00000000, B00000000, B00001000, B10100000, B01101001, B10011010, B01001101};
char Glitch04L[] = {8, 8, B00000000, B00000000, B10101001, B01011001, B11101001, B01010111, B01011101, B00001011};
char Glitch044L[] = {8, 8, B00000000, B00000000, B00010001, B00000110, B01010101, B11011000, B10101001, B10000000};
char Eye02L[] = {8, 8, B00000000, B00000000, B01100000, B11110000, B11111111, B01111111, B00111111, B00001111};
char Eye01L[] = {8, 8, B00000000, B00000000, B00000001, B00000111, B11111110, B11111000, B11100000, B00000000};
char Angry2L[] = {8, 8, B00000000, B00000011, B00001111, B00011111, B00111111, B00111111, B00011111, B00000000};
char Angry1L[] = {8, 8, B00000000, B10000000, B11100000, B11111000, B11111100, B11111110, B11111100, B00000000};
char Spooked1L[] = {8, 8, B00000001, B00000111, B00000111, B00001111, B00001111, B00000111, B00000111, B00000001};
char Spooked2L[] = {8, 8, B10000000, B11100000, B11100000, B11110000, B11110000, B11100000, B11100000, B10000000};

const int interruptPin = 2;
const int interruptPin2 = 3;
volatile long debounceTime = 0;
volatile long currentTime = 0;

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() { //starting up sequence
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);

#ifndef visorSensor
state2 = 1;
#endif

#ifdef visorSensor
pinMode(interruptPin2, INPUT);
attachInterrupt(digitalPinToInterrupt(3), hallSensor, CHANGE);
if (digitalRead(3) == 0) {
state2 = 1;
}
#endif
}

void loop() { //This is where the program loop starts.
Serial.println(state2);
if (state2 == 1) { //The Hall sensor Detects wheter the visor is attached, only then will the leds turn on

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;
}

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 (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: Happy 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);               //Makes the colour of the rgb LED green
    //You can enter any number between 0 and 255 to make any colour combination.
    //255,255,255 for example would show a white colour and a lower number would dimm the LED.
    //(the 16,8 million colours were not a lie :P)
    break;

  case 1:                             //Second button press: Surprised
    m.writeSprite(104, 0, Spooked1L);
    m.writeSprite(96, 0, Spooked2L);
    m.writeSprite(8, 0, Spooked1);
    m.writeSprite(0, 0, Spooked2);
    setColor(0, 0, 8);              //Makes the colour of the LED blue
    break;

  case 2:                             //Third button press: Angry expression
    m.writeSprite(104, 0, Angry2L);
    m.writeSprite(96, 0, Angry1L);
    m.writeSprite(8, 0, Angry2);
    m.writeSprite(0, 0, Angry1);
    setColor(16, 0, 0);               //Makes the colour of the LED red
    counter++;

    if (counter == 16) {
      m.writeSprite(64, 0, Glitch044L);
      m.writeSprite(72, 0, Glitch033L);
      m.writeSprite(80, 0, Glitch022L);
      m.writeSprite(88, 0, Glitch011L);
      m.writeSprite(16, 0, Glitch011);
      m.writeSprite(24, 0, Glitch022);
      m.writeSprite(32, 0, Glitch033);
      m.writeSprite(40, 0, Glitch044);
      delay(75);
      counter++;
    }
    if ((counter >= 17) && (counter < 18)) {
      m.writeSprite(88, 0, icon01L);
      m.writeSprite(80, 0, icon02L);
      m.writeSprite(72, 0, icon03L);
      m.writeSprite(64, 0, icon04L);
      m.writeSprite(40, 0, icon04);
      m.writeSprite(32, 0, icon03);
      m.writeSprite(24, 0, icon02);
      m.writeSprite(16, 0, icon01);
      delay(200);
      counter++;
    }
    if (counter >= 18) {
      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);
      delay(75);
      counter = 0;
    }
    break;
}

}
else {
m.clear();
}
}

void ISR_button() { //Stuff you shouldn't touch :P
currentTime = millis();
if ((currentTime - debounceTime) > 250) {
if (state < 2) {
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);
}

.

尚未有邦友回答

立即登入回答