ค้นหาโค้ด

บทเรียน 14/31-2: การเขียนโค้ด Arduino millis() ตัวอย่างที่ 2 พร้อมอีเวนต์

บทเรียน 14/31-2: การเขียนโค้ด Arduino millis() ตัวอย่างที่ 2 พร้อมอีเวนต์

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

รถ Sunfounder ที่ประกอบเสร็จแล้ว

ต่อไปนี้คือตัวอย่างเชิงปฏิบัติบางส่วนที่คุณอาจใช้รูปแบบนี้ในโปรเจกต์ของคุณ:

  • การหน่วงเวลาเปิดใช้งาน: เปิดพัดลมหรือปั๊มหลังจากระบบทำงานครบตามเวลาที่กำหนดเท่านั้น
  • ระบบล็อกเพื่อความปลอดภัย: กำหนดให้ต้องกดปุ่มค้างไว้ตามระยะเวลาหนึ่งก่อนที่จะดำเนินการที่เป็นอันตราย เช่น การสตาร์ทมอเตอร์
  • การแจ้งเตือนตามเวลา: เรียกใช้สัญญาณเตือนหรือการแจ้งเตือนหากค่าจากเซนเซอร์ไม่เปลี่ยนแปลงภายในช่วงเวลาที่กำหนด
  • ตัวจับเวลาแบบไม่บล็อก: สร้างตัวจับเวลา "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 สำรวจบทเรียนอื่นๆ ที่สร้างจากแหล่งข้อมูลเดียวกันนี้:

บทตอน

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

ภาพ

Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
Sunfounder car assembled
917-Lesson 14/31-2: Arduino coding millis() example 2 with event
ภาษา: C++
/*
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

สิ่งที่คุณอาจต้องการ

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

คู่มือผู้ใช้