บทเรียน 14/31-1: ฟังก์ชัน Arduino Millis (ไม่ใช้ delay) และ map | SunFounder Robojax
คู่มือนี้แนะนำฟังก์ชัน millis() ของ Arduino ซึ่งเป็นเครื่องมือพื้นฐานสำหรับโปรเจกต์ที่เกี่ยวข้องกับเวลาและต้องการการทำงานของโค้ดแบบไม่บล็อก (non-blocking) ต่างจาก delay() ที่หยุดการทำงานของโปรแกรมทั้งหมด millis() จะติดตามเวลาที่ผ่านไปตั้งแต่บอร์ดเริ่มทำงาน ทำให้ Arduino ของคุณสามารถทำงานหลายอย่างพร้อมกันได้อย่างมีประสิทธิภาพ คุณสามารถใช้เทคนิคนี้เพื่อสร้าง:
- ไฟกระพริบแบบไม่บล็อกที่ทำงานพร้อมกับโค้ดอื่น ๆ
- เหตุการณ์ตามเวลาที่ triggered โดยเซนเซอร์หรือปุ่มกด เช่น ไฟที่ดับลง 5 วินาทีหลังจากกดปุ่ม
- ระบบบันทึกข้อมูลอย่างง่ายที่บันทึกค่าเซนเซอร์ในช่วงเวลาปกติ
- ระบบอินเทอร์เฟซผู้ใช้ที่ตอบสนองต่ออินพุตโดยไม่ค้าง
ทำความเข้าใจฟังก์ชัน millis()
ฟังก์ชัน millis() เป็นคำสั่งในตัวของ Arduino ที่คืนค่าจำนวนมิลลิวินาทีตั้งแต่บอร์ด Arduino เริ่มรันโปรแกรมปัจจุบัน โดยเริ่มต้นที่ศูนย์เมื่อเปิดเครื่องและเพิ่มขึ้นทุกมิลลิวินาที คุณสามารถเรียกใช้ฟังก์ชันนี้ได้ทุกจุดในโค้ดเพื่อรับค่า "เวลาทำงาน" ปัจจุบัน ตัวอย่างเช่น หลังจาก 1 วินาที จะคืนค่า 1000; หลังจาก 5 วินาที จะคืนค่า 5000 ข้อได้เปรียบหลักคือมันไม่ได้หยุดโค้ดของคุณ ดังนั้นคุณจึงสามารถตรวจสอบเวลาได้ในขณะที่งานอื่น ๆ ยังคงทำงานต่อไป
ทำไมต้องหลีกเลี่ยง delay()?
ฟังก์ชัน delay() เป็นวิธีง่าย ๆ ในการหยุดโปรแกรมชั่วคราว แต่มันเป็นฟังก์ชันแบบบล็อก (blocking function) เมื่อคุณเรียก delay(5000) Arduino จะหยุดการทำงานของโค้ดอื่น ๆ ทั้งหมดเป็นเวลา 5 วินาที ทำให้ส่วนประกอบที่เชื่อมต่อทั้งหมดค้าง ซึ่งเป็นปัญหาสำหรับโปรเจกต์ที่ต้องตอบสนองต่ออินพุตหรืออัปเดตเอาต์พุตอย่างต่อเนื่อง การใช้ millis() ช่วยให้คุณตรวจสอบว่าเวลาผ่านไปตามจำนวนที่กำหนดหรือไม่โดยไม่ต้องหยุดโปรแกรมที่เหลือ ทำให้เหมาะสำหรับการทำงานหลายอย่างพร้อมกัน
ฮาร์ดแวร์ที่ต้องใช้
- บอร์ด Arduino (Uno, Mega ฯลฯ)
- สาย USB สำหรับเขียนโปรแกรมและจ่ายไฟ
คู่มือการเดินสายไฟ
ตัวอย่างนี้ไม่ต้องมีการเดินสายไฟภายนอก Arduino เพียงแค่ต้องเชื่อมต่อกับคอมพิวเตอร์ของคุณผ่าน USB เพื่ออัปโหลดโค้ดและดูเอาต์พุตจาก Serial Monitor
คำอธิบายโค้ด
ตัวอย่างแรกนี้เป็นการสาธิตง่าย ๆ ว่าฟังก์ชัน millis() ทำงานอย่างไร โค้ดจะเริ่มต้น Serial Monitor และพิมพ์ค่าของ millis() ในลูปที่ไม่มีที่สิ้นสุด
void setup() {
Serial.begin(9600);//เริ่มต้น serial monitor
Serial.println("Introduction to millis");
delay(2000);
}
void loop() {
Serial.println(millis());
}
ฟังก์ชัน setup() เริ่มต้นการสื่อสารแบบอนุกรมที่ 9600 baud และพิมพ์ข้อความต้อนรับ delay(2000) ที่นี่ใช้เพื่อสาธิตเท่านั้น เพื่อแสดงว่า millis() เริ่มนับตั้งแต่ช่วงเวลาที่โปรแกรมทำงาน ฟังก์ชัน loop() พิมพ์ค่าปัจจุบันของ millis() อย่างต่อเนื่อง เมื่อคุณเปิด Serial Monitor คุณจะเห็นเวลาเป็นมิลลิวินาทีเพิ่มขึ้นอย่างรวดเร็ว ซึ่งแสดงให้เห็นว่า millis() เป็นตัวนับที่ไม่เคยหยุด โดยให้ข้อมูลอ้างอิงเวลาอย่างต่อเนื่องสำหรับโปรแกรมของคุณ
นี่คือองค์ประกอบพื้นฐาน ในวิดีโอ ผู้สอนสาธิตวิธีใช้ค่านี้เพื่อ trigger การทำงานหลังจากเวลาที่กำหนด เช่น การตรวจสอบว่า 5000 มิลลิวินาที (5 วินาที) ผ่านไปหรือไม่ก่อนที่จะรันบล็อกโค้ดเฉพาะ ซึ่งทำได้โดยการเก็บค่าปัจจุบันของ millis() ไว้ในตัวแปรแล้วเปรียบเทียบในลูปหลัก
การขับ LED ด้วยค่าเปอร์เซ็นต์โดยใช้ฟังก์ชัน map() มีอยู่ใน บทเรียน 14/31-4: ตัวอย่างการเขียนโค้ด Arduino map() 1
การสาธิตโปรเจกต์สด
ในวิดีโอ ผู้สอนอัปโหลดโค้ดนี้และเปิด Serial Monitor คุณจะเห็นเอาต์พุตเริ่มต้นหลังจากดีเลย์เริ่มต้น 2 วินาที โดยแสดงค่าใกล้ 1999 จากนั้นตัวเลขจะเพิ่มขึ้นอย่างรวดเร็ว แสดงให้เห็นการนับมิลลิวินาทีอย่างต่อเนื่อง มุมมองสดนี้ยืนยันว่าฟังก์ชันทำงานได้อย่างถูกต้องและให้ความเข้าใจทางภาพที่ชัดเจนเกี่ยวกับวิธีการติดตามเวลา
โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้
- บทเรียน 14/31-2: ตัวอย่างการเขียนโค้ด Arduino millis() 2 พร้อม event
- บทเรียน 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() เพื่อ trigger เหตุการณ์ตามเวลา
- [08:29] ตัวอย่างกับปุ่มกด
- [12:14] ตัวอย่างการจับเวลาขั้นสูงด้วยปุ่มกด
- [17:20] แนะนำฟังก์ชัน map()
- [19:47] ตัวอย่างโค้ดสำหรับ map() กับ LED
- [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