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.mzph.cn/diannao/75615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3项目使用 python +flask 打包成桌面应用

server.py import os import sys from flask import Flask, send_from_directory# 获取静态文件路径 if getattr(sys, "frozen", False):# 如果是打包后的可执行文件base_dir sys._MEIPASS else:# 如果是开发环境base_dir os.path.dirname(os.path.abspath(__file…

后端学习day1-Spring(八股)--还剩9个没看

一、Spring 1.请你说说Spring的核心是什么 参考答案 Spring框架包含众多模块&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能&#xff0c;…

LeetCode 第34、35题

LeetCode 第34题&#xff1a;在排序数组中查找元素的第一个和最后一个位置 题目描述 给你一个按照非递减顺序排列的整数数组nums&#xff0c;和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target&#xff0c;返回[-1,1]。你必须…

告别分库分表,时序数据库 TDengine 解锁燃气监控新可能

达成效果&#xff1a; 从 MySQL 迁移至 TDengine 后&#xff0c;设备数据自动分片&#xff0c;运维更简单。 列式存储可减少 50% 的存储占用&#xff0c;单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内&#xff0c;提升应急管理效率。 新架构支持未来…

第十四届蓝桥杯真题

一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.c、fun.h、headfile.h文件,去资源包中把lc…

《基于机器学习发电数据电量预测》开题报告

个人主页&#xff1a;大数据蟒行探索者 目录 一、选题背景、研究意义及文献综述 &#xff08;一&#xff09;选题背景 &#xff08;二&#xff09;选题意义 &#xff08;三&#xff09;文献综述 1. 国内外研究现状 2. 未来方向展望 二、研究的基本内容&#xff0c;拟解…

UWP程序用多页面实现应用实例多开

Windows 10 IoT ARM64平台下&#xff0c;UWP应用和MFC程序不一样&#xff0c;同时只能打开一个应用实例。以串口程序为例&#xff0c;如果用户希望同时打开多个应用实例&#xff0c;一个应用实例打开串口1&#xff0c;一个应用实例打开串口2&#xff0c;那么我们可以加载多个页…

Springboot整合Netty简单实现1对1聊天(vx小程序服务端)

本文功能实现较为简陋&#xff0c;demo内容仅供参考&#xff0c;有不足之处还请指正。 背景 一个小项目&#xff0c;用于微信小程序的服务端&#xff0c;需要实现小程序端可以和他人1对1聊天 实现功能 Websocket、心跳检测、消息持久化、离线消息存储 Netty配置类 /*** au…

GitLab 中文版17.10正式发布,27项重点功能解读【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

好消息!软航文档控件(NTKO WebOffice)在Chrome 133版本上提示扩展已停用的解决方案

软航文档控件现有版本依赖Manifest V2扩展技术支持才能正常运行&#xff0c;然而这个扩展技术到2025年6月在Chrome高版本上就彻底不支持了&#xff0c;现在Chrome 133开始的版本已经开始弹出警告&#xff0c;必须手工开启扩展支持才能正常运行。那么如何解决这个技术难题呢&…

字典树与01trie

字典树简介 当我们通过字典查一个字或单词的时候&#xff0c;我们会通过前缀或关键字的来快速定位一个字的位置&#xff0c;进行快速查找。 字典树就是类似字典中索引表的一种数据结构&#xff0c;能够帮助我们快速定位一个字符串的位置。 字典树是一种存储字符串的数据结构…

二十五、实战开发 uni-app x 项目(仿京东)- 前后端轮播图

定义了一个名为 Swiper 的Java类,用于表示一个轮播图实体。它使用了 Jakarta Persistence API (JPA) 来映射数据库表,并使用了 Lombok 库来简化代码。以下是对代码的详细讲解: 1. 包声明 package com.jd.jdmall.model; 这行代码声明了该类所在的包路径为 com.jd.jdmall.mode…

游戏摇杆开发:利用 Windows API 实现摇杆输入捕获

在现代游戏开发中&#xff0c;游戏摇杆&#xff08;Joystick&#xff09;作为一种重要的输入设备&#xff0c;能够为玩家提供更加沉浸式的游戏体验。Windows 操作系统提供了一系列 API 函数&#xff0c;允许开发者轻松地捕获和处理游戏摇杆的输入。本文将介绍如何使用 Windows …

Ceph集群2025(Squid版)快速对接K8S cephFS文件存储

ceph的块存储太简单了。所以不做演示 查看集群 创建一个 CephFS 文件系统 # ceph fs volume create cephfs01 需要创建一个子卷# ceph fs subvolume create cephfs01 my-subvol -----------------#以下全部自动创建好 # ceph fs ls name: cephfs01, metadata pool: c…

Python中数据结构元组详解

在Python中&#xff0c;元组&#xff08;Tuple&#xff09;是一种不可变的序列类型&#xff0c;常用于存储一组有序的数据。与列表&#xff08;List&#xff09;不同&#xff0c;元组一旦创建&#xff0c;其内容无法修改。本文将详细介绍元组的基本操作、常见运算、内置函数以及…

游戏引擎学习第183天

回顾和今天的计划 我对接下来的进展感到非常兴奋。虽然我们可能会遇到一些问题&#xff0c;但昨天我们差不多完成了将所有内容迁移到新的日志系统的工作&#xff0c;我们正在把一些内容整合进来&#xff0c;甚至是之前通过不同方式记录时间戳的旧平台层部分&#xff0c;现在也…

Spring 如何处理循环依赖

在 Spring 框架里&#xff0c;循环依赖指的是多个 Bean 之间相互依赖&#xff0c;从而形成一个闭环。例如&#xff0c;Bean A 依赖 Bean B&#xff0c;而 Bean B 又依赖 Bean A。Spring 主要通过三级缓存机制来处理循环依赖&#xff0c;下面详细介绍相关内容。 1. 三级缓存的定…

Android开发layer-list

Android开发layer-list 它的用处可以在drawable上进行多图拼接&#xff0c;比如启动页&#xff0c;不想图片被拉伸就这么做。还有做某些线突出来。 示例代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <layer-list xmlns:android&q…

手机测试,工作中学习

要学习各种机型的截图方式、开发模式在哪。 荣耀机型&#xff1a;截图&#xff1a;关节快速敲两下。开发者模式在“系统和更新”里。 1.出现缺陷&#xff0c;需要获取日志。 学习adb生成日志&#xff1a;当测试中出现缺陷的&#xff0c;使用adb logcat -d > d:/log.txt …

OBS虚拟背景深度解析:无需绿幕也能打造专业教学视频(附插件对比)

想要录制教学视频却苦于背景杂乱&#xff1f;本文将手把手教你用OBS实现专业级虚拟背景效果&#xff0c;无需绿幕也能轻松营造沉浸式教学场景。文末附6个提升画面质感的免费背景资源&#xff01; 一、虚拟背景的核心价值&#xff1a;从「教师宿舍」到「虚拟讲堂」的蜕变 我们调…