第14/31-1課:Arduino Millis(無延遲)同 map 函數 | SunFounder Robojax
呢個指南介紹Arduino嘅millis()函數,係一個用於需要非阻塞代碼執行嘅時間型項目嘅基本工具。同delay()唔同,delay()會令成個程式停低,而millis()會追蹤板啟動以嚟經過嘅時間,令你嘅Arduino可以有效咁做多任務。你可以用呢個技術嚟整:
- 非阻塞LED閃燈,可以喺其他代碼執行緊嘅時候同時運行。
- 由感測器或者按鈕觸發嘅定時事件,例如撳掣之後5秒熄燈。
- 簡單嘅數據記錄系統,可以定期記錄感測器數值。
- 用戶界面系統,可以回應輸入而唔會窒機。
了解millis()函數
millis()函數係一個內置嘅Arduino指令,會返回Arduino板開始運行當前程式以嚟嘅毫秒數。佢喺開機嘅時候由零開始,每秒鐘增加一千次。你可以喺代碼入面任何位置呼叫呢個函數嚟攞當前嘅「運行時間」數值。例如,1秒之後佢會返回1000;5秒之後會返回5000。主要嘅好處係佢唔會暫停你嘅代碼,所以你可以喺其他任務繼續運行嘅時候檢查時間。
點解要避免用delay()?
delay()函數係一個暫停程式嘅簡單方法,但佢係一個阻塞函數。當你呼叫delay(5000)嘅時候,Arduino會停止執行所有其他代碼5秒,令任何連接嘅組件凍結。呢個對於需要持續回應輸入或者更新輸出嘅項目嚟講係一個問題。用millis()可以令你檢查係咪已經過咗某段時間,而唔會停止你程式嘅其餘部分,所以好適合用嚟做多任務。
所需硬件
- Arduino板(Uno、Mega等)
- 用於編程同供電嘅USB線
接線指南
呢個例子唔需要任何外部接線。Arduino只需要通過USB連接到電腦,就可以上傳代碼同睇序列監視器輸出。
代碼解釋
呢個第一個例子係簡單示範millis()點樣運作。代碼初始化序列監視器,然後喺一個無限循環入面打印millis()嘅數值。
void setup() {
Serial.begin(9600);//初始化序列監視器
Serial.println("Introduction to millis");
delay(2000);
}
void loop() {
Serial.println(millis());
}
setup()函數以9600波特率開始序列通訊,並打印歡迎訊息。呢度嘅delay(2000)只係用嚟示範,顯示millis()由程式運行嘅一刻開始計數。loop()函數會持續打印millis()嘅當前數值。當你打開序列監視器嘅時候,你會見到以毫秒計嘅時間快速增加。呢個說明millis()係一個永遠唔會停嘅計數器,為你嘅程式提供一個連續嘅時間參考。
呢個係基本嘅構建模組。喺影片入面,導師示範點樣用呢個數值嚟喺設定時間之後觸發動作,例如檢查係咪已經過咗5000毫秒(5秒)先執行一個特定嘅代碼區塊。做法係將當前嘅millis()數值儲存喺一個變數入面,然後喺主循環入面比較佢。
用map()函數以百分比數值驅動LED嘅內容,喺第14/31-4課:Arduino編碼map()例子1入面有講解。
現場項目示範
喺影片入面,導師上傳呢段代碼並打開序列監視器。你可以見到輸出喺最初嘅2秒延遲之後開始,顯示一個接近1999嘅數值。然後數字快速增加,示範毫秒嘅連續計數。呢個現場畫面確認函數正常運作,並提供一個清晰嘅視覺理解,了解時間係點樣被追蹤。
呢條影片嘅相關項目
- 第14/31-2課:Arduino編碼millis()例子2(含事件)
- 第14/31-3課:Arduino編碼millis()例子3(含按鈕)
- 第14/31-4課:Arduino編碼map()例子1
- 第14/31-5課:Arduino編碼map()例子2
章節
- [00:00] millis()簡介
- [01:19] 咩係millis()同點解要用佢
- [03:06] millis()嘅實際示範
- [05:46] 用millis()嚟觸發定時事件
- [08:29] 用按鈕嘅例子
- [12:14] 進階按鈕計時例子
- [17:20] map()函數簡介
- [19:47] 用LED嘅map()代碼例子
- [22:41] 自訂map函數
/*
Lesson 14/31: Arduino coding millis() example 1
Get this code and watch video Download and resource page https://robojax.com/RJT597
YouTube video https://www.youtube.com/watch?v=lqgzQohNiIM
* This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.*
* This code has been download from Robojax.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/*
* Example-1 of using millis() with Arduino
* Written by Ahmad Shamshiri on July 27, 2019
* in Ajax, Ontario, Canada
* Watch video instructio for millis() :https://youtu.be/u2HsiTS8niQ
*/
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
delay(2000);
}
void loop() {
Serial.println(millis());
}// loop end
Common Course Links
Common Course Files
你可能需要嘅嘢
-
亞馬遜SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
亞馬遜
-
亞馬遜
-
亞馬遜
資源與參考資料
-
文件记录Documentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
-
外部Purchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
文件📁
Arduino 函式庫 (zip)
-
SunFounder's 3-in-1 Smart Car learning kit source code
3in1-kit-main-v2.zip12.80 MB