搜尋程式碼

第14/31-1課:Arduino Millis(無延遲)同 map 函數 | SunFounder Robojax

第14/31-1課:Arduino Millis(無延遲)同 map 函數 | SunFounder Robojax

呢個指南介紹Arduino嘅millis()函數,係一個用於需要非阻塞代碼執行嘅時間型項目嘅基本工具。同delay()唔同,delay()會令成個程式停低,而millis()會追蹤板啟動以嚟經過嘅時間,令你嘅Arduino可以有效咁做多任務。你可以用呢個技術嚟整:

  • 非阻塞LED閃燈,可以喺其他代碼執行緊嘅時候同時運行。
  • 由感測器或者按鈕觸發嘅定時事件,例如撳掣之後5秒熄燈。
  • 簡單嘅數據記錄系統,可以定期記錄感測器數值。
  • 用戶界面系統,可以回應輸入而唔會窒機。
組裝好嘅Sunfounder車

了解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嘅數值。然後數字快速增加,示範毫秒嘅連續計數。呢個現場畫面確認函數正常運作,並提供一個清晰嘅視覺理解,了解時間係點樣被追蹤。

呢條影片嘅相關項目

章節

  • [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函數

圖片

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
916-Lesson 14/31-1: Arduino coding millis() example 1
語言: C++
/*
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

資源與參考資料

文件📁

Arduino 函式庫 (zip)