บทเรียน 14/31-2: การเขียนโค้ด Arduino millis() ตัวอย่างที่ 2 พร้อมอีเวนต์
ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีใช้ฟังก์ชัน millis() ของ Arduino เพื่อเรียกใช้การทำงานหลังจากเวลาที่กำหนดผ่านไปเท่านั้น โดยไม่บล็อกการทำงานส่วนอื่นของโปรแกรมของคุณ นี่เป็นเทคนิคพื้นฐานสำหรับการสร้างโปรเจกต์ Arduino ที่ตอบสนองได้ดี ซึ่งต้องทำงานหลายอย่างพร้อมกัน เช่น การกระพริบ LED ขณะอ่านเซนเซอร์หรือตรวจสอบการกดปุ่ม ตัวอย่างนี้เน้นไปที่การเรียกใช้เหตุการณ์หลังจากห้าวินาที แต่ตรรกะนี้สามารถนำไปประยุกต์ใช้กับสถานการณ์จริงได้มากมาย
ต่อไปนี้คือตัวอย่างเชิงปฏิบัติบางส่วนที่คุณอาจใช้รูปแบบนี้ในโปรเจกต์ของคุณ:
- การหน่วงเวลาเปิดใช้งาน: เปิดพัดลมหรือปั๊มหลังจากระบบทำงานครบตามเวลาที่กำหนดเท่านั้น
- ระบบล็อกเพื่อความปลอดภัย: กำหนดให้ต้องกดปุ่มค้างไว้ตามระยะเวลาหนึ่งก่อนที่จะดำเนินการที่เป็นอันตราย เช่น การสตาร์ทมอเตอร์
- การแจ้งเตือนตามเวลา: เรียกใช้สัญญาณเตือนหรือการแจ้งเตือนหากค่าจากเซนเซอร์ไม่เปลี่ยนแปลงภายในช่วงเวลาที่กำหนด
- ตัวจับเวลาแบบไม่บล็อก: สร้างตัวจับเวลา "watchdog" ที่รีเซ็ตอุปกรณ์หากอุปกรณ์ไม่ตอบสนอง
ปัญหาหลักที่วิธีนี้แก้ไขคือข้อจำกัดของฟังก์ชัน delay() เมื่อคุณใช้ delay(5000) Arduino จะหยุดทำงานโค้ดอื่น ๆ ทั้งหมดเป็นเวลาห้าวินาที ซึ่งใช้ได้ดีกับสเก็ตช์ง่าย ๆ แต่กลายเป็นปัญหาใหญ่ในโปรเจกต์ที่ซับซ้อนซึ่งคุณต้องอ่านเซนเซอร์ อัปเดตจอแสดงผล หรือฟังการกดปุ่มขณะรอ ฟังก์ชัน millis() ซึ่งนับจำนวนมิลลิวินาทีตั้งแต่บอร์ดได้รับพลังงาน ช่วยให้คุณตรวจสอบเวลาได้โดยไม่ต้องหยุดโปรแกรม
ฮาร์ดแวร์ที่ต้องใช้
- บอร์ด Arduino (Uno, Nano, Mega ฯลฯ)
- ปุ่มกด
- สายไฟจัมเปอร์
คู่มือการเดินสายไฟ
การเดินสายไฟสำหรับตัวอย่างนี้ง่ายมาก ใช้ตัวต้านทานดึงขึ้นภายใน จึงไม่จำเป็นต้องใช้ตัวต้านทานภายนอกสำหรับปุ่ม
- เชื่อมต่อขาหนึ่งของปุ่มกดเข้ากับพิน GND บน Arduino
- เชื่อมต่อขาอีกข้างของปุ่มกดเข้ากับดิจิทัลพิน 2 บน Arduino
เนื่องจากเราใช้ INPUT_PULLUP ในโค้ด พินจะอ่านค่าเป็น HIGH เมื่อไม่ได้กดปุ่ม และเป็น LOW เมื่อกดปุ่ม ซึ่งเป็นการเชื่อมต่อพินเข้ากับกราวด์ (ในวิดีโอที่ 08:29)
ทำความเข้าใจโค้ด
โค้ดนี้สาธิตตัวจับเวลาแบบอิงเหตุการณ์อย่างง่าย โปรแกรมจะพิมพ์ค่า millis() ปัจจุบันไปยัง Serial Monitor อย่างต่อเนื่อง เมื่อกดปุ่มค้างไว้ และ Arduino ทำงานมาแล้วอย่างน้อย 5 วินาที โปรแกรมจะพิมพ์ "Take action" ไปยัง Serial Monitor จุดสำคัญคือการตรวจสอบ millis() ไม่ได้หยุดการพิมพ์เวลาอย่างต่อเนื่อง
มาดูส่วนที่ผู้ใช้สามารถกำหนดค่าได้ในโค้ด:
unsigned long event = 5000;// 5 วินาที
นี่คือตัวแปรที่สำคัญที่สุดในการกำหนดค่า มันกำหนดระยะเวลาของ "เหตุการณ์" ของคุณในหน่วยมิลลิวินาที ในตัวอย่างนี้ตั้งค่าเป็น 5000 ซึ่งเท่ากับ 5 วินาที หากต้องการเปลี่ยนระยะเวลา เพียงแก้ไขตัวเลขนี้ เช่น ตั้งเป็น 10000 จะทำให้การทำงานเกิดขึ้นหลังจาก 10 วินาที สิ่งสำคัญคือต้องใช้ชนิดข้อมูล unsigned long เนื่องจากค่าของ millis() สามารถเพิ่มขึ้นได้มากและจะเกินค่าสูงสุดของตัวแปร int มาตรฐานในที่สุด ซึ่งจะทำให้การเปรียบเทียบผิดพลาด (ในวิดีโอที่ 05:46)
pinMode(2,INPUT_PULLUP);
บรรทัดนี้กำหนดค่าดิจิทัลพิน 2 เป็นอินพุตและเปิดใช้งานตัวต้านทานดึงขึ้นภายใน นี่เป็นขั้นตอนการกำหนดค่าที่สำคัญที่ช่วยให้คุณเชื่อมต่อปุ่มได้โดยไม่ต้องใช้ตัวต้านทานภายนอก พินจะอ่านค่าเป็น HIGH โดยค่าเริ่มต้นและจะเปลี่ยนเป็น LOW เมื่อกดปุ่ม ซึ่งเป็นการเชื่อมต่อกับกราวด์ หากคุณต้องการใช้พินอื่น ให้เปลี่ยนหมายเลข 2 ที่นี่และในบรรทัด digitalRead(2) ภายในลูป (ในวิดีโอที่ 08:46)
ตรรกะภายใน loop() นั้นตรงไปตรงมา มันอ่านสถานะของปุ่ม หากกดปุ่ม (pb == LOW) จากนั้นจะตรวจสอบว่าเวลาปัจจุบัน (millis()) มากกว่าหรือเท่ากับเวลา event ที่คุณกำหนดไว้หรือไม่ หากทั้งสองเงื่อนไขเป็นจริง มันจะพิมพ์ข้อความการทำงาน ส่วนที่เหลือของลูปซึ่งพิมพ์เวลาจะทำงานต่อไปอย่างไม่สะดุด ซึ่งแสดงให้เห็นถึงพลังของ millis() เหนือ delay()
ตัวอย่างนี้ตรวจสอบเวลาตั้งแต่เริ่มต้นการทำงานของ Arduino ตัวอย่างที่สามในชุดวิดีโอต่อยอดจากนี้โดยบันทึกเวลาของการกดปุ่มครั้งแรกและเรียกใช้การทำงานเฉพาะเมื่อมีการกดครั้งที่สองเกิดขึ้นหลังจากผ่านไปอย่างน้อย 5 วินาที ตรรกะนั้นอธิบายไว้ใน บทที่ 14/31-3: ตัวอย่างการเขียนโค้ด Arduino millis() ที่ 3 ร่วมกับปุ่มกด
การสาธิตโปรเจกต์สด
เมื่อคุณอัปโหลดโค้ดและเปิด Serial Monitor (ที่ 9600 บอด) คุณจะเห็นตัวเลขไหลต่อเนื่อง ซึ่งแสดงจำนวนมิลลิวินาทีตั้งแต่บอร์ดได้รับพลังงาน หากคุณกดปุ่มค้างไว้ก่อนที่ 5 วินาทีจะผ่านไป จะไม่มีอะไรเกิดขึ้น อย่างไรก็ตาม หากคุณกดปุ่มค้างไว้หลังจากผ่านจุด 5 วินาที คุณจะเห็นข้อความ "Take action" ปรากฏใน Serial Monitor การทำงานจะพิมพ์ต่อไปเรื่อย ๆ ตราบใดที่ยังกดปุ่มอยู่ ซึ่งแสดงให้เห็นถึงตัวจับเวลาแบบไม่บล็อกที่ช่วยให้โค้ดอื่น ๆ (การพิมพ์) ทำงานได้อย่างราบรื่น (ในวิดีโอที่ 10:52)
โปรเจกต์ที่เกี่ยวข้องจากวิดีโอนี้
วิดีโอนี้เป็นส่วนหนึ่งของชุดบทเรียนหลายตอนเกี่ยวกับฟังก์ชันการจับเวลาและการแมปค่าของ Arduino สำรวจบทเรียนอื่นๆ ที่สร้างจากแหล่งข้อมูลเดียวกันนี้:
- บทเรียนที่ 14/31-1: Arduino Millis (ไม่ใช้ delay) และฟังก์ชัน map | SunFounder Robojax
- บทเรียนที่ 14/31-3: การเขียนโค้ด Arduino millis() ตัวอย่างที่ 3 ร่วมกับปุ่มกด
- บทเรียนที่ 14/31-4: การเขียนโค้ด Arduino map() ตัวอย่างที่ 1
- บทเรียนที่ 14/31-5: การเขียนโค้ด Arduino map() ตัวอย่างที่ 2
บทตอน
- [00:00] แนะนำ millis() และชุดอุปกรณ์ SunFounder
- [01:19] millis() คืออะไร และทำไมต้องใช้แทน delay()?
- [03:06] การสาธิตเชิงปฏิบัติ: การพิมพ์ค่า millis()
- [05:46] การสร้างเหตุการณ์ด้วย millis() และ unsigned long
- [08:29] การต่อวงจรและการเขียนโค้ดปุ่มกดด้วย INPUT_PULLUP
- [10:52] การรันตัวอย่างเหตุการณ์ร่วมกับปุ่มกด
- [12:14] ตัวอย่างที่ 3: การตรวจจับการกดปุ่มครั้งที่สอง
- [17:20] แนะนำฟังก์ชัน map()
- [19:47] การเขียนโค้ดและการสาธิตฟังก์ชัน map() ร่วมกับ LED
/*
Lesson 14/31: Arduino coding millis() example 2 with event
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/>.
*/
unsigned long event = 5000;// 5 seconds
void setup() {
Serial.begin(9600);//initialize serial monitor
Serial.println("Introduction to millis");
pinMode(2,INPUT_PULLUP);
}
void loop() {
// Robojax.com millis() example 1
Serial.println(millis());
int pb = digitalRead(2);// read pin 2
if(pb ==LOW)
{
if(millis() >= event)
{
Serial.println("Take action");
}// if end
}// if end
}// loop end
สิ่งที่คุณอาจต้องการ
-
อเมซอนSunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
อเมซอน
-
อเมซอน
-
อเมซอน
-
อเมซอน
-
อื่น ๆ
แหล่งข้อมูลและเอกสารอ้างอิง
-
ภายนอกPurchase SunFounder's 3-in-1 Smart car learning kitsunfounder.com
ไฟล์📁
คู่มือผู้ใช้
-
SunFounder 3-in-1 Arduino Smart Car assembly manualThis document shows step by step assembly of SunFounder 3-in-1 Arduino Smart Car
SunFounder_car_assembly_manual.pdf1.20 MB