[Diao Ye learns programming] Arduino hands-on (22) - 8X8 LED dot matrix MAX7219 screen 8

The reference to 37 sensors and modules has been widely circulated on the Internet. In fact, there must be more than 37 sensor modules compatible with Arduino. In view of the fact that I have accumulated some sensors and modules on hand, according to the concept of true knowledge (must be done by hands), for the purpose of learning and communication, I am going to try and do experiments one by one here, and will record them whether they are successful or not.

[Arduino] 108 sensor module series experiments (data + code + graphics + simulation)
Experiment 22: MAX7219 dot matrix display module (8X8 LED common cathode screen)

insert image description here

Program 11: Display m, i, r, t, o, e, k in a loop, as well as smiley faces, hearts and arrows in four directions.
Arduino reference open source code

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序十一:循环显示m,i,r,t,o,e,k还有笑脸、爱心和四个方向的箭头
  引脚定义
  DIN = D11
  CLK = D13
  CS  = D10
*/

#include <LedControl.h>//导入驱动库

int DIN = 11;//定义引脚
int CS =  10;
int CLK = 13;

byte m[8] =     {
    
    0xE7, 0xFF, 0xFF, 0xDB, 0xDB, 0xDB, 0xC3, 0xC3}; //英文字母m
byte i[8] =     {
    
    0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10}; //英文字母i
byte r[8] =     {
    
    0x00, 0x00, 0x2c, 0x32, 0x20, 0x20, 0x20, 0x20}; //英文字母r
byte o[8] =     {
    
    0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x22, 0x1c}; //英文字母o
byte t[8] =     {
    
    0x00, 0x00, 0x10, 0x7e, 0x10, 0x10, 0x14, 0x18}; //英文字母t
byte e[8] =     {
    
    0x00, 0x3c, 0x42, 0x42, 0x7e, 0x40, 0x40, 0x3e}; //英文字母e
byte k[8] =     {
    
    0x00, 0x20, 0x20, 0x24, 0x28, 0x30, 0x28, 0x24}; //英文字母k

byte smile[8] =   {
    
    0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C}; //微笑
byte love_1[8] =   {
    
    0x00, 0x66, 0x99, 0x81, 0x42, 0x24, 0x18, 0x00}; //爱心-1
byte love_2[8] =   {
    
    0x00, 0x66, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x00}; //爱心-2

//实心箭头
byte Front[8] =   {
    
    0x08, 0x1c, 0x3e, 0x7f, 0x1c, 0x1c, 0x1c, 0x1c}; //前
byte back[8] =    {
    
    0x1c, 0x1c, 0x1c, 0x1c, 0x7f, 0x3e, 0x1c, 0x08}; //后
byte left[8] =    {
    
    0x10, 0x30, 0x7f, 0xff, 0x7f, 0x30, 0x10, 0x00}; //左
byte right[8] =   {
    
    0x08, 0x0c, 0xfe, 0xff, 0xfe, 0x0c, 0x08, 0x00}; //右

LedControl lc = LedControl(DIN, CLK, CS, 0);//定义引脚

void setup() {
    
    
  lc.shutdown(0, false);      //MAX7219启动时处于省电模式
  lc.setIntensity(0, 15);     // 将亮度设置为最大值
  lc.clearDisplay(0);         // 并清除显示
}

void loop() {
    
    

  printByte(smile);
  delay(1000);

  printByte(love_1);
  delay(1000);

  printByte(love_2);
  delay(1000);

  printByte(Front);
  delay(1000);

  printByte(back);
  delay(1000);

  printByte(left);
  delay(1000);

  printByte(right);
  delay(1000);

  printLetter();
  lc.clearDisplay(0);
  delay(1000);
}

void printLetter(){
    
    
  printByte(m);
  delay(1000);
  printByte(i);
  delay(1000);
  printByte(r);
  delay(1000);
  printByte(o);
  delay(1000);
  printByte(t);
  delay(1000);
  printByte(e);
  delay(1000);
  printByte(k);
  delay(1000);
}

void printByte(byte character []){
    
    
  int i = 0;
  for (i = 0; i < 8; i++)
  {
    
    
    lc.setRow(0, i, character[i]);
  }
}

insert image description here
insert image description here
insert image description here
insert image description here
insert image description here
Ultra-simple LED Matrix graphics editing tool:
After the above procedure, we will introduce the PixeltoMatrix graphics editing tool. The result of PixeltoMatrix editing can generate Arduino hexadecimal or binary animation code.
PixeltoMatrix editing tool: Download
https://www.dropbox.com/sh/9ehblhdvx8yvx6b/AAAo24EZKiQbVtwySxL5h8lja?dl=0
▼Execute PixelToMatrix.exe to start drawing graphics, click "Generate" after drawing, it will automatically generate hexadecimal or binary code, you can add this code to your program, For example, the 16th line of the above example "love-1".

insert image description here

Program 12: Randomly generate an LED to simulate the bouncing point
Arduino reference open source code

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序十二:随机生成的一个 LED 模拟弹跳点
  引脚定义
  DIN = D11
  CLK = D13
  CS  = D10
*/

#include "LedControl.h"//导入驱动库
LedControl lc = LedControl (11, 13, 10, 1); //定义引脚

int row;
int row_prev;
int col;
int col_prev;
int ball_timer = 100;
long randNumber;
long updown = 1;       // 指示移动:+1 向上一排,-1 向下一排
long leftright = 1;    // 指示移动:+1 是右一列,-1 是左一列


byte smiley[] =       // 填充数组以打开笑脸
{
    
    
  B00111110,
  B01000001,
  B10010101,
  B10100001,
  B10100001,
  B10010101,
  B01000001,
  B00111010
};


void setup() {
    
    
  Serial.begin (9600);
  // MAX72XX 启动时处于省电模式,
  // 我们必须做一个叫醒服务
  lc.shutdown (0, false);

  // 将亮度设置为中等值
  lc.setIntensity (0, 8);     // 0 = 低; 8 = 高

  // 显示笑脸 - 证明 8x8 数组有效
  smile();
  delay(1000);

  //清除显示
  lc.clearDisplay (0);

  // 初始位置
  randomSeed (analogRead(0));
  col = random (1, 7);    // 选择 1 到 7 之间的列位置
  row = random (1, 7);    // 选择 1 到 7 之间的行位置

  // 检查显示单元是否工作

  // 在串行监视器上显示起始列和行号
  Serial.println ("开始条件" );
  Serial.print ("行: ");
  Serial.println (row);
  Serial.print ("列: ");
  Serial.println (col);
  Serial.println ("=======");
  Serial.println ();
}

void loop() {
    
    
  col_prev = col;      //记录球的位置,列
  row_prev = row;      //记录球的位置,行
  row = row + updown;
  col = col + leftright;

  checkVectors ();

  lc.setLed (0, col_prev, row_prev, false); // 清除前一个球的位置
  lc.setLed (0, col, row, true);            // 点亮新球的位置
  delay (ball_timer);
  debug(); // 运行调试模块
  delay(1000);
}
// ============ 子程序 ===========================================
void smile() {
    
    
  for (int i = 0; i < 8; i++)
  {
    
    
    lc.setRow (0, i, smiley[i]);
  }
}

void checkVectors () {
    
    
  if ((row > 7) && (updown = 1)) {
    
    
    updown = -1;
    row = 6;
  }

  if ((row < 0) && (updown = -1)) {
    
    
    updown = 1;
    row = 1;
  }

  if ((col > 7) && (leftright = 1)) {
    
    
    leftright = -1;
    col = 6;
  }

  if ((col < 0) && (leftright = -1)) {
    
    
    leftright = 1;
    col = 1;
  }
}

void debug() {
    
    
  Serial.print ("列: " );
  Serial.println (col);
  Serial.print ("行: " );
  Serial.println (row);
}

Experimental serial port return

insert image description here
insert image description here
Program 13: Randomly flashing stars on the screen
Arduino reference open source code

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序十三:漫屏随机闪烁星星
  引脚定义
  DIN = D11
  CLK = D13
  CS  = D10
*/

#include "LedControl.h"//导入驱动库
LedControl lc = LedControl (11, 13, 10, 1); //定义引脚

void setup() {
    
    
  lc.shutdown(0, false); // 关闭省电模式
  lc.setIntensity(0, 15); // 设定亮度为 15 (介于0~15之间)
  lc.clearDisplay(0);    // 清除屏幕
}

void loop() {
    
    
  int randNumber_col = random(8);
  int randNumber_row = random(8);
  lc.setLed(0, randNumber_col, randNumber_row, 1); //将Led的行列点,設定为亮
  delay(5);
  lc.setLed(0, randNumber_col, randNumber_row, 0); //将Led的行列点,設定为暗
}

insert image description here

[Arduino] 168 kinds of sensor module series experiment (data code + simulation programming + graphics programming)
experiment 22: MAX7219 dot matrix display module (8X8 LED common cathode)
project: Arduino matrix display code
Arduino experiment open source code

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二十二:MAX7219点阵显示模块(8X8 LED共阴)
  项目之四十一:Arduino 矩阵显示代码
*/

//We always have to include the library
#include "LedControl.h"

/*
 Now we need a LedControl to work with.
 ***** These pin numbers will probably not work with your hardware *****
 pin 12 is connected to the DataIn 
 pin 11 is connected to the CLK 
 pin 10 is connected to LOAD 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=100;

void setup() {
    
    
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);
}

/*
 This method will display the characters for the
 word "Arduino" one after the other on the matrix. 
 (you need at least 5x7 leds to see the whole chars)
 */
void writeArduinoOnMatrix() {
    
    
  /* here is the data for the characters */
  byte a[5]={
    
    B01111110,B10001000,B10001000,B10001000,B01111110};
  byte r[5]={
    
    B00111110,B00010000,B00100000,B00100000,B00010000};
  byte d[5]={
    
    B00011100,B00100010,B00100010,B00010010,B11111110};
  byte u[5]={
    
    B00111100,B00000010,B00000010,B00000100,B00111110};
  byte i[5]={
    
    B00000000,B00100010,B10111110,B00000010,B00000000};
  byte n[5]={
    
    B00111110,B00010000,B00100000,B00100000,B00011110};
  byte o[5]={
    
    B00011100,B00100010,B00100010,B00100010,B00011100};

  /* now display them one by one with a small delay */
  lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  delay(delaytime);
  lc.setRow(0,0,r[0]);
  lc.setRow(0,1,r[1]);
  lc.setRow(0,2,r[2]);
  lc.setRow(0,3,r[3]);
  lc.setRow(0,4,r[4]);
  delay(delaytime);
  lc.setRow(0,0,d[0]);
  lc.setRow(0,1,d[1]);
  lc.setRow(0,2,d[2]);
  lc.setRow(0,3,d[3]);
  lc.setRow(0,4,d[4]);
  delay(delaytime);
  lc.setRow(0,0,u[0]);
  lc.setRow(0,1,u[1]);
  lc.setRow(0,2,u[2]);
  lc.setRow(0,3,u[3]);
  lc.setRow(0,4,u[4]);
  delay(delaytime);
  lc.setRow(0,0,i[0]);
  lc.setRow(0,1,i[1]);
  lc.setRow(0,2,i[2]);
  lc.setRow(0,3,i[3]);
  lc.setRow(0,4,i[4]);
  delay(delaytime);
  lc.setRow(0,0,n[0]);
  lc.setRow(0,1,n[1]);
  lc.setRow(0,2,n[2]);
  lc.setRow(0,3,n[3]);
  lc.setRow(0,4,n[4]);
  delay(delaytime);
  lc.setRow(0,0,o[0]);
  lc.setRow(0,1,o[1]);
  lc.setRow(0,2,o[2]);
  lc.setRow(0,3,o[3]);
  lc.setRow(0,4,o[4]);
  delay(delaytime);
  lc.setRow(0,0,0);
  lc.setRow(0,1,0);
  lc.setRow(0,2,0);
  lc.setRow(0,3,0);
  lc.setRow(0,4,0);
  delay(delaytime);
}

/*
  This function lights up a some Leds in a row.
 The pattern will be repeated on every row.
 The pattern will blink along with the row-number.
 row number 4 (index==3) will blink 4 times etc.
 */
void rows() {
    
    
  for(int row=0;row<8;row++) {
    
    
    delay(delaytime);
    lc.setRow(0,row,B10100000);
    delay(delaytime);
    lc.setRow(0,row,(byte)0);
    for(int i=0;i<row;i++) {
    
    
      delay(delaytime);
      lc.setRow(0,row,B10100000);
      delay(delaytime);
      lc.setRow(0,row,(byte)0);
    }
  }
}

/*
  This function lights up a some Leds in a column.
 The pattern will be repeated on every column.
 The pattern will blink along with the column-number.
 column number 4 (index==3) will blink 4 times etc.
 */
void columns() {
    
    
  for(int col=0;col<8;col++) {
    
    
    delay(delaytime);
    lc.setColumn(0,col,B10100000);
    delay(delaytime);
    lc.setColumn(0,col,(byte)0);
    for(int i=0;i<col;i++) {
    
    
      delay(delaytime);
      lc.setColumn(0,col,B10100000);
      delay(delaytime);
      lc.setColumn(0,col,(byte)0);
    }
  }
}

/* 
 This function will light up every Led on the matrix.
 The led will blink along with the row-number.
 row number 4 (index==3) will blink 4 times etc.
 */
void single() {
    
    
  for(int row=0;row<8;row++) {
    
    
    for(int col=0;col<8;col++) {
    
    
      delay(delaytime);
      lc.setLed(0,row,col,true);
      delay(delaytime);
      for(int i=0;i<col;i++) {
    
    
        lc.setLed(0,row,col,false);
        delay(delaytime);
        lc.setLed(0,row,col,true);
        delay(delaytime);
      }
    }
  }
}

void loop() {
    
     
  writeArduinoOnMatrix();
  rows();
  columns();
  single();
}

[Arduino] 168 kinds of sensor module series experiment (data code + simulation programming + graphic programming)
experiment 22: MAX7219 dot matrix display module (8X8 LED common cathode)
project: winter is coming, it is time to consider some warm ideas and a fireplace on the LED matrix
Arduino experiment open source code

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二十二:MAX7219点阵显示模块(8X8 LED共阴)
  项目之四十:冬天来了,是时候考虑一些温暖的想法和LED矩阵上的壁炉了
*/

#include "LedControl.h"
LedControl lc = LedControl(12, 11, 10, 1);

int theHeightTarget[8];
int theHeightCurrent[8];

int fireHeight = 0;
int sparkX = 0;

void setup() {
    
    
  lc.shutdown(0, false);
  lc.setIntensity(0, 8);
  lc.clearDisplay(0);
  Serial.begin(115200);
}

void loop() {
    
      
  //lc.clearDisplay(0);
  // set Heights
  if (int(random(1)) == 0) {
    
    
    for (int x = 0; x < 8; x++) {
    
    
      theHeightTarget[x] = int(random(5)) + 1;
    }
  }

  // update
  for (int x = 0; x < 8; x++) {
    
    
    if (theHeightTarget[x] > theHeightCurrent[x])theHeightCurrent[x]++;
    if (theHeightTarget[x] < theHeightCurrent[x])theHeightCurrent[x]--;
  }

  // show display 
  for (int x = 0; x < 8; x++) {
    
    
    for (int y = 0; y < theHeightCurrent[x]; y++) {
    
    
      lc.setLed(0, x, y, 1);
    }
    for (int y = theHeightCurrent[x]; y < 8; y++) {
    
    
      lc.setLed(0, x, y, 0);
    }
  }

  // spark – Funkenflug
  sparkX = int(random(8));
  if (int(random(40)) == 0) {
    
    
    for (int y = 4; y < 8; y++) {
    
    
      if (y == 4) {
    
    
        lc.setLed(0, sparkX, y, 1);
      } else {
    
    
        lc.setLed(0, sparkX, y, 1);
        lc.setLed(0, sparkX, y - 1, 0);
      }
      delay(25);
    }
  } else {
    
    
    delay(100);
  }
}

insert image description here

Determines the lighting height for each row.

if (int(random(1)) == 0) {
    
    
  for (int x = 0; x < 8; x++) {
    
    
    theHeightTarget[x] = int(random(5)) + 1;
  }
}

Try adjusting the current light height.

// update
for (int x = 0; x < 8; x++) {
    
    
  if (theHeightTarget[x] > theHeightCurrent[x])theHeightCurrent[x]++;
  if (theHeightTarget[x] < theHeightCurrent[x])theHeightCurrent[x]--;
}

Then display on the matrix:

// show display
for (int x = 0; x < 8; x++) {
    
    
  for (int y = 0; y < theHeightCurrent[x]; y++) {
    
    
    lc.setLed(0, x, y, 1);
  }
  for (int y = theHeightCurrent[x]; y < 8; y++) {
    
    
    lc.setLed(0, x, y, 0);
  }
}

Every now and then, sparks dissolve and fly upward.

// spark – Funkenflug
sparkX = int(random(8));
if (int(random(40)) == 0) {
    
    
  for (int y = 4; y < 8; y++) {
    
    
    if (y == 4) {
    
    
      lc.setLed(0, sparkX, y, 1);
    } else {
    
    
      lc.setLed(0, sparkX, y, 1);
      lc.setLed(0, sparkX, y - 1, 0);
    }
  delay(25);
  }
} else {
    
    
  delay(100);
}

Guess you like

Origin blog.csdn.net/weixin_41659040/article/details/131800414