当前位置: 首页 > news >正文

wokwi arduino mega 2560 - 点亮LED案例

截图: 

点亮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) 的随机整数作为闪烁周期
}
}

代码逻辑说明:

  1. 数组t[20]
    用于记录每个LED的上次状态切换时间,确保每个LED的闪烁是独立的。

  2. setup()函数
    初始化每个LED的控制引脚为输出模式,并记录当前时间作为初始切换时间。

  3. ledblink()函数
    根据当前时间与上次切换时间的差值,决定是否切换LED的状态。如果差值大于等于闪烁周期,则切换状态并更新上次切换时间。

  4. 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随机闪烁实验


实验目的
  1. 学习使用Arduino Mega 2560控制多个LED。
  2. 掌握millis()函数实现非阻塞式LED闪烁。
  3. 理解随机数生成在LED闪烁频率控制中的应用。
  4. 熟悉Wokwi仿真平台的使用。

实验器材
  1. Wokwi在线仿真平台。
  2. Arduino Mega 2560开发板(仿真)。
  3. 20个LED(仿真)。
  4. 20个电阻(220Ω,仿真)。
  5. 面包板和若干连接线(仿真)。

实验原理
  1. 非阻塞式编程
    使用millis()函数记录时间,通过比较当前时间与上次LED状态切换时间的差值,决定是否切换LED状态。这种方式避免了使用delay()函数导致的程序阻塞。

  2. 随机数生成
    使用random(min, max)函数生成一个范围在[min, max)的随机整数,用于控制每个LED的闪烁频率。

  3. 多LED控制
    通过数组t[20]记录每个LED的上次状态切换时间,结合循环实现对20个LED的独立控制。


实验电路连接
  1. 将Arduino Mega 2560的引脚0~19分别连接到20个LED的负极(通过电阻接地)。
  2. LED的正极连接到5V电源。
  3. 仿真中可直接在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));
}
}

实验步骤
  1. 搭建电路
    在Wokwi平台中,将Arduino Mega 2560的引脚0~19分别连接20个LED(通过电阻接地)。

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

  3. 运行仿真
    点击“Start Simulation”按钮,观察LED的闪烁情况。

  4. 记录现象
    观察每个LED的闪烁频率是否随机,且是否独立工作。


实验结果
  1. 现象描述
    • 20个LED以不同的频率随机闪烁。
    • 每个LED的闪烁频率在程序运行期间动态变化。
    • 所有LED独立工作,互不干扰。
  2. 结果分析
    • random(ledid, 2000 * ledid)生成的随机数范围随ledid增大而增大,导致高编号LED的闪烁频率较低。
    • millis()函数实现了非阻塞式控制,确保所有LED的状态切换独立且实时。

实验问题与改进
  1. 问题
    • 高编号LED的闪烁频率过低,可能导致肉眼难以察觉闪烁。
    • 随机数生成范围过大,导致闪烁频率差异显著。
  2. 改进建议
    • 调整随机数范围,例如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));
}
}

实验总结
  1. 通过本实验,掌握了使用millis()函数实现非阻塞式LED控制的方法。
  2. 理解了随机数生成在动态控制中的应用。
  3. 学会了在Wokwi平台中搭建多LED电路并调试代码。
  4. 改进后的代码实现了更均匀的闪烁频率,提升了实验效果。

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

  2. 参考文献

    • Arduino官方文档
    • Wokwi在线仿真平台教程

实验报告撰写人:XXX
日期:XXXX年XX月XX日


课程要点:

在 Wokwi 平台上使用 Arduino Mega 2560 进行 IO 口简单应用的学习,可以涵盖硬件基础、编程入门以及实际应用等多个方面。以下是详细的课程内容概述:

一、Arduino Mega 2560 硬件基础

  1. 核心特性

    • 微控制器:基于 ATmega2560 芯片,具有 256KB 的 Flash 程序内存、8KB 的 SRAM 和 4KB 的 EEPROM。
    • IO 端口:提供 54 个数字 I/O 引脚(其中 15 个支持 PWM 输出)、16 个模拟输入引脚。
    • 通信接口:4 个硬件串行端口、1 个 USB 接口、1 个 ICSP 接口,支持 SPI、I2C 等通信协议。
    • 电源管理:可通过 USB、外部直流电源或电池供电,自动选择供电方式。
  2. 引脚布局与功能

    • 数字 I/O 引脚:如引脚 0-13 可用于数字输入/输出和串行通信,引脚 2-13、44-46 支持 PWM 输出。
    • 模拟输入引脚:如 A0-A15 可用于模拟信号输入,部分引脚也可用作数字 I/O。
    • 特殊功能引脚:如 AREF(模拟参考电压)、Reset(复位按钮)、GND(地线)、VIN(外部电源输入)等。

二、Wokwi 平台使用入门

  1. 平台简介

    • Wokwi 是一个在线的 Arduino 模拟器,支持多种 Arduino 型号,包括 Mega 2560。
    • 无需硬件即可进行 Arduino 编程和仿真,适合初学者快速上手。
  2. 基本操作

    • 创建项目:在 Wokwi 平台上选择 Arduino Mega 2560 型号,创建新的项目。
    • 编写代码:使用内置的代码编辑器编写 Arduino 代码。
    • 仿真运行:点击“运行”按钮,观察仿真结果。

三、IO 口简单应用编程

  1. 数字 I/O 控制

    • LED 闪烁:通过控制数字 I/O 引脚的电平高低,实现 LED 的闪烁。
    • 按钮控制:读取数字 I/O 引脚的状态,实现按钮控制 LED 的亮灭。
  2. 模拟输入读取

    • 电位器调光:通过读取模拟输入引脚的值,控制 LED 的亮度。
    • 传感器数据读取:如使用光敏电阻、温度传感器等模拟传感器,读取环境数据。
  3. PWM 输出控制

    • 电机调速:通过 PWM 输出控制电机的转速。
    • LED 调光:通过 PWM 输出实现 LED 的亮度调节。
  4. 串行通信

    • 串口打印:通过串行端口向计算机发送数据,实现调试信息的输出。
    • 串口通信协议:如使用串口与其他设备进行数据交换。

四、实际应用案例

  1. 智能家居控制

    • 使用 Arduino Mega 2560 控制灯光、窗帘、空调等家居设备。
    • 通过串行通信或无线通信模块与手机 APP 进行交互。
  2. 环境监测系统

    • 使用各种传感器监测环境温度、湿度、光照等参数。
    • 通过串行通信将数据上传到计算机或云服务器进行分析和处理。
  3. 机器人控制

    • 使用 Arduino Mega 2560 控制机器人的电机、舵机等执行机构。
    • 通过传感器获取环境信息,实现机器人的自主导航和避障。

五、课程总结与展望

  1. 课程总结

    • 回顾 Arduino Mega 2560 的硬件基础和 Wokwi 平台的使用方法。
    • 总结 IO 口简单应用编程的关键点和注意事项。
  2. 未来展望

    • 介绍 Arduino Mega 2560 在更复杂项目中的应用前景。
    • 鼓励学生继续深入学习 Arduino 编程和电子技术。


http://www.mrgr.cn/news/95921.html

相关文章:

  • Resume全栈项目(二)(.React+Ts)
  • OpenCV图像拼接(6)根据权重图对源图像进行归一化处理函数normalizeUsingWeightMap()
  • VUE3 路由传参
  • aab 转 apk
  • ⭐算法OJ⭐连接所有点的最小费用【最小生成树】(C++实现)Min Cost to Connect All Points
  • P4147 玉蟾宫
  • MySQL数据库中常用的命令
  • 【NLP 43、大模型技术发展】
  • 【Python LeetCode Patterns】刷力扣,15 个学习模式总结
  • 常用序列的离散时间傅里叶变换(DTFT)
  • Win32 / C++ ini配置文件解析类(支持简易加解密)
  • 【算法】动态规划:回文子串问题、两个数组的dp
  • 3.24[Q]Linux
  • PCL 点云多平面探测
  • 新一代可编程网关应用举例
  • Python Sanic面试题及参考答案
  • P1182 数列分段 Section II
  • 一次由特殊字符引发的Minio签名问题排查
  • 保姆级教程搭建企业级智能体+私有知识库,Dify+ollama,Linux版
  • 基于Python的自然语言处理系列(60):使用 LangChain 构建 Multi-Vector Retriever 进行文档检索