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.pswp.cn/diannao/75615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75615.shtml
英文地址,請注明出處:http://en.pswp.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;從「教師宿舍」到「虛擬講堂」的蛻變 我們調…