ค้นหาโค้ด

บทเรียน 14/31-1: ฟังก์ชัน Arduino Millis (ไม่ใช้ delay) และ map | SunFounder Robojax

บทเรียนนี้เป็นส่วนหนึ่งของ: หลักสูตร Arduino ที่ใช้ชุดการเรียนรู้ 3-in-1 ของ SunFounder

บทเรียน 14/31-1: ฟังก์ชัน Arduino Millis (ไม่ใช้ delay) และ map | SunFounder Robojax

คู่มือนี้แนะนำฟังก์ชัน millis() ของ Arduino ซึ่งเป็นเครื่องมือพื้นฐานสำหรับโปรเจกต์ที่เกี่ยวข้องกับเวลาและต้องการการทำงานของโค้ดแบบไม่บล็อก (non-blocking) ต่างจาก delay() ที่หยุดการทำงานของโปรแกรมทั้งหมด millis() จะติดตามเวลาที่ผ่านไปตั้งแต่บอร์ดเริ่มทำงาน ทำให้ Arduino ของคุณสามารถทำงานหลายอย่างพร้อมกันได้อย่างมีประสิทธิภาพ คุณสามารถใช้เทคนิคนี้เพื่อสร้าง:

  • ไฟกระพริบแบบไม่บล็อกที่ทำงานพร้อมกับโค้ดอื่น ๆ
  • เหตุการณ์ตามเวลาที่ triggered โดยเซนเซอร์หรือปุ่มกด เช่น ไฟที่ดับลง 5 วินาทีหลังจากกดปุ่ม
  • ระบบบันทึกข้อมูลอย่างง่ายที่บันทึกค่าเซนเซอร์ในช่วงเวลาปกติ
  • ระบบอินเทอร์เฟซผู้ใช้ที่ตอบสนองต่ออินพุตโดยไม่ค้าง
รถ Sunfounder ที่ประกอบเสร็จแล้ว

ทำความเข้าใจฟังก์ชัน 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 จากนั้นตัวเลขจะเพิ่มขึ้นอย่างรวดเร็ว แสดงให้เห็นการนับมิลลิวินาทีอย่างต่อเนื่อง มุมมองสดนี้ยืนยันว่าฟังก์ชันทำงานได้อย่างถูกต้องและให้ความเข้าใจทางภาพที่ชัดเจนเกี่ยวกับวิธีการติดตามเวลา

โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้

บทต่าง ๆ

  • [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 แบบกำหนดเอง

ภาพ

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)