wokwi arduino mega 2560 - 点亮LED进阶

截图:

链接:

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矩阵滚动文本显示实验


实验目的
  1. 学习使用MD_Parola和MD_MAX72XX库控制LED矩阵显示文本。
  2. 掌握通过串口通信接收并显示滚动文本的方法。
  3. 理解如何使用电位器和开关控制滚动速度、方向和显示模式。
  4. 熟悉Wokwi仿真平台在复杂硬件仿真中的应用。

实验器材
  1. Wokwi在线仿真平台。
  2. Arduino Mega 2560开发板(仿真)。
  3. MAX7219驱动的LED矩阵模块(仿真,建议8x8矩阵,11个级联)。
  4. 电位器(仿真,用于控制滚动速度)。
  5. 开关(仿真,用于控制滚动方向和反转模式)。
  6. 若干连接线(仿真)。

实验原理
  1. MD_Parola库
    用于处理LED矩阵的滚动文本显示,支持多种滚动效果和速度控制。

  2. MD_MAX72XX库
    用于驱动MAX7219芯片,控制LED矩阵的硬件接口。

  3. 串口通信
    通过串口监视器发送文本消息,Arduino接收并显示在LED矩阵上。

  4. 用户界面控制
    使用电位器调整滚动速度,开关控制滚动方向和显示反转模式。


实验电路连接
  1. LED矩阵模块
    • CLK_PIN(52)连接到LED矩阵的时钟引脚。
    • DATA_PIN(51)连接到LED矩阵的数据引脚。
    • CS_PIN(10)连接到LED矩阵的片选引脚。
    • VCCGND连接到电源和地。
  2. 电位器
    • 中间引脚连接到SPEED_IN(A5)。
    • 两侧引脚分别连接到5VGND
  3. 开关
    • 一个开关连接到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();
}

实验步骤
  1. 搭建电路
    在Wokwi平台中,按照上述电路连接图连接LED矩阵模块、电位器和开关。

  2. 编写代码
    将上述代码复制到Wokwi的代码编辑器中。

  3. 运行仿真
    点击“Start Simulation”按钮,观察LED矩阵的显示情况。

  4. 发送消息
    打开串口监视器,输入文本消息并以换行符结束,观察LED矩阵显示滚动文本。

  5. 调整参数(如果USE_UI_CONTROL设置为1):

    • 旋转电位器调整滚动速度。
    • 切换开关改变滚动方向和显示反转模式。

实验结果
  1. 现象描述
    • LED矩阵显示默认消息“CSLG1609,Best!”。
    • 通过串口发送新消息后,LED矩阵滚动显示新消息。
    • (如果启用UI控制)旋转电位器可调整滚动速度,切换开关可改变滚动方向和显示反转模式。
  2. 结果分析
    • MD_Parola库成功实现了滚动文本显示功能。
    • 串口通信正常,能够接收并显示用户输入的消息。
    • 用户界面控件(如启用)能够实时调整显示参数。

实验问题与改进
  1. 问题
    • 滚动速度范围可能不适合所有应用场景。
    • 默认消息在每次复位后重新显示,可能不符合用户需求。
  2. 改进建议
    • 增加速度范围的自定义设置。
    • 添加命令以清除当前消息或保存用户设置。
    • 优化串口通信协议,支持更多控制命令。

改进后的代码示例(部分)
 

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);
}
}

实验总结
  1. 通过本实验,掌握了使用MD_Parola和MD_MAX72XX库控制LED矩阵显示滚动文本的方法。
  2. 实现了串口通信接收用户输入消息的功能。
  3. 了解了如何通过电位器和开关实现用户界面控制。
  4. 改进后的代码增加了命令处理功能,提升了实验的实用性和趣味性。

附录
  1. Wokwi仿真链接
    (此处可附上实验仿真链接,若需分享)

  2. 参考文献


实验报告撰写人: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() 函数:主循环
  • 变量与数据类型intfloatboolean 等
  • 运算符与表达式:算术运算、逻辑运算、比较运算
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 项目大全》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangrelay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值