sinc_sila 发表于 2024-9-16 15:12

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

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

<p><strong><span style="color:#e74c3c;"><span style="font-size:20px;">LED矩阵:</span></span></strong></p>

<p><span style="font-size:18px;"><strong data-immersive-translate-walked="ffe07d79-270c-4d45-a75b-eaf086df69fd">Arduino UNO R4 WiFi</strong>配有内置 12x8 LED 矩阵,可对其进行编程以显示图形、动画、充当界面,甚至玩游戏。</span></p>

<p><span style="font-size:18px;">该矩阵及其 API 可以通过几种不同的方式进行编程,每种方式都适合不同的应用。</span></p>

<div style="text-align: left;"></div>

<div style="text-align: left;"><span style="font-size:18px;">首先导入&nbsp;LED 矩阵库头文件:</span></div>

<div style="text-align: left;">
<pre>
<code>#include "Arduino_LED_Matrix.h"</code></pre>

<p><span style="font-size:18px;">UNO R4 WiFi 的 LED 矩阵库的工作原理是创建一个帧,然后将其加载到显示该帧的缓冲区中。</span></p>

<p><span style="font-size:18px;">帧就是我们所说的在任意给定时刻显示在矩阵上的&ldquo;图像&rdquo;。如果动画是一系列图像,则帧就是该系列中的其中一个图像。</span></p>

<p><span style="font-size:18px;">为了控制 UNO R4 WiFi 上的 12x8 LED 矩阵,您需要至少 96 位大小的内存空间。该库提供了两种方法来做到这一点。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:18px;">我们接下来的代码将使用官方提供的LED 矩阵工具来创建:</span></p>
</div>

<p><strong><span style="font-size:18px;"><a data-immersive-translate-walked="083ebd78-9d4d-48b8-974f-52d353faf0de" href="https://ledmatrix-editor.arduino.cc/?_gl=1*7hasv7*_gcl_au*MTExMzMyMDYxNi4xNzI0NDc3OTM5*FPAU*MTExMzMyMDYxNi4xNzI0NDc3OTM5*_ga*MTQzMDc0NzQ3MC4xNzI0NDc3OTM4*_ga_NEXN8H46L5*MTcyNjQ1NjA5Mi4yLjEuMTcyNjQ1NzUyNS4wLjAuODg2NTk2NTg0*_fplc*R0NMeThSb3BDbWt4RXMycWpXRUI5QzEzbU5uYkdtQlpkUFFSRVJrS1pWS3NrWU1lbVhYMm9RU25TU2s4VWtkQlF6VTVwS2pjUkRXZjliSmx6clBpMUY4WDlTVUhybUhlY2JLdk1aZ0RrVW11a2xDU1lqYlptNGhMeVNnUlJRJTNEJTNE"><span style="color:#e67e22;">单击此处</span></a>转到 LED 矩阵工具</span></strong></p>

<div style="text-align: left;"></div>

<div style="text-align: left;"><span style="font-size:18px;">在矩阵页面,我们绘制出&ldquo;K&rdquo;的字母,然后点击箭头指出位置下载代码。</span></div>

<div style="text-align: left;">
<div style="text-align: center;"></div>

<div><span style="font-size:18px;">按照上述步骤,我们让led矩阵分别&quot;DigKey&rdquo;的两个首字母&ldquo;D&rdquo;和&ldquo;K&rdquo;,间隔时间500ms。</span></div>
</div>

<pre>
<code>// 引入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);
}</code></pre>

<p><span style="font-size:18px;"><strong>代码烧录后视频效果展示:</strong></span></p>

<p>97a6d6de627d921fe0078fb27eb311d6<br />
<strong><span style="font-size:18px;">滚动文本:</span></strong></p>

<pre>
<code>// 引入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();
}</code></pre>

<p><strong>代码烧录后视频效果展示:</strong></p>

<p>94fd0a0e40f82d7722a6d5bb31a55a1e<br />
&nbsp;</p>

<hr />
<p><span style="color:#e74c3c;"><span style="font-size:18px;"><strong>DAC正弦波:</strong></span></span></p>

<p><span style="font-size:16px;">Arduino UNO R4 WiFi 具有内置<strong data-immersive-translate-walked="b668ca66-66f8-442f-9efb-13f44bda6898">DAC</strong>&nbsp;(数模转换器),用于将数字信号转换为模拟信号。此功能可用于构建大量有趣的音频项目,但也可用作专业实验室设备,例如廉价的函数发生器。</span></p>

<p><span style="font-size: 16px;">接线方式:</span><br />
&nbsp;</p>

<div style="text-align: left;"></div>

<pre>
<code>#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);// 延迟一秒钟后重复
}</code></pre>

<p><span style="font-size:16px;">用OPAMP放大DAC信号;用ADC采集并且打印数据到串口:</span></p>

<pre>
<code>#include "analogWave.h" // 包含用于模拟波形生成的库
#include &lt;OPAMP.h&gt; // 包含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 &gt;= interval) {
    previousMillis = currentMillis; // 更新上一次读取的时间

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

}</code></pre>

<p>串口波形显示:<br />
&nbsp;</p>

<div style="text-align: left;"></div>

<p><br />
&nbsp;</p>
页: [1]
查看完整版本: 【Follow me第二季第2期】LED矩阵+DAC正弦波+放大信号+ADC采集