[作品提交] 【Follow me第二季第2期】LED矩阵+DAC正弦波+放大信号+ADC采集

sinc_sila   2024-9-16 15:12 楼主

LED矩阵:

Arduino UNO R4 WiFi配有内置 12x8 LED 矩阵,可对其进行编程以显示图形、动画、充当界面,甚至玩游戏。

该矩阵及其 API 可以通过几种不同的方式进行编程,每种方式都适合不同的应用。

matrix-closeup.png
首先导入 LED 矩阵库头文件:
#include "Arduino_LED_Matrix.h"

UNO R4 WiFi 的 LED 矩阵库的工作原理是创建一个帧,然后将其加载到显示该帧的缓冲区中。

帧就是我们所说的在任意给定时刻显示在矩阵上的“图像”。如果动画是一系列图像,则帧就是该系列中的其中一个图像。

为了控制 UNO R4 WiFi 上的 12x8 LED 矩阵,您需要至少 96 位大小的内存空间。该库提供了两种方法来做到这一点。

 

我们接下来的代码将使用官方提供的LED 矩阵工具来创建:

单击此处转到 LED 矩阵工具

led-matrix-tool.png
在矩阵页面,我们绘制出“K”的字母,然后点击箭头指出位置下载代码。
Snipaste_2024-09-16_11-38-00.png
按照上述步骤,我们让led矩阵分别"DigKey”的两个首字母“D”和“K”,间隔时间500ms。
// 引入Arduino_LED_Matrix库,用于控制LED矩阵
#include "Arduino_LED_Matrix.h"

// 创建一个ArduinoLEDMatrix对象,用于操作LED矩阵
ArduinoLEDMatrix matrix;

void setup() {
  // 初始化串口通信,波特率为115200
  Serial.begin(115200);
  // 初始化LED矩阵
  matrix.begin();
}

// 定义一个常量数组D,用于存储字母"D"的LED矩阵数据
const uint32_t D[] = {
  0x1e011010,
  0x81081081,
  0x81101e0,
};

// 定义一个常量数组K,用于存储字母"K"的LED矩阵数据
const uint32_t K[] = {
  0x10813014,
  0x1801401,
  0x30108108,
};

void loop(){
  // 将字母"D"的LED矩阵数据加载到matrix对象中,并显示在LED矩阵上
  matrix.loadFrame(D);
  // 延时500毫秒,让字母"D"显示一段时间
  delay(500);

  // 将字母"K"的LED矩阵数据加载到matrix对象中,并显示在LED矩阵上
  matrix.loadFrame(K);
  // 延时500毫秒,让字母"K"显示一段时间
  delay(500);
}

代码烧录后视频效果展示:

WeChat_20240916150444

滚动文本:

// 引入Arduino图形库和LED矩阵库
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"

// 创建一个ArduinoLEDMatrix对象,用于控制LED矩阵
ArduinoLEDMatrix matrix;

void setup() {
  // 初始化LED矩阵
  matrix.begin();
}

void loop() {
  // 开始绘制图形
  matrix.beginDraw();

  // 设置画笔颜色为白色(0xFFFFFFFF表示ARGB格式的白色)
  matrix.stroke(0xFFFFFFFF);
  // 设置文本滚动速度为100毫秒
  matrix.textScrollSpeed(100);

  // 定义要显示的文本内容
  const char text[] = "  EEWorld!  ";
  // 设置文本字体为5x7点阵字体
  matrix.textFont(Font_5x7);
  // 设置文本起始位置和颜色(0, 1表示从第二行开始,0xFFFFFF表示白色)
  matrix.beginText(0, 1, 0xFFFFFF);
  // 在LED矩阵上打印文本
  matrix.println(text);
  // 设置文本滚动方向为向左滚动
  matrix.endText(SCROLL_LEFT);

  // 结束绘制图形
  matrix.endDraw();
}

代码烧录后视频效果展示:

WeChat_20240922155349

 


DAC正弦波:

Arduino UNO R4 WiFi 具有内置DAC (数模转换器),用于将数字信号转换为模拟信号。此功能可用于构建大量有趣的音频项目,但也可用作专业实验室设备,例如廉价的函数发生器。

接线方式:
 

Snipaste_2024-10-15_21-37-48.jpg
#include "analogWave.h" // 引入模拟波形生成库

analogWave wave(DAC);  // 创建一个analogWave类的实例,使用DAC引脚

int freq = 10;  // 频率,单位为赫兹,可根据需要更改

void setup() {
  Serial.begin(115200);  // 初始化串行通信,波特率为115200
  wave.sine(freq);  // 生成初始频率的正弦波
}

void loop() {
  // 从A5引脚读取模拟值,并将其映射到频率范围
  freq = map(analogRead(A5), 0, 1024, 0, 10000);

  // 将更新后的频率打印到串行监视器
  Serial.println("当前频率为 " + adcValue + " 赫兹");

  wave.freq(freq);  // 将波形发生器的频率设置为更新后的值
  delay(1000);  // 延迟一秒钟后重复
}

用OPAMP放大DAC信号;用ADC采集并且打印数据到串口:

#include "analogWave.h" // 包含用于模拟波形生成的库
#include <OPAMP.h> // 包含OPAMP库

analogWave wave(DAC); // 创建一个analogWave类的实例,使用DAC引脚

int freq = 10; // 频率,单位为赫兹,可根据需要更改
unsigned long previousMillis = 0; // 存储上一次读取ADC值的时间
const unsigned long interval = 10; // 读取ADC值的时间间隔,单位为毫秒

void setup() {
  Serial.begin(921600); // 初始化串行通信,波特率为921600
  wave.sine(freq); // 生成初始频率的正弦波

  OPAMP.begin(OPAMP_SPEED_LOWSPEED); // 初始化OPAMP为低速模式

  analogReadResolution(12); // 将模拟读取分辨率更改为12位
}

void loop() {
  unsigned long currentMillis = millis(); // 获取当前时间

  // 每隔interval毫秒读取一次ADC值
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis; // 更新上一次读取的时间

    int adcValue = analogRead(A5); // 返回0-4095之间的值
    Serial.println(adcValue); // 将ADC值打印到串行监视器
  }

}

串口波形显示:
 

Snipaste_2024-10-15_21-38-36.jpg


 

本帖最后由 sinc_sila 于 2024-10-15 21:39 编辑

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复