wokwi arduino mega 2560 - 点亮LED案例
截图:

代码:
unsigned long t[20]; // 定义一个数组t,用于存储20个LED的上次状态切换时间(单位:毫秒)void setup() {pinMode(13, OUTPUT); // 将引脚13设置为输出模式(此行代码在本实验中未实际使用,可忽略)for(int ledid = 0; ledid < 20; ledid++) // 循环遍历0到19的引脚,初始化每个LED的控制引脚{pinMode(ledid, OUTPUT); // 将当前引脚(ledid)设置为输出模式t[ledid] = millis(); // 将当前时间(毫秒)记录到数组t中,对应当前LED的上次切换时间}
}void ledblink(int ledid, int ledhz) // 定义函数ledblink,用于控制指定LED的闪烁
{if (millis() - t[ledid] >= ledhz) { // 如果当前时间与上次切换时间的差值大于等于闪烁周期(ledhz)digitalWrite(ledid, !digitalRead(ledid)); // 切换当前LED的状态(亮变灭,灭变亮)t[ledid] = millis(); // 更新当前LED的上次切换时间为当前时间}
}void loop() {for(int ledid = 0; ledid < 20; ledid++) // 循环遍历0到19的引脚,逐个控制LED{ledblink(ledid, random(ledid, 2000 * ledid)); // 调用ledblink函数,为当前LED生成一个随机闪烁周期并控制其闪烁// random(ledid, 2000*ledid) 生成一个范围在 [ledid, 2000*ledid) 的随机整数作为闪烁周期}
}
以下是逐行添加中文注释的代码:
cpp复制代码
unsigned long t[20]; // 定义一个数组t,用于存储20个LED的上次状态切换时间(单位:毫秒) | |
void setup() { | |
pinMode(13, OUTPUT); // 将引脚13设置为输出模式(此行代码在本实验中未实际使用,可忽略) | |
for(int ledid = 0; ledid < 20; ledid++) // 循环遍历0到19的引脚,初始化每个LED的控制引脚 | |
{ | |
pinMode(ledid, OUTPUT); // 将当前引脚(ledid)设置为输出模式 | |
t[ledid] = millis(); // 将当前时间(毫秒)记录到数组t中,对应当前LED的上次切换时间 | |
} | |
} | |
void ledblink(int ledid, int ledhz) // 定义函数ledblink,用于控制指定LED的闪烁 | |
{ | |
if (millis() - t[ledid] >= ledhz) { // 如果当前时间与上次切换时间的差值大于等于闪烁周期(ledhz) | |
digitalWrite(ledid, !digitalRead(ledid)); // 切换当前LED的状态(亮变灭,灭变亮) | |
t[ledid] = millis(); // 更新当前LED的上次切换时间为当前时间 | |
} | |
} | |
void loop() { | |
for(int ledid = 0; ledid < 20; ledid++) // 循环遍历0到19的引脚,逐个控制LED | |
{ | |
ledblink(ledid, random(ledid, 2000 * ledid)); // 调用ledblink函数,为当前LED生成一个随机闪烁周期并控制其闪烁 | |
// random(ledid, 2000*ledid) 生成一个范围在 [ledid, 2000*ledid) 的随机整数作为闪烁周期 | |
} | |
} |
代码逻辑说明:
-
数组
t[20]
:
用于记录每个LED的上次状态切换时间,确保每个LED的闪烁是独立的。 -
setup()
函数:
初始化每个LED的控制引脚为输出模式,并记录当前时间作为初始切换时间。 -
ledblink()
函数:
根据当前时间与上次切换时间的差值,决定是否切换LED的状态。如果差值大于等于闪烁周期,则切换状态并更新上次切换时间。 -
loop()
函数:
循环遍历每个LED,调用ledblink()
函数,并为每个LED生成一个随机闪烁周期。随机数范围随ledid
增大而增大,导致高编号LED的闪烁频率较低。
注意事项:
-
随机数范围:
random(ledid, 2000*ledid)
生成的随机数范围较大,高编号LED的闪烁频率可能过低,肉眼难以察觉闪烁。可根据需要调整随机数范围。 -
引脚13:
pinMode(13, OUTPUT);
在本实验中未实际使用,可删除或保留作为备用。 -
非阻塞式控制:
使用millis()
函数实现非阻塞式控制,确保所有LED的状态切换独立且实时。
项目仿真网址:
https://wokwi.com/projects/415863028802020353
实验报告:基于Wokwi Arduino Mega 2560 的多LED随机闪烁实验
实验名称
基于Arduino Mega 2560的多LED随机闪烁实验
实验目的
- 学习使用Arduino Mega 2560控制多个LED。
- 掌握
millis()
函数实现非阻塞式LED闪烁。 - 理解随机数生成在LED闪烁频率控制中的应用。
- 熟悉Wokwi仿真平台的使用。
实验器材
- Wokwi在线仿真平台。
- Arduino Mega 2560开发板(仿真)。
- 20个LED(仿真)。
- 20个电阻(220Ω,仿真)。
- 面包板和若干连接线(仿真)。
实验原理
-
非阻塞式编程:
使用millis()
函数记录时间,通过比较当前时间与上次LED状态切换时间的差值,决定是否切换LED状态。这种方式避免了使用delay()
函数导致的程序阻塞。 -
随机数生成:
使用random(min, max)
函数生成一个范围在[min, max)
的随机整数,用于控制每个LED的闪烁频率。 -
多LED控制:
通过数组t[20]
记录每个LED的上次状态切换时间,结合循环实现对20个LED的独立控制。
实验电路连接
- 将Arduino Mega 2560的引脚0~19分别连接到20个LED的负极(通过电阻接地)。
- LED的正极连接到5V电源。
- 仿真中可直接在Wokwi平台拖拽元件完成连接。
实验代码分析
cpp复制代码
unsigned long t[20]; // 用于存储每个LED的上次状态切换时间 | |
void setup() { | |
pinMode(13, OUTPUT); // 示例代码中的冗余设置(未使用引脚13) | |
for (int ledid = 0; ledid < 20; ledid++) { | |
pinMode(ledid, OUTPUT); // 将引脚0~19设置为输出模式 | |
t[ledid] = millis(); // 初始化每个LED的上次切换时间为当前时间 | |
} | |
} | |
void ledblink(int ledid, int ledhz) { | |
// 如果当前时间与上次切换时间的差值大于等于闪烁周期,则切换LED状态 | |
if (millis() - t[ledid] >= ledhz) { | |
digitalWrite(ledid, !digitalRead(ledid)); // 切换LED状态 | |
t[ledid] = millis(); // 更新上次切换时间 | |
} | |
} | |
void loop() { | |
for (int ledid = 0; ledid < 20; ledid++) { | |
// 为每个LED生成一个随机闪烁周期,并调用ledblink函数 | |
ledblink(ledid, random(ledid, 2000 * ledid)); | |
} | |
} |
实验步骤
-
搭建电路:
在Wokwi平台中,将Arduino Mega 2560的引脚0~19分别连接20个LED(通过电阻接地)。 -
编写代码:
将上述代码复制到Wokwi的代码编辑器中。 -
运行仿真:
点击“Start Simulation”按钮,观察LED的闪烁情况。 -
记录现象:
观察每个LED的闪烁频率是否随机,且是否独立工作。
实验结果
- 现象描述:
- 20个LED以不同的频率随机闪烁。
- 每个LED的闪烁频率在程序运行期间动态变化。
- 所有LED独立工作,互不干扰。
- 结果分析:
random(ledid, 2000 * ledid)
生成的随机数范围随ledid
增大而增大,导致高编号LED的闪烁频率较低。millis()
函数实现了非阻塞式控制,确保所有LED的状态切换独立且实时。
实验问题与改进
- 问题:
- 高编号LED的闪烁频率过低,可能导致肉眼难以察觉闪烁。
- 随机数生成范围过大,导致闪烁频率差异显著。
- 改进建议:
- 调整随机数范围,例如
random(100, 500)
,使所有LED的闪烁频率更接近。 - 增加一个全局变量控制闪烁频率范围,便于动态调整。
- 调整随机数范围,例如
改进后的代码示例
cpp复制代码
unsigned long t[20]; | |
int minHz = 100; // 最小闪烁周期(毫秒) | |
int maxHz = 500; // 最大闪烁周期(毫秒) | |
void setup() { | |
for (int ledid = 0; ledid < 20; ledid++) { | |
pinMode(ledid, OUTPUT); | |
t[ledid] = millis(); | |
} | |
} | |
void ledblink(int ledid, int ledhz) { | |
if (millis() - t[ledid] >= ledhz) { | |
digitalWrite(ledid, !digitalRead(ledid)); | |
t[ledid] = millis(); | |
} | |
} | |
void loop() { | |
for (int ledid = 0; ledid < 20; ledid++) { | |
ledblink(ledid, random(minHz, maxHz)); | |
} | |
} |
实验总结
- 通过本实验,掌握了使用
millis()
函数实现非阻塞式LED控制的方法。 - 理解了随机数生成在动态控制中的应用。
- 学会了在Wokwi平台中搭建多LED电路并调试代码。
- 改进后的代码实现了更均匀的闪烁频率,提升了实验效果。
附录
-
Wokwi仿真链接:
(此处可附上实验仿真链接,若需分享) -
参考文献:
- Arduino官方文档
- Wokwi在线仿真平台教程
实验报告撰写人:XXX
日期:XXXX年XX月XX日
课程要点:
在 Wokwi 平台上使用 Arduino Mega 2560 进行 IO 口简单应用的学习,可以涵盖硬件基础、编程入门以及实际应用等多个方面。以下是详细的课程内容概述:
一、Arduino Mega 2560 硬件基础
-
核心特性
- 微控制器:基于 ATmega2560 芯片,具有 256KB 的 Flash 程序内存、8KB 的 SRAM 和 4KB 的 EEPROM。
- IO 端口:提供 54 个数字 I/O 引脚(其中 15 个支持 PWM 输出)、16 个模拟输入引脚。
- 通信接口:4 个硬件串行端口、1 个 USB 接口、1 个 ICSP 接口,支持 SPI、I2C 等通信协议。
- 电源管理:可通过 USB、外部直流电源或电池供电,自动选择供电方式。
-
引脚布局与功能
- 数字 I/O 引脚:如引脚 0-13 可用于数字输入/输出和串行通信,引脚 2-13、44-46 支持 PWM 输出。
- 模拟输入引脚:如 A0-A15 可用于模拟信号输入,部分引脚也可用作数字 I/O。
- 特殊功能引脚:如 AREF(模拟参考电压)、Reset(复位按钮)、GND(地线)、VIN(外部电源输入)等。
二、Wokwi 平台使用入门
-
平台简介
- Wokwi 是一个在线的 Arduino 模拟器,支持多种 Arduino 型号,包括 Mega 2560。
- 无需硬件即可进行 Arduino 编程和仿真,适合初学者快速上手。
-
基本操作
- 创建项目:在 Wokwi 平台上选择 Arduino Mega 2560 型号,创建新的项目。
- 编写代码:使用内置的代码编辑器编写 Arduino 代码。
- 仿真运行:点击“运行”按钮,观察仿真结果。
三、IO 口简单应用编程
-
数字 I/O 控制
- LED 闪烁:通过控制数字 I/O 引脚的电平高低,实现 LED 的闪烁。
- 按钮控制:读取数字 I/O 引脚的状态,实现按钮控制 LED 的亮灭。
-
模拟输入读取
- 电位器调光:通过读取模拟输入引脚的值,控制 LED 的亮度。
- 传感器数据读取:如使用光敏电阻、温度传感器等模拟传感器,读取环境数据。
-
PWM 输出控制
- 电机调速:通过 PWM 输出控制电机的转速。
- LED 调光:通过 PWM 输出实现 LED 的亮度调节。
-
串行通信
- 串口打印:通过串行端口向计算机发送数据,实现调试信息的输出。
- 串口通信协议:如使用串口与其他设备进行数据交换。
四、实际应用案例
-
智能家居控制
- 使用 Arduino Mega 2560 控制灯光、窗帘、空调等家居设备。
- 通过串行通信或无线通信模块与手机 APP 进行交互。
-
环境监测系统
- 使用各种传感器监测环境温度、湿度、光照等参数。
- 通过串行通信将数据上传到计算机或云服务器进行分析和处理。
-
机器人控制
- 使用 Arduino Mega 2560 控制机器人的电机、舵机等执行机构。
- 通过传感器获取环境信息,实现机器人的自主导航和避障。
五、课程总结与展望
-
课程总结
- 回顾 Arduino Mega 2560 的硬件基础和 Wokwi 平台的使用方法。
- 总结 IO 口简单应用编程的关键点和注意事项。
-
未来展望
- 介绍 Arduino Mega 2560 在更复杂项目中的应用前景。
- 鼓励学生继续深入学习 Arduino 编程和电子技术。