สารบัญ:

วิธีการจับเวลา Arduino ด้วยมิลลิวินาที (): 4 ขั้นตอน
วิธีการจับเวลา Arduino ด้วยมิลลิวินาที (): 4 ขั้นตอน

วีดีโอ: วิธีการจับเวลา Arduino ด้วยมิลลิวินาที (): 4 ขั้นตอน

วีดีโอ: วิธีการจับเวลา Arduino ด้วยมิลลิวินาที (): 4 ขั้นตอน
วีดีโอ: ArduinoEP9 การจับเวลาด้วยฟังก์ชั่น millis() 2024, กรกฎาคม
Anonim
วิธีการจับเวลา Arduino ด้วย Millis ()
วิธีการจับเวลา Arduino ด้วย Millis ()

ในบทความนี้เราจะแนะนำ millis(); และนำไปใช้ในการสร้างตัวอย่างเวลาต่างๆ

มิลลิส? ไม่มีอะไรเกี่ยวข้องกับลิปซิงค์… หวังว่าคุณจะจำ milli เป็นคำนำหน้าตัวเลขสำหรับหนึ่งในพัน; นั่นคือการคูณหน่วยวัดด้วย 0.001 (หรือสิบยกกำลังลบ 3)

ที่น่าสนใจคือ ระบบ Arduino ของเราจะนับจำนวนมิลลิวินาที (พันวินาที) ตั้งแต่เริ่มการสเก็ตช์ไปจนถึงการนับถึงจำนวนสูงสุดที่สามารถเก็บไว้ในประเภทตัวแปร unsigned long (จำนวนเต็ม 32 บิต [สี่ไบต์]) – ช่วงจากศูนย์ถึง (2^32)-1 (2^32)-1 หรือ 4294967295 มิลลิวินาทีแปลงเป็น 49.71027 วันคี่

ตัวนับจะรีเซ็ตเมื่อรีเซ็ต Arduino ถึงค่าสูงสุดหรืออัปโหลดร่างใหม่ ในการรับค่าของตัวนับ ณ จุดเชื่อมต่อเฉพาะ ให้เรียกใช้ฟังก์ชัน – ตัวอย่างเช่น:

เริ่มต้น=มิลลิวินาที();

โดยที่ start เป็นตัวแปร long ที่ไม่ได้ลงนาม นี่เป็นตัวอย่างง่ายๆ ที่จะแสดงให้คุณเห็นว่ามีการทำงานจริงเป็นมิลลิวินาที:

/* มิลลิวินาที () สาธิต */

การเริ่มต้นระยะยาวที่ไม่ได้ลงนาม, เสร็จสิ้น, ผ่านไปแล้ว;

การตั้งค่าเป็นโมฆะ ()

{ Serial.begin(9600); }

วงเป็นโมฆะ ()

{ Serial.println("เริ่ม…"); เริ่มต้น=มิลลิวินาที(); ล่าช้า (1000); เสร็จสิ้น=มิลลิวินาที(); Serial.println("เสร็จสิ้น"); elapsed=finished-เริ่ม; Serial.print (ผ่านไปแล้ว); Serial.println(" ผ่านไปเป็นมิลลิวินาที"); Serial.println(); ล่าช้า (500); }

ภาพสเก็ตช์จะเก็บจำนวนมิลลิวินาทีปัจจุบันไว้ในการเริ่มต้น จากนั้นรอหนึ่งวินาที จากนั้นจึงเก็บค่าของมิลลิวินาทีอีกครั้งในแบบที่เสร็จสิ้น สุดท้ายจะคำนวณเวลาที่ผ่านไปของความล่าช้า ในดัมพ์หน้าจอต่อไปนี้ของจอภาพแบบอนุกรม คุณจะเห็นว่าระยะเวลาไม่ใช่ 1,000 มิลลิวินาทีเสมอไป ดังที่แสดงในภาพ

ขั้นตอนที่ 1:

ภาพ
ภาพ

พูดง่ายๆ ก็คือ ฟังก์ชัน millis ใช้ตัวนับภายในภายในไมโครคอนโทรลเลอร์ ATmega ซึ่งเป็นหัวใจของ Arduino ของคุณ ตัวนับนี้จะเพิ่มขึ้นทุกรอบสัญญาณนาฬิกา ซึ่งเกิดขึ้น (ใน Arduino มาตรฐานและรุ่นที่รองรับ) ที่ความเร็วสัญญาณนาฬิกา 16 Mhz ความเร็วนี้ควบคุมโดยคริสตัลบนบอร์ด Arduino (สิ่งที่เป็นเงินที่มี T16.000 ประทับอยู่)

ขั้นตอนที่ 2:

ภาพ
ภาพ

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

หากคุณกำลังใช้บอร์ดหรือรุ่นของคุณเองที่ใช้เครื่องสะท้อนเสียงแบบเซรามิกแทนคริสตัล โปรดทราบว่าบอร์ดเหล่านี้ไม่แม่นยำเท่าที่ควร และจะแนะนำให้เพิ่มระดับการดริฟท์ให้สูงขึ้น หากคุณต้องการความแม่นยำในการจับเวลาในระดับที่สูงขึ้นมาก ให้พิจารณา IC ตัวจับเวลาเฉพาะ เช่น Maxim DS3231

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

ในมุมมองของฮาร์ดแวร์ เราจะมีปุ่มสองปุ่ม - เริ่มและหยุด - โดยมีตัวต้านทานแบบดึงลง 10k ohm ที่เชื่อมต่อกับพินดิจิทัล 2 และ 3 ตามลำดับ เมื่อผู้ใช้กดเริ่ม สเก็ตช์จะบันทึกค่าของมิลลิวินาที จากนั้นหลังจากกดหยุดแล้ว สเก็ตช์จะบันทึกค่าของมิลลิวินาทีอีกครั้ง คำนวณและแสดงเวลาที่ผ่านไป จากนั้นผู้ใช้สามารถกดเริ่มเพื่อทำซ้ำขั้นตอนหรือหยุดสำหรับข้อมูลที่อัปเดต นี่คือภาพร่าง:

/* นาฬิกาจับเวลาพื้นฐานขั้นสุดยอดโดยใช้มิลลิวินาที (); */

การเริ่มต้นระยะยาวที่ไม่ได้ลงนาม, เสร็จสิ้น, ผ่านไปแล้ว;

การตั้งค่าเป็นโมฆะ ()

{ Serial.begin(9600); โหมดพิน (2, อินพุต); // ปุ่มเริ่ม pinMode (3, INPUT); // ปุ่มหยุด Serial.println("กด 1 เพื่อเริ่ม/รีเซ็ต 2 สำหรับเวลาที่ผ่านไป"); }

เป็นโมฆะ displayResult()

{ ลอย h, m, s, ms; ไม่ได้ลงนามนานเกิน; elapsed=finished-เริ่ม; h=int(ผ่านไป/360000); เกิน=ผ่านไป%360000; m=int(มากกว่า/60000); มากกว่า=มากกว่า%60000; s=int(มากกว่า/1000); ms=มากกว่า%1000; Serial.print("เวลาที่ผ่านไปดิบ: "); Serial.println (ผ่านไปแล้ว); Serial.print("เวลาที่ผ่านไป: "); Serial.print(h, 0); Serial.print("h"); Serial.print(m, 0); Serial.print("m"); Serial.print(s, 0); Serial.print("s "); Serial.print(ms, 0); Serial.println("ms"); Serial.println(); }

วงเป็นโมฆะ ()

{ ถ้า (digitalRead(2)==HIGH) { start=millis(); ล่าช้า(200); // สำหรับ debounce Serial.println("Started…"); } if (digitalRead(3)==HIGH) { เสร็จสิ้น = millis(); ล่าช้า(200); // สำหรับ debounce displayResult(); } }

การเรียกล่าช้า () ใช้เพื่อดีบักสวิตช์ - เป็นทางเลือกและการใช้งานจะขึ้นอยู่กับฮาร์ดแวร์ของคุณ รูปภาพคือตัวอย่างการแสดงผลแบบอนุกรมของภาพสเก็ตช์ โดยนาฬิกาจับเวลาได้เริ่มทำงานแล้ว จากนั้นจึงกดปุ่มสองปุ่มหกครั้งตลอดช่วงระยะเวลาหนึ่ง

ขั้นตอนที่ 3: มาตรวัดความเร็ว…

Image
Image

หากคุณมีเซ็นเซอร์ที่จุดเริ่มต้นและจุดสิ้นสุดของระยะทางที่กำหนด ความเร็วสามารถคำนวณได้: ความเร็ว = ระยะทาง ÷ เวลา

คุณยังสามารถสร้างมาตรวัดความเร็วสำหรับรูปแบบการเคลื่อนที่แบบมีล้อ เช่น จักรยาน ในปัจจุบัน เราไม่มีจักรยานให้วุ่นวาย อย่างไรก็ตาม เราสามารถอธิบายขั้นตอนในการทำเช่นนั้นได้ ซึ่งค่อนข้างง่าย (ข้อจำกัดความรับผิดชอบ - คุณต้องยอมรับความเสี่ยงเอง ฯลฯ)

ก่อนอื่น มาทบทวนคณิตศาสตร์ที่จำเป็นกันก่อน คุณจะต้องรู้เส้นรอบวงของล้อ ฮาร์ดแวร์ – คุณจะต้องมีเซ็นเซอร์ ตัวอย่างเช่น – สวิตช์กกและแม่เหล็ก ให้พิจารณาว่าสวิตช์กกเป็นปุ่มเปิดตามปกติ และเชื่อมต่อตามปกติด้วยตัวต้านทานแบบดึงลง 10k ohm

คนอื่นอาจใช้เซ็นเซอร์เอฟเฟกต์ห้องโถง - แต่ละตัวเป็นของตัวเอง) จำจากชั้นเรียนคณิตศาสตร์ในการคำนวณเส้นรอบวง – ใช้สูตร: เส้นรอบวง = 2πr โดยที่ r คือรัศมีของวงกลม

ตอนนี้คุณมีเส้นรอบวงล้อแล้ว ค่านี้ถือได้ว่าเป็น "ระยะทางคงที่" ของเรา ดังนั้นความเร็วจึงสามารถคำนวณได้โดยการวัดเวลาที่ผ่านไประหว่างการหมุนเต็มที่

เซ็นเซอร์ของคุณเมื่อติดตั้งแล้วควรทำงานในลักษณะเดียวกับปุ่มเปิดตามปกติที่กดทุกการหมุน ภาพร่างของเราจะวัดเวลาที่ผ่านไประหว่างทุกๆ ชีพจรจากเซ็นเซอร์

ในการทำเช่นนี้ ตัวอย่างของเราจะมีเอาต์พุตเซ็นเซอร์เชื่อมต่อกับพินดิจิทัล 2 เนื่องจากจะทริกเกอร์การขัดจังหวะเพื่อคำนวณความเร็ว ร่างนี้จะแสดงความเร็วบนโมดูล LCD อินเทอร์เฟซ I2C ปกติ แนะนำให้ใช้อินเทอร์เฟซ I2C เนื่องจากต้องใช้สายไฟเพียง 4 เส้นจากบอร์ด Arduino ไปยัง LCD ยิ่งใช้สายน้อยเท่าไหร่ก็ยิ่งดี

นี่คือภาพร่างสำหรับการตรวจของคุณ:

/*มาตรวัดความเร็วพื้นฐานโดยใช้มิลลิวินาที(); */

#include "Wire.h" // สำหรับบัส I2C LCD

#include "LiquidCrystal_I2C.h" // สำหรับโมดูลบัส I2C LCD - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // ตั้งค่าที่อยู่ LCD เป็น 0x27 สำหรับอักขระ 16 ตัวและจอแสดงผล 2 บรรทัด

ลอยเริ่มต้น เสร็จสิ้น;

ลอยผ่านไป เวลา; ลอย circMetric=1.2; // เส้นรอบวงล้อสัมพันธ์กับตำแหน่งเซ็นเซอร์ (เป็นเมตร) float circImperial; // ใช้ 1 กิโลเมตร = 0.621371192 ไมล์ float speedk, speedm; // เก็บค่าความเร็วที่คำนวณได้เป็นหน่วยเมตริกและอิมพีเรียล

การตั้งค่าเป็นโมฆะ ()

{ แนบInterrupt (0, speedCalc, เพิ่มขึ้น); // อินเตอร์รัปต์เรียกเมื่อเซ็นเซอร์ส่งดิจิตอล 2 สูง (ทุกการหมุนล้อ) start=millis(); // ตั้งค่า LCD lcd.init(); // เริ่มต้น LCD lcd.backlight(); // เปิดไฟหลังจอ LCD lcd.clear(); lcd.println(" สวมหมวกนิรภัย! "); ล่าช้า (3000); lcd.clear(); Serial.begin(115200); circImperial=circMetric*.62137; // แปลงเมตริกเป็นอิมพีเรียลสำหรับการคำนวณ MPH }

เป็นโมฆะ speedCalc ()

{ ผ่านไปแล้ว = มิลลิวินาที () - เริ่ม; เริ่มต้น=มิลลิวินาที(); speedk=(3600*circMetric)/ผ่านไปแล้ว; // km/h speedm=(3600*circImperial)/elapsed; // ไมล์ต่อชั่วโมง }

วงเป็นโมฆะ ()

{ lcd.setCursor(0, 0); lcd.print(int(speedk)); lcd.print(" กม./ชม. "); lcd.print(int(speedm)); lcd.print (" ไมล์ต่อชั่วโมง "); lcd.setCursor(0, 1); lcd.print(int(ผ่านไปแล้ว)); lcd.print(" ms/rev "); ล่าช้า (1000); // ปรับตามความชอบส่วนตัวเพื่อลดการสั่นไหว }

ไม่มีอะไรเกิดขึ้นมากนัก ทุกครั้งที่ล้อหมุนเสร็จ 1 รอบ สัญญาณจากเซ็นเซอร์จะเปลี่ยนจากต่ำไปสูง ซึ่งจะเรียกฟังก์ชัน speedCalc()

ค่านี้จะอ่านค่า millis() แล้วคำนวณความแตกต่างระหว่างค่าที่อ่านได้ในปัจจุบันและค่าที่อ่านก่อนหน้านี้ ค่านี้จะกลายเป็นเวลาที่ครอบคลุมระยะทาง (ซึ่งเป็นเส้นรอบวงของล้อที่สัมพันธ์กับเซ็นเซอร์ - เก็บไว้ใน

ลอย circMetric=1.2;

และมีหน่วยวัดเป็นเมตร) ในที่สุดก็คำนวณความเร็วเป็นกม./ชม.และไมล์ต่อชั่วโมง ระหว่างการขัดจังหวะ ภาพสเก็ตช์จะแสดงข้อมูลความเร็วที่อัปเดตบน LCD ตลอดจนค่าเวลาดิบสำหรับการปฏิวัติแต่ละครั้งเพื่อความอยากรู้อยากเห็น ในชีวิตจริง ฉันไม่คิดว่าจะมีใครติด LCD บนจักรยาน บางทีจอแสดงผล LED อาจมีความเกี่ยวข้องมากกว่า

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

ขั้นตอนที่ 4:

นั่นเป็นเพียงการสรุปการใช้ millis() ในขณะนั้น นอกจากนี้ยังมี micros(); ฟังก์ชันที่นับไมโครวินาที

คุณมีแล้ว – อีกหนึ่งฟังก์ชันที่ใช้งานได้จริงที่ช่วยให้สามารถแก้ปัญหาต่างๆ ได้มากขึ้นผ่านโลกของ Arduino และเช่นเคย ตอนนี้มันขึ้นอยู่กับคุณและจินตนาการของคุณแล้วที่จะหาบางสิ่งที่จะควบคุมหรือรับมือกับเรื่องตลกอื่นๆ

โพสต์นี้มาถึงคุณโดย pmdway.com - ทุกอย่างสำหรับผู้ผลิตและผู้ที่ชื่นชอบอุปกรณ์อิเล็กทรอนิกส์ พร้อมบริการจัดส่งฟรีทั่วโลก

แนะนำ: