【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验九十九:8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组

【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4_第1张图片

知识点:MAX7219
是美国MAXIM 公司推出的多位LED 显示驱动器,采用3 线串行接口传送数据,可直接与单片机接口连接,用户能方便修改其内部参数,以实现多位LED 显示。它内含硬件动态扫描电路、BCD译码器、段驱动器和位驱动器。此外,其内部还含有8X8 位静态RAM,用于存放8 个数字的显示数据。显然,它可直接驱动64 段LED点阵显示器。当多片MAX7219 级联时,可控制更多的LED 点阵显示器。显示的数据通过单片机数据处理后,送给MAX7219 显示。

MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。MAX7221与SPI™、QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。

【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4_第2张图片
8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组

8X32 LED点阵显示级联模块,MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。只需要3个IO口即可驱动1个点阵!点阵显示时无闪烁!支持级联!

【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4_第3张图片
8X32 LED点阵显示模块参考电原理图

在这里插入图片描述
【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4_第4张图片
Arduino实验接线示意图

【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4_第5张图片
【花雕动手做】有趣好玩的音乐可视化系列小项目(08)—四位32段点阵屏
项目之二:多档arduinoFFT浮点32段频谱仪

实验开源代码

/*
  【花雕动手做】有趣好玩的音乐可视化系列小项目(08)---四位32段点阵屏
  项目之二:多档arduinoFFT浮点32段频谱仪
  接脚连线:MAX9814 接A0
  MAX7219 UNO
  VCC →→→→→ 5V
  GND →→→→→ GND
  DIN →→→→→ D11(数据,数据接收引脚)
  CS →→→→→ D10(负载,命令接收引脚)
  CLK →→→→→ D13(时钟,时钟引脚)
*/

#include 
#include 
#include 

#define SAMPLES 64
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES  4
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10
#define  xres 32
#define  yres 8


int MY_ARRAY[] = {0, 128, 192, 224, 240, 248, 252, 254, 255};
int MY_MODE_1[] = {0, 128, 192, 224, 240, 248, 252, 254, 255};
int MY_MODE_2[] = {0, 128, 64, 32, 16, 8, 4, 2, 1};
int MY_MODE_3[] = {0, 128, 192, 160, 144, 136, 132, 130, 129};
int MY_MODE_4[] = {0, 128, 192, 160, 208, 232, 244, 250, 253};
int MY_MODE_5[] = {0, 1, 3, 7, 15, 31, 63, 127, 255};


double vReal[SAMPLES];
double vImag[SAMPLES];
char data_avgs[xres];

int yvalue;
int displaycolumn , displayvalue;
int peaks[xres];
const int buttonPin = 2;
int state = HIGH;
int previousState = LOW;
int displaymode = 1;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;


MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
arduinoFFT FFT = arduinoFFT();



void setup() {

  ADCSRA = 0b11100101;
  ADMUX = 0b00000000;
  pinMode(buttonPin, INPUT);
  mx.begin();
  delay(50);
}

void loop() {
  // ++ Sampling
  for (int i = 0; i < SAMPLES; i++)
  {
    while (!(ADCSRA & 0x10));
    ADCSRA = 0b11110101 ;
    int value = ADC - 512 ;
    vReal[i] = value / 8;
    vImag[i] = 0;
  }

  FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD);
  FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD);
  FFT.ComplexToMagnitude(vReal, vImag, SAMPLES);

  int step = (SAMPLES / 2) / xres;
  int c = 0;
  for (int i = 0; i < (SAMPLES / 2); i += step)
  {
    data_avgs[c] = 0;
    for (int k = 0 ; k < step ; k++) {
      data_avgs[c] = data_avgs[c] + vReal[i + k];
    }
    data_avgs[c] = data_avgs[c] / step;
    c++;
  }

  for (int i = 0; i < xres; i++)
  {
    data_avgs[i] = constrain(data_avgs[i], 0, 80);
    data_avgs[i] = map(data_avgs[i], 0, 80, 0, yres);
    yvalue = data_avgs[i];

    peaks[i] = peaks[i] - 1;
    if (yvalue > peaks[i])
      peaks[i] = yvalue ;
    yvalue = peaks[i];
    displayvalue = MY_ARRAY[yvalue];
    displaycolumn = 15 - i;
    mx.setColumn(displaycolumn, displayvalue);
  }

  displayModeChange ();
}

void displayModeChange() {
  int reading = digitalRead(buttonPin);
  if (reading == HIGH && previousState == LOW && millis() - lastDebounceTime > debounceDelay)

  {

    switch (displaymode) {
      case 1:
        displaymode = 2;
        for (int i = 0 ; i <= 8 ; i++ ) {
          MY_ARRAY[i] = MY_MODE_2[i];
        }
        break;
      case 2:
        displaymode = 3;
        for (int i = 0 ; i <= 8 ; i++ ) {
          MY_ARRAY[i] = MY_MODE_3[i];
        }
        break;
      case 3:
        displaymode = 4;
        for (int i = 0 ; i <= 8 ; i++ ) {
          MY_ARRAY[i] = MY_MODE_4[i];
        }
        break;
      case 4:
        displaymode = 5;
        for (int i = 0 ; i <= 8 ; i++ ) {
          MY_ARRAY[i] = MY_MODE_5[i];
        }
        break;
      case 5:
        displaymode = 1;
        for (int i = 0 ; i <= 8 ; i++ ) {
          MY_ARRAY[i] = MY_MODE_1[i];
        }
        break;
    }

    lastDebounceTime = millis();
  }
  previousState = reading;
}

【花雕动手做】有趣好玩的音乐可视化系列小项目(08)—四位32段点阵屏
项目之二:多档arduinoFFT浮点32段频谱仪

实验视频剪辑 1
https://v.youku.com/v_show/id_XNTgyMTY3NTQwNA==.html?spm=a2hcb.playlsit.page.1

实验场景动态图

【花雕动手做】有趣好玩的音乐可视化系列小项目(08)—四位32段点阵屏
项目之二:多档arduinoFFT浮点32段频谱仪

实验视频剪辑 7
https://v.youku.com/v_show/id_XNTgyMjA0MTI1Mg==.html?spm=a2hcb.playlsit.page.1

实验场景动态图7

【花雕动手做】有趣好玩的音乐可视化系列小项目(08)—四位32段点阵屏
项目之二:多档arduinoFFT浮点32段频谱仪

实验视频剪辑 8
https://v.youku.com/v_show/id_XNTgyMjA0MTM2MA==.html?spm=a2hcb.playlsit.page.1

实验场景动态图 8

【花雕动手做】有趣好玩的音乐可视化系列小项目(08)—四位32段点阵屏
项目之三:红绿色32段级联频谱点阵屏灯(FFT算法)

实验开源代码

/*
  【花雕动手做】有趣好玩的音乐可视化系列小项目(08)---四位32段点阵屏
  项目之三:红绿色32段级联频谱点阵屏灯(FFT算法)
  接脚连线:MAX9814 接A0
  MAX7219 UNO
  VCC →→→→→ 5V
  GND →→→→→ GND
  DIN →→→→→ D11(数据,数据接收引脚)
  CS →→→→→ D10(负载,命令接收引脚)
  CLK →→→→→ D13(时钟,时钟引脚)
*/

#include 

#include 

#include 

MD_MAX72XX disp = MD_MAX72XX(MD_MAX72XX::FC16_HW, 10, 1);

arduinoFFT FFT = arduinoFFT();

double realComponent[64];

double imagComponent[64];

int spectralHeight[] = {0b00000000, 0b10000000, 0b11000000,

                        0b11100000, 0b11110000, 0b11111000,

                        0b11111100, 0b11111110, 0b11111111
                       };

int index, c, value;

void setup()

{

  disp.begin();

  Serial.begin(9600);

}

void loop()

{

  int sensitivity = map(analogRead(A0), 0, 1023, 50, 100);

  Serial.println (analogRead(A0));

  for (int i = 0; i < 64; i++)

  {

    realComponent[i] = analogRead(A7) / sensitivity;

    imagComponent[i] = 0;

  }

  FFT.Windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD);

  FFT.Compute(realComponent, imagComponent, 64, FFT_FORWARD);

  FFT.ComplexToMagnitude(realComponent, imagComponent, 64);

  for (int i = 0; i < 32; i++)

  {

    realComponent[i] = constrain(realComponent[i], 0, 80);

    realComponent[i] = map(realComponent[i], 0, 80, 0, 8);

    index = realComponent[i];

    value = spectralHeight[index];

    c = 31 - i;

    disp.setColumn(c, value);

  }

}

【花雕动手做】有趣好玩的音乐可视化系列小项目(08)—四位32段点阵屏
项目之三:红绿色32段级联频谱点阵屏灯(FFT算法)

实验视频剪辑 2

https://v.youku.com/v_show/id_XNTgyMTc1NTk2OA==.html?spm=a2hcb.playlsit.page.1

实验场景动态图 2

【花雕动手做】有趣好玩的音乐可视化系列小项目
项目之四:FFT算法的双点阵屏的动态频谱仪

实验视频剪辑

https://v.youku.com/v_show/id_XNTgyMjEwNjcwMA==.html?spm=a2hcb.playlsit.page.1

实验场景图

【雕爷学编程】Arduino动手做(99)---8X32 LED点阵屏模块4_第6张图片

你可能感兴趣的:(嵌入式硬件,单片机,物联网,c++,Arduino,8X32,LED点阵屏模块)