Arduino爱好者

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: eagler8

[经验] 【Arduino】108种传感器系列实验(22)---MAX7219点阵模块

[复制链接]
 楼主| 发表于 2022-5-12 13:33 | 显示全部楼层
ADXL345三轴模块点阵屏加速度仪
1)实验接线示意图
6.3-43.jpg

 楼主| 发表于 2022-5-12 13:34 | 显示全部楼层
2Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序九:点阵屏加速度仪
  4. */

  5. #include <LedControl.h> //导入点阵屏驱动库
  6. #include <Wire.h>

  7. #define DEVICE (0x53)   //ADXL345设备地址
  8. #define TO_READ (6)    //我们要读取的字节数(每个轴两个字节)

  9. byte buff[TO_READ] ;    //6字节缓冲区,用于保存从设备读取的数据
  10. char str[512];          //字符串缓冲区在发送数据之前对其进行转换

  11. int MATRIX_WIDTH = 8;
  12. LedControl lc = LedControl(12, 10, 11, 1); // 点阵屏接脚:DIN, CLK, CS, NRDEV
  13. unsigned long delaytime = 50;
  14. int x_key = A1;
  15. int y_key = A0;
  16. int x_pos;
  17. int y_pos;

  18. // 表示单个灯光位置的对象
  19. // 未来的重力更新
  20. class Grain
  21. {
  22.   public:
  23.     int x = 0;
  24.     int y = 0;
  25.     int mass = 1;
  26. };
  27. Grain *g;

  28. void setup() {
  29.   //设置一个grain对象
  30.   g = new Grain();

  31.   ClearDisplay();

  32.   Wire.begin();        // 加入 i2c 总线(主机地址可选)
  33.   Serial.begin(9600);  // 启动串口输出

  34.   //开启ADXL345
  35.   writeTo(DEVICE, 0x2D, 0);
  36.   writeTo(DEVICE, 0x2D, 16);
  37.   writeTo(DEVICE, 0x2D, 8);
  38. }

  39. void loop() {
  40.   // 第一个轴加速度数据寄存器
  41.   int regAddress = 0x32;
  42.   int x, y, z;

  43.   readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据

  44.   // 合并每个方向的两个字节
  45.   // 最低有效位在前
  46.   x = (((int)buff[1]) << 8) | buff[0];
  47.   y = (((int)buff[3]) << 8) | buff[2];
  48.   z = (((int)buff[5]) << 8) | buff[4];

  49.   // 将值转换为可以在矩阵上表示的值
  50.   x = map(x, -300, 300, 0, 8);
  51.   y = map(y, -300, 300, 0, 8);
  52.   z = map(z, -300, 300, 0, 8);

  53.   //我们将x y z值作为字符串发送到串口
  54.   Serial.print("X: ");
  55.   Serial.print(x);
  56.   Serial.print("   Y: ");
  57.   Serial.print(y);
  58.   Serial.print("   Z: ");
  59.   Serial.print(z);
  60.   Serial.print("\n");

  61.   ClearDisplay();
  62.   //将grain分配到这个位置
  63.   g->x = x;
  64.   g->y = y;
  65.   lc.setLed(0, g->x, g->y, true);

  66.   //在每次更新之间添加一些延迟
  67.   delay(10);
  68. }

  69. void ClearDisplay() {
  70.   //设置液晶显示器
  71.   int devices = lc.getDeviceCount();

  72.   for (int address = 0; address < devices; address++)
  73.   {
  74.     lc.shutdown(address, false);
  75.     lc.setIntensity(address, 1);
  76.     lc.clearDisplay(address);
  77.   }
  78. }

  79. //将val写入设备上的地址寄存器
  80. void writeTo(int device, byte address, byte val)
  81. {
  82.   Wire.beginTransmission(device); //开始传输到设备
  83.   Wire.write(address);        // 发送寄存器地址
  84.   Wire.write(val);        // 发送要写入的值
  85.   Wire.endTransmission(); //结束传输
  86. }

  87. //从设备上的地址寄存器开始读取num字节到buff数组
  88. void readFrom(int device, byte address, int num, byte buff[])
  89. {
  90.   Wire.beginTransmission(device); //开始传输到设备
  91.   Wire.write(address);        //发送要读取的地址
  92.   Wire.endTransmission(); //结束传输

  93.   Wire.beginTransmission(device); //开始传输到设备
  94.   Wire.requestFrom(device, num);  // 从设备请求 6 个字节

  95.   int i = 0;
  96.   while (Wire.available()) //设备发送的数据可能少于请求的数据(异常)
  97.   {
  98.     buff[i] = Wire.read(); // 接收一个字节
  99.     i++;
  100.   }
  101.   Wire.endTransmission(); //结束传输
  102.   delay(300);
  103. }
复制代码


 楼主| 发表于 2022-5-12 13:34 | 显示全部楼层
3)实验串口返回情况

6.3-44.jpg

 楼主| 发表于 2022-5-12 13:35 | 显示全部楼层
4)打开Arduino IDE——工具——串口绘图器,查看实验波形
实验串口绘图器返回情况

6.3-45.jpg

 楼主| 发表于 2022-5-12 13:36 | 显示全部楼层
5)实验场景图

6.3-46.jpg

 楼主| 发表于 2022-5-12 13:37 | 显示全部楼层
6)实验的视频记录


 楼主| 发表于 2022-12-4 07:31 | 显示全部楼层
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二十二:MAX7219点阵显示模块(8X8 LED共阴)
  项目之四十:冬天来了,是时候考虑一些温暖的想法和LED矩阵上的壁炉了

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

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

  8. int theHeightTarget[8];
  9. int theHeightCurrent[8];

  10. int fireHeight = 0;
  11. int sparkX = 0;

  12. void setup() {
  13.   lc.shutdown(0, false);
  14.   lc.setIntensity(0, 8);
  15.   lc.clearDisplay(0);
  16.   Serial.begin(115200);
  17. }

  18. void loop() {  
  19.   //lc.clearDisplay(0);
  20.   // set Heights
  21.   if (int(random(1)) == 0) {
  22.     for (int x = 0; x < 8; x++) {
  23.       theHeightTarget[x] = int(random(5)) + 1;
  24.     }
  25.   }

  26.   // update
  27.   for (int x = 0; x < 8; x++) {
  28.     if (theHeightTarget[x] > theHeightCurrent[x])theHeightCurrent[x]++;
  29.     if (theHeightTarget[x] < theHeightCurrent[x])theHeightCurrent[x]--;
  30.   }

  31.   // show display
  32.   for (int x = 0; x < 8; x++) {
  33.     for (int y = 0; y < theHeightCurrent[x]; y++) {
  34.       lc.setLed(0, x, y, 1);
  35.     }
  36.     for (int y = theHeightCurrent[x]; y < 8; y++) {
  37.       lc.setLed(0, x, y, 0);
  38.     }
  39.   }

  40.   // spark – Funkenflug
  41.   sparkX = int(random(8));
  42.   if (int(random(40)) == 0) {
  43.     for (int y = 4; y < 8; y++) {
  44.       if (y == 4) {
  45.         lc.setLed(0, sparkX, y, 1);
  46.       } else {
  47.         lc.setLed(0, sparkX, y, 1);
  48.         lc.setLed(0, sparkX, y - 1, 0);
  49.       }
  50.       delay(25);
  51.     }
  52.   } else {
  53.     delay(100);
  54.   }
  55. }
复制代码


 楼主| 发表于 2022-12-4 07:32 | 显示全部楼层
实验接线图


z801-2.jpg
 楼主| 发表于 2022-12-4 07:58 | 显示全部楼层
实验场景动态图


 楼主| 发表于 2022-12-4 08:38 | 显示全部楼层
确定各行的照明高度。



  1. if (int(random(1)) == 0) {
  2.   for (int x = 0; x < 8; x++) {
  3.     theHeightTarget[x] = int(random(5)) + 1;
  4.   }
  5. }
复制代码


尝试调整当前的光高。


  1. // update
  2. for (int x = 0; x < 8; x++) {
  3.   if (theHeightTarget[x] > theHeightCurrent[x])theHeightCurrent[x]++;
  4.   if (theHeightTarget[x] < theHeightCurrent[x])theHeightCurrent[x]--;
  5. }
复制代码


然后显示在矩阵上:


  1. // show display
  2. for (int x = 0; x < 8; x++) {
  3.   for (int y = 0; y < theHeightCurrent[x]; y++) {
  4.     lc.setLed(0, x, y, 1);
  5.   }
  6.   for (int y = theHeightCurrent[x]; y < 8; y++) {
  7.     lc.setLed(0, x, y, 0);
  8.   }
  9. }
复制代码


时不时地,火花溶解并向上飞扬。


  1. // spark – Funkenflug
  2. sparkX = int(random(8));
  3. if (int(random(40)) == 0) {
  4.   for (int y = 4; y < 8; y++) {
  5.     if (y == 4) {
  6.       lc.setLed(0, sparkX, y, 1);
  7.     } else {
  8.       lc.setLed(0, sparkX, y, 1);
  9.       lc.setLed(0, sparkX, y - 1, 0);
  10.     }
  11.   delay(25);
  12.   }
  13. } else {
  14.   delay(100);
  15. }
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino爱好者

GMT+8, 2022-12-7 09:07 , Processed in 0.072935 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表