สารบัญ:
วีดีโอ: วิธีการจับเวลา Arduino ด้วยมิลลิวินาที (): 4 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:05
ในบทความนี้เราจะแนะนำ 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: มาตรวัดความเร็ว…
หากคุณมีเซ็นเซอร์ที่จุดเริ่มต้นและจุดสิ้นสุดของระยะทางที่กำหนด ความเร็วสามารถคำนวณได้: ความเร็ว = ระยะทาง ÷ เวลา
คุณยังสามารถสร้างมาตรวัดความเร็วสำหรับรูปแบบการเคลื่อนที่แบบมีล้อ เช่น จักรยาน ในปัจจุบัน เราไม่มีจักรยานให้วุ่นวาย อย่างไรก็ตาม เราสามารถอธิบายขั้นตอนในการทำเช่นนั้นได้ ซึ่งค่อนข้างง่าย (ข้อจำกัดความรับผิดชอบ - คุณต้องยอมรับความเสี่ยงเอง ฯลฯ)
ก่อนอื่น มาทบทวนคณิตศาสตร์ที่จำเป็นกันก่อน คุณจะต้องรู้เส้นรอบวงของล้อ ฮาร์ดแวร์ – คุณจะต้องมีเซ็นเซอร์ ตัวอย่างเช่น – สวิตช์กกและแม่เหล็ก ให้พิจารณาว่าสวิตช์กกเป็นปุ่มเปิดตามปกติ และเชื่อมต่อตามปกติด้วยตัวต้านทานแบบดึงลง 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 - ทุกอย่างสำหรับผู้ผลิตและผู้ที่ชื่นชอบอุปกรณ์อิเล็กทรอนิกส์ พร้อมบริการจัดส่งฟรีทั่วโลก
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
Arduino ที่ถูกที่สุด -- Arduino ที่เล็กที่สุด -- Arduino Pro Mini -- การเขียนโปรแกรม -- Arduino Neno: 6 ขั้นตอน (พร้อมรูปภาพ)
Arduino ที่ถูกที่สุด || Arduino ที่เล็กที่สุด || Arduino Pro Mini || การเขียนโปรแกรม || Arduino Neno:…………………………… โปรดสมัครสมาชิกช่อง YouTube ของฉันสำหรับวิดีโอเพิ่มเติม……. โปรเจ็กต์นี้เกี่ยวกับวิธีเชื่อมต่อ Arduino ที่เล็กที่สุดและถูกที่สุดเท่าที่เคยมีมา Arduino ที่เล็กที่สุดและถูกที่สุดคือ arduino pro mini คล้ายกับ Arduino