ในเทคโนโลยีไมโครโปรเซสเซอร์ งานที่ทำงานพร้อมกันเรียกว่าเธรด สะดวกมากเพราะมักจำเป็นต้องดำเนินการหลายอย่างพร้อมกัน เป็นไปได้ไหมที่จะทำให้ไมโครคอนโทรลเลอร์ Arduino ทำงานหลายอย่างพร้อมกัน เหมือนตัวประมวลผลจริง มาดูกัน.
มันจำเป็น
- - Arduino;
- - 1 LED;
- - ออดเซอร์ 1 ตัว
คำแนะนำ
ขั้นตอนที่ 1
โดยทั่วไป Arduino ไม่รองรับการขนานที่แท้จริงหรือมัลติเธรด
แต่คุณสามารถบอกให้ไมโครคอนโทรลเลอร์ตรวจสอบว่าถึงเวลาแล้วหรือยังที่จะทำงานเบื้องหลังเพิ่มเติมในการทำซ้ำของวงจร "loop ()" แต่ละครั้ง ในกรณีนี้ดูเหมือนว่าผู้ใช้จะดำเนินการหลายอย่างพร้อมกัน
ตัวอย่างเช่น ให้ไฟ LED กะพริบที่ความถี่ที่กำหนดและปล่อยเสียงที่ขึ้นและลงเหมือนไซเรนจากตัวปล่อยแบบเพียโซอิเล็กทริก
เราได้เชื่อมต่อทั้ง LED และ piezo emitter กับ Arduino มากกว่าหนึ่งครั้ง มาประกอบวงจรกันตามรูปเลยครับ หากคุณกำลังเชื่อมต่อ LED กับพินดิจิตอลอื่นที่ไม่ใช่ "13" อย่าลืมมีตัวต้านทานจำกัดกระแสที่ประมาณ 220 โอห์ม
ขั้นตอนที่ 2
มาเขียนสเก็ตช์แบบนี้และอัปโหลดไปยัง Arduino
หลังจากโหลดบอร์ดแล้ว คุณจะเห็นว่าภาพสเก็ตช์ไม่ได้ทำงานตรงตามที่เราต้องการ: จนกว่าไซเรนจะทำงานเต็มที่ ไฟ LED จะไม่กะพริบ และเราต้องการให้ไฟ LED กะพริบระหว่างที่เสียงไซเรนดังขึ้น ปัญหาที่นี่คืออะไร?
ความจริงก็คือปัญหานี้ไม่สามารถแก้ไขได้ตามปกติ งานจะดำเนินการโดยไมโครคอนโทรลเลอร์ตามลำดับอย่างเคร่งครัด โอเปอเรเตอร์ "delay ()" ทำให้การทำงานของโปรแกรมล่าช้าตามระยะเวลาที่กำหนด และจนกว่าจะหมดเวลานี้ คำสั่งโปรแกรมต่อไปนี้จะไม่ทำงาน ด้วยเหตุนี้ เราจึงไม่สามารถกำหนดระยะเวลาดำเนินการที่แตกต่างกันสำหรับแต่ละงานใน "loop ()" ของโปรแกรมได้
ดังนั้นคุณต้องจำลองการทำงานหลายอย่างพร้อมกัน
ขั้นตอนที่ 3
ตัวเลือกที่ Arduino จะทำงานแบบขนานเทียมนั้นแนะนำโดยนักพัฒนา Arduino ในบทความ
สาระสำคัญของวิธีการคือการวนซ้ำ "loop ()" แต่ละครั้ง เราจะตรวจสอบว่าถึงเวลาที่จะต้องกะพริบไฟ LED (เพื่อทำงานเบื้องหลัง) หรือไม่ และถ้าเป็นเช่นนั้น เราก็สลับสถานะของ LED นี่เป็นการเลี่ยงผ่านตัวดำเนินการ "delay ()"
ข้อเสียที่สำคัญของวิธีนี้คือต้องดำเนินการส่วนรหัสด้านหน้าชุดควบคุม LED เร็วกว่าช่วงเวลาที่กะพริบของ LED "ledInterval" มิฉะนั้น การกะพริบจะเกิดขึ้นน้อยกว่าที่จำเป็น และเราจะไม่ได้รับผลกระทบจากการทำงานแบบคู่ขนาน โดยเฉพาะอย่างยิ่ง ในภาพร่างของเรา ระยะเวลาของการเปลี่ยนแปลงเสียงไซเรนคือ 200 + 200 + 200 + 200 = 800 มิลลิวินาที และเราตั้งช่วงเวลาการกะพริบของ LED เป็น 200 มิลลิวินาที แต่ไฟ LED จะกะพริบเป็นระยะเวลา 800 มิลลิวินาที ซึ่งแตกต่างจากที่เราตั้งไว้ 4 เท่า โดยทั่วไป หากใช้โอเปอเรเตอร์ "delay ()" ในโค้ด การจำลองคู่ขนานเทียมจะเป็นเรื่องยาก ดังนั้นจึงแนะนำให้หลีกเลี่ยง
ในกรณีนี้ หน่วยควบคุมเสียงไซเรนจะต้องตรวจสอบด้วยว่าถึงเวลาหรือไม่ และไม่ควรใช้ "การหน่วงเวลา ()" แต่สิ่งนี้จะเพิ่มจำนวนโค้ดและทำให้ความสามารถในการอ่านของโปรแกรมแย่ลง
ขั้นตอนที่ 4
เพื่อแก้ปัญหานี้ เราจะใช้ไลบรารี ArduinoThread ที่ยอดเยี่ยม ซึ่งช่วยให้คุณสามารถสร้างกระบวนการขนานเทียมได้อย่างง่ายดาย มันทำงานในลักษณะเดียวกัน แต่ช่วยให้คุณไม่ต้องเขียนโค้ดเพื่อตรวจสอบเวลา ไม่ว่าคุณจะต้องดำเนินการงานในลูปนี้หรือไม่ก็ตาม ซึ่งจะช่วยลดจำนวนโค้ดและปรับปรุงความสามารถในการอ่านแบบร่าง มาดูการทำงานของห้องสมุดกัน
ก่อนอื่น ดาวน์โหลดไฟล์เก็บถาวรของไลบรารีจากเว็บไซต์ทางการ https://github.com/ivansedel/ArduinoThread/archive/master.zip และแตกไฟล์ลงในไดเร็กทอรี "ไลบรารี" ของ Arduino IDE จากนั้นเปลี่ยนชื่อโฟลเดอร์ "ArduinoThread-master" เป็น "ArduinoThread"
ขั้นตอนที่ 5
แผนภาพการเชื่อมต่อจะยังคงเหมือนเดิม เฉพาะรหัสโปรแกรมเท่านั้นที่จะเปลี่ยน ตอนนี้มันจะเหมือนกับในแถบด้านข้าง
ในโปรแกรม เราสร้างสตรีมสองสตรีม โดยแต่ละสตรีมมีการทำงานของตัวเอง: สตรีมหนึ่งกะพริบพร้อมไฟ LED และสตรีมที่สองควบคุมเสียงไซเรน ในการวนซ้ำแต่ละครั้ง สำหรับแต่ละเธรด เราจะตรวจสอบว่าถึงเวลาสำหรับการดำเนินการแล้วหรือยัง หากมาถึง จะมีการเปิดใช้เพื่อดำเนินการโดยใช้วิธี "run ()" สิ่งสำคัญคืออย่าใช้ตัวดำเนินการ "delay ()"
คำอธิบายโดยละเอียดเพิ่มเติมมีอยู่ในรหัส
มาโหลดโค้ดลงในหน่วยความจำ Arduino กันเถอะ ตอนนี้ทุกอย่างทำงานได้ตามที่ควรจะเป็น!