截图:
链接:
https://wokwi.com/projects/426373008389511169
代码:
// 使用 Parola 库在显示屏上滚动文本
//
// 演示了如何通过串口接收文本并使用滚动功能显示
//
// 用户可以在串口监视器中输入文本,该文本将以滚动消息的形式显示在屏幕上。
// 滚动速度由连接到 SPEED_IN 引脚的电位器控制。
// 滚动方向由连接到 DIRECTION_SET 引脚的开关控制。
// 反转 ON/OFF 状态由连接到 INVERT_SET 引脚的开关控制。
//
// UISwitch 库可以在 https://github.com/MajicDesigns/MD_UISwitch 找到
// MD_MAX72XX 库可以在 https://github.com/MajicDesigns/MD_MAX72XX 找到
#include <MD_Parola.h> // 引入 MD_Parola 库,用于处理滚动显示
#include <MD_MAX72xx.h> // 引入 MD_MAX72xx 库,用于驱动 LED 矩阵
#include <SPI.h> // 引入 SPI 库,用于硬件 SPI 通信
// 如果为 1,则启用用户界面控件(电位器、开关等)
#define USE_UI_CONTROL 0
#if USE_UI_CONTROL
#include <MD_UISwitch.h> // 如果启用 UI 控制,则引入 UISwitch 库
#endif
// 启用调试信息输出到串口
#define DEBUG 0
#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); } // 打印调试信息
#define PRINTS(x) Serial.print(F(x)) // 打印字符串调试信息
#define PRINTX(x) Serial.println(x, HEX) // 打印十六进制调试信息
#else
#define PRINT(s, x) // 如果未启用调试,则不打印任何内容
#define PRINTS(x)
#define PRINTX(x)
#endif
// 定义设备链中的设备数量和硬件接口类型
// 注意:以下引脚编号可能不适用于您的硬件,需要根据实际情况调整
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW // 使用 Parola 硬件类型
#define MAX_DEVICES 11 // 定义设备链中的最大设备数量
#define CLK_PIN 52 // 定义时钟引脚
#define DATA_PIN 51 // 定义数据引脚
#define CS_PIN 10 // 定义片选引脚
// 硬件 SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); // 初始化 Parola 对象
// 软件 SPI(如果需要,可以启用以下代码)
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
// 滚动参数
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5; // 速度控制电位器连接的模拟引脚
const uint8_t DIRECTION_SET = 8; // 滚动方向控制开关连接的数字引脚
const uint8_t INVERT_SET = 9; // 反转控制开关连接的数字引脚
const uint8_t SPEED_DEADBAND = 5; // 速度控制的死区范围
#endif // USE_UI_CONTROL
uint8_t scrollSpeed = 25; // 默认帧延迟值(速度)
textEffect_t scrollEffect = PA_SCROLL_LEFT; // 默认滚动效果为向左滚动
textPosition_t scrollAlign = PA_LEFT; // 默认文本对齐方式为左对齐
uint16_t scrollPause = 2000; // 滚动暂停时间(毫秒)
// 全局消息缓冲区,用于串口和滚动功能共享
#define BUF_SIZE 75
char curMessage[BUF_SIZE] = { "" }; // 当前显示的消息
char newMessage[BUF_SIZE] = { "CSLG1609,Best!" }; // 默认新消息
bool newMessageAvailable = true; // 标志是否有新消息可用
#if USE_UI_CONTROL
MD_UISwitch_Digital uiDirection(DIRECTION_SET); // 初始化方向控制开关
MD_UISwitch_Digital uiInvert(INVERT_SET); // 初始化反转控制开关
// 用户界面处理函数
void doUI(void)
{
// 如果速度发生变化,则设置新速度
{
int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150); // 读取电位器值并映射到速度范围
if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
(speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
{
P.setSpeed(speed); // 设置新速度
scrollSpeed = speed; // 更新全局速度变量
PRINT("\nChanged speed to ", P.getSpeed()); // 打印调试信息
}
}
// 如果方向开关被按下,则切换滚动方向
if (uiDirection.read() == MD_UISwitch::KEY_PRESS)
{
PRINTS("\nChanging scroll direction");
scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT); // 切换滚动方向
P.setTextEffect(scrollEffect, scrollEffect); // 设置新的滚动效果
P.displayClear(); // 清除显示
P.displayReset(); // 重置显示
}
// 如果反转开关被按下,则切换反转模式
if (uiInvert.read() == MD_UISwitch::KEY_PRESS)
{
PRINTS("\nChanging invert mode");
P.setInvert(!P.getInvert()); // 切换反转模式
}
}
#endif // USE_UI_CONTROL
// 从串口读取新消息
void readSerial(void)
{
static char *cp = newMessage; // 指向新消息缓冲区的指针
while (Serial.available()) // 如果串口有数据可用
{
*cp = (char)Serial.read(); // 读取一个字符
if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE - 2)) // 如果遇到换行符或缓冲区已满
{
*cp = '\0'; // 结束字符串
cp = newMessage; // 重置指针
newMessageAvailable = true; // 标志有新消息可用
}
else // 否则移动指针到下一个位置
cp++;
}
}
// 初始化设置
void setup()
{
Serial.begin(57600); // 初始化串口通信,波特率为 57600
Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");
#if USE_UI_CONTROL
uiDirection.begin(); // 初始化方向控制开关
uiInvert.begin(); // 初始化反转控制开关
pinMode(SPEED_IN, INPUT); // 设置速度控制引脚为输入模式
doUI(); // 执行用户界面初始化
#endif // USE_UI_CONTROL
P.begin(); // 初始化 Parola 对象
P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect); // 显示初始消息
}
// 主循环
void loop()
{
#if USE_UI_CONTROL
doUI(); // 处理用户界面输入
#endif // USE_UI_CONTROL
if (P.displayAnimate()) // 如果显示动画需要更新
{
if (newMessageAvailable) // 如果有新消息可用
{
strcpy(curMessage, newMessage); // 将新消息复制到当前消息缓冲区
newMessageAvailable = false; // 清除新消息标志
}
P.displayReset(); // 重置显示
}
readSerial(); // 从串口读取新消息
}
实验报告:基于Wokwi Arduino Mega 2560 的LED矩阵滚动文本显示实验
实验名称
基于Arduino Mega 2560和MAX7219驱动芯片的LED矩阵滚动文本显示实验
实验目的
- 学习使用MD_Parola和MD_MAX72XX库控制LED矩阵显示文本。
- 掌握通过串口通信接收并显示滚动文本的方法。
- 理解如何使用电位器和开关控制滚动速度、方向和显示模式。
- 熟悉Wokwi仿真平台在复杂硬件仿真中的应用。
实验器材
- Wokwi在线仿真平台。
- Arduino Mega 2560开发板(仿真)。
- MAX7219驱动的LED矩阵模块(仿真,建议8x8矩阵,11个级联)。
- 电位器(仿真,用于控制滚动速度)。
- 开关(仿真,用于控制滚动方向和反转模式)。
- 若干连接线(仿真)。
实验原理
-
MD_Parola库:
用于处理LED矩阵的滚动文本显示,支持多种滚动效果和速度控制。 -
MD_MAX72XX库:
用于驱动MAX7219芯片,控制LED矩阵的硬件接口。 -
串口通信:
通过串口监视器发送文本消息,Arduino接收并显示在LED矩阵上。 -
用户界面控制:
使用电位器调整滚动速度,开关控制滚动方向和显示反转模式。
实验电路连接
- LED矩阵模块:
CLK_PIN
(52)连接到LED矩阵的时钟引脚。DATA_PIN
(51)连接到LED矩阵的数据引脚。CS_PIN
(10)连接到LED矩阵的片选引脚。VCC
和GND
连接到电源和地。
- 电位器:
- 中间引脚连接到
SPEED_IN
(A5)。 - 两侧引脚分别连接到
5V
和GND
。
- 中间引脚连接到
- 开关:
- 一个开关连接到
DIRECTION_SET
(8),用于控制滚动方向。 - 另一个开关连接到
INVERT_SET
(9),用于控制显示反转模式。
- 一个开关连接到
实验代码分析
cpp复制代码
#include <MD_Parola.h> | |
#include <MD_MAX72xx.h> | |
#include <SPI.h> | |
#define USE_UI_CONTROL 0 // 启用或禁用用户界面控件 | |
#define DEBUG 0 // 启用或禁用调试信息输出 | |
// 调试信息输出宏定义 | |
#if DEBUG | |
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); } | |
#define PRINTS(x) Serial.print(F(x)) | |
#define PRINTX(x) Serial.println(x, HEX) | |
#else | |
#define PRINT(s, x) | |
#define PRINTS(x) | |
#define PRINTX(x) | |
#endif | |
// 硬件定义 | |
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW | |
#define MAX_DEVICES 11 | |
#define CLK_PIN 52 | |
#define DATA_PIN 51 | |
#define CS_PIN 10 | |
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES); | |
// 滚动参数 | |
uint8_t scrollSpeed = 25; | |
textEffect_t scrollEffect = PA_SCROLL_LEFT; | |
textPosition_t scrollAlign = PA_LEFT; | |
uint16_t scrollPause = 2000; | |
// 消息缓冲区 | |
#define BUF_SIZE 75 | |
char curMessage[BUF_SIZE] = { "" }; | |
char newMessage[BUF_SIZE] = { "CSLG1609,Best!" }; | |
bool newMessageAvailable = true; | |
#if USE_UI_CONTROL | |
// 用户界面控件定义和处理函数(略) | |
#endif | |
// 从串口读取新消息 | |
void readSerial(void) { | |
static char *cp = newMessage; | |
while (Serial.available()) { | |
*cp = (char)Serial.read(); | |
if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE - 2)) { | |
*cp = '\0'; | |
cp = newMessage; | |
newMessageAvailable = true; | |
} else { | |
cp++; | |
} | |
} | |
} | |
// 初始化设置 | |
void setup() { | |
Serial.begin(57600); | |
Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline"); | |
#if USE_UI_CONTROL | |
// 初始化用户界面控件(略) | |
#endif | |
P.begin(); | |
P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect); | |
} | |
// 主循环 | |
void loop() { | |
#if USE_UI_CONTROL | |
doUI(); | |
#endif | |
if (P.displayAnimate()) { | |
if (newMessageAvailable) { | |
strcpy(curMessage, newMessage); | |
newMessageAvailable = false; | |
} | |
P.displayReset(); | |
} | |
readSerial(); | |
} |
实验步骤
-
搭建电路:
在Wokwi平台中,按照上述电路连接图连接LED矩阵模块、电位器和开关。 -
编写代码:
将上述代码复制到Wokwi的代码编辑器中。 -
运行仿真:
点击“Start Simulation”按钮,观察LED矩阵的显示情况。 -
发送消息:
打开串口监视器,输入文本消息并以换行符结束,观察LED矩阵显示滚动文本。 -
调整参数(如果
USE_UI_CONTROL
设置为1):- 旋转电位器调整滚动速度。
- 切换开关改变滚动方向和显示反转模式。
实验结果
- 现象描述:
- LED矩阵显示默认消息“CSLG1609,Best!”。
- 通过串口发送新消息后,LED矩阵滚动显示新消息。
- (如果启用UI控制)旋转电位器可调整滚动速度,切换开关可改变滚动方向和显示反转模式。
- 结果分析:
- MD_Parola库成功实现了滚动文本显示功能。
- 串口通信正常,能够接收并显示用户输入的消息。
- 用户界面控件(如启用)能够实时调整显示参数。
实验问题与改进
- 问题:
- 滚动速度范围可能不适合所有应用场景。
- 默认消息在每次复位后重新显示,可能不符合用户需求。
- 改进建议:
- 增加速度范围的自定义设置。
- 添加命令以清除当前消息或保存用户设置。
- 优化串口通信协议,支持更多控制命令。
改进后的代码示例(部分)
cpp复制代码
// 在setup()中添加命令提示 | |
Serial.println("Commands:"); | |
Serial.println("/clear - Clear the current message"); | |
Serial.println("/speed <value> - Set scroll speed (10-150)"); | |
// 在readSerial()中添加命令处理 | |
if (strncmp(newMessage, "/clear", 6) == 0) { | |
strcpy(curMessage, ""); | |
newMessageAvailable = true; // 触发显示更新 | |
} else if (strncmp(newMessage, "/speed ", 7) == 0) { | |
int newSpeed = atoi(newMessage + 7); | |
if (newSpeed >= 10 && newSpeed <= 150) { | |
scrollSpeed = newSpeed; | |
P.setSpeed(scrollSpeed); | |
} | |
} |
实验总结
- 通过本实验,掌握了使用MD_Parola和MD_MAX72XX库控制LED矩阵显示滚动文本的方法。
- 实现了串口通信接收用户输入消息的功能。
- 了解了如何通过电位器和开关实现用户界面控制。
- 改进后的代码增加了命令处理功能,提升了实验的实用性和趣味性。
附录
-
Wokwi仿真链接:
(此处可附上实验仿真链接,若需分享) -
参考文献:
- Arduino官方文档
- MD_Parola库文档:GitHub - MajicDesigns/MD_Parola: Library for modular scrolling LED matrix text displays
- MD_MAX72XX库文档:GitHub - MajicDesigns/MD_MAX72XX: LED Matrix Library
- Wokwi在线仿真平台教程
实验报告撰写人:XXX
日期:XXXX年XX月XX日
Wokwi Arduino Mega 2560 编程基础等详细课程内容
一、课程简介
本课程旨在通过 Wokwi 在线仿真平台,学习 Arduino Mega 2560 的编程基础,包括硬件接口、基本编程结构、输入输出控制、传感器应用等。通过实例和项目实践,帮助学员掌握 Arduino Mega 2560 的开发技能。
二、课程大纲
1. Arduino Mega 2560 硬件介绍
- 核心芯片:ATmega2560
- IO 端口:
- 54 个数字 I/O 引脚(其中 15 个支持 PWM 输出)
- 16 个模拟输入引脚
- 4 个硬件串行端口
- 其他接口:USB 接口、ICSP 接口、电源插孔、复位按钮
- 电源管理:支持 USB 供电和外部电源供电
2. Wokwi 平台使用指南
- 平台注册与登录
- 创建新项目:选择 Arduino Mega 2560 型号
- 代码编辑器:基本功能介绍
- 仿真运行:观察程序执行效果
- 调试工具:串口监视器、逻辑分析仪等
3. Arduino 编程基础
- 开发环境:Arduino IDE 简介
- 编程语言:C/C++ 基础语法
- 程序结构:
setup()
函数:初始化设置loop()
函数:主循环
- 变量与数据类型:
int
、float
、boolean
等 - 运算符与表达式:算术运算、逻辑运算、比较运算
4. 数字输入输出控制
- 数字输出:
pinMode()
函数:设置引脚模式digitalWrite()
函数:输出高电平或低电平
- 数字输入:
digitalRead()
函数:读取引脚状态
- 实例:LED 闪烁、按钮控制 LED
5. 模拟输入输出控制
- 模拟输入:
analogRead()
函数:读取模拟信号值
- 模拟输出(PWM):
analogWrite()
函数:输出 PWM 信号
- 实例:电位器调光、电机调速
6. 串行通信
- 串口通信基础:波特率、数据位、停止位、校验位
- 串口函数:
Serial.begin()
:初始化串口Serial.print()
/Serial.println()
:发送数据Serial.read()
/Serial.available()
:接收数据
- 实例:串口打印调试信息、与计算机通信
7. 传感器应用
- 常见传感器介绍:
- 温度传感器(如 LM35)
- 光敏电阻
- 超声波传感器
- 传感器接口电路:模拟输入、数字输入
- 实例:温度监测、光照强度检测、距离测量
8. 定时器与中断
- 定时器基础:计时功能、PWM 生成
- 中断机制:外部中断、定时器中断
- 实例:定时器控制 LED 闪烁、中断触发事件处理
9. 高级功能与应用
- I2C 通信:主从设备通信协议
- SPI 通信:高速同步串行通信
- EEPROM 存储:数据持久化存储
- 实例:LCD 显示屏控制、SD 卡读写
10. 项目实践
- 项目一:智能家居控制系统(灯光、窗帘控制)
- 项目二:环境监测系统(温度、湿度、光照监测)
- 项目三:机器人小车控制(电机驱动、避障)
三、教学方法
- 理论讲解:结合 PPT 和实例代码,讲解知识点
- 实践操作:在 Wokwi 平台上编写和调试代码
- 互动讨论:解答学员疑问,分享学习经验
- 项目驱动:通过实际项目,巩固所学知识
四、学习建议
- 预习复习:课前预习课程内容,课后复习所学知识
- 动手实践:多编写代码,多调试程序
- 参与讨论:积极参与课堂讨论,与同学交流学习心得
- 拓展学习:阅读相关书籍和文档,了解更多高级功能
五、学习资源
- 官方文档:Arduino 官方网站
- 在线教程:Wokwi 平台教程、Arduino 中文社区教程
- 书籍推荐:《Arduino 编程从入门到实践》、《Arduino 项目大全》