Cách Thực Hiện Các Tác Vụ Song Song (Luồng) Trong Chương Trình Arduino

Mục lục:

Cách Thực Hiện Các Tác Vụ Song Song (Luồng) Trong Chương Trình Arduino
Cách Thực Hiện Các Tác Vụ Song Song (Luồng) Trong Chương Trình Arduino

Video: Cách Thực Hiện Các Tác Vụ Song Song (Luồng) Trong Chương Trình Arduino

Video: Cách Thực Hiện Các Tác Vụ Song Song (Luồng) Trong Chương Trình Arduino
Video: Ứng dụng Arduino Uno kết hợp với cảm biến âm thanh để điều khiển thiết bị điện trong nhà 2024, Có thể
Anonim

Trong công nghệ vi xử lý, các tác vụ chạy song song được gọi là Threads. Điều này rất thuận tiện, vì thường phải thực hiện nhiều thao tác cùng một lúc. Có thể làm cho bộ vi điều khiển Arduino thực hiện một số tác vụ cùng một lúc, giống như một bộ xử lý thực sự không? Hãy xem nào.

Các luồng song song trong một chương trình Arduino
Các luồng song song trong một chương trình Arduino

Nó là cần thiết

  • - Arduino;
  • - 1 đèn LED;
  • - 1 còi piezo.

Hướng dẫn

Bước 1

Nói chung, Arduino không hỗ trợ song song thực sự hoặc đa luồng.

Nhưng bạn có thể yêu cầu bộ vi điều khiển kiểm tra xem đã đến lúc thực thi một số tác vụ nền, bổ sung sau mỗi lần lặp lại chu trình "loop ()" hay chưa. Trong trường hợp này, người dùng sẽ thấy rằng một số tác vụ đang được thực hiện đồng thời.

Ví dụ, hãy nhấp nháy đèn LED ở một tần số nhất định và song song, phát ra âm thanh tăng và giảm giống như còi báo động từ bộ phát áp điện.

Chúng tôi đã kết nối cả đèn LED và bộ phát piezo với Arduino nhiều lần. Hãy lắp ráp mạch điện như trong hình. Nếu bạn đang kết nối đèn LED với chân kỹ thuật số không phải là "13", hãy nhớ có điện trở giới hạn dòng điện khoảng 220 ohms.

Sơ đồ đấu dây cho bộ rung và đèn LED tới Arduino
Sơ đồ đấu dây cho bộ rung và đèn LED tới Arduino

Bước 2

Hãy viết một bản phác thảo như thế này và tải nó lên Arduino.

Sau khi tải bảng, bạn có thể thấy rằng bản phác thảo không được thực hiện chính xác như chúng ta cần: cho đến khi còi báo động hoạt động hoàn toàn, đèn LED sẽ không nhấp nháy và chúng tôi muốn đèn LED nhấp nháy SAU KHI còi báo động phát ra. vấn đề ở đây là gì?

Thực tế là vấn đề này không thể được giải quyết theo cách thông thường. Các tác vụ được thực hiện bởi vi điều khiển theo trình tự nghiêm ngặt. Toán tử "delay ()" trì hoãn việc thực hiện chương trình trong một khoảng thời gian xác định và cho đến khi hết thời gian này, các lệnh chương trình sau sẽ không được thực hiện. Do đó, chúng ta không thể đặt thời lượng thực thi khác nhau cho từng tác vụ trong "loop ()" của chương trình.

Do đó, bạn cần phải mô phỏng bằng cách nào đó đa nhiệm.

Điều khiển tiếng bíp và đèn LED nối tiếp
Điều khiển tiếng bíp và đèn LED nối tiếp

Bước 3

Tùy chọn trong đó Arduino sẽ thực hiện các tác vụ trong song song giả được các nhà phát triển Arduino gợi ý trong bài viết

Bản chất của phương pháp là với mỗi lần lặp lại vòng lặp "loop ()", chúng ta kiểm tra xem đã đến lúc nhấp nháy đèn LED (để thực hiện tác vụ nền) hay chưa. Và nếu nó xảy ra, thì chúng tôi đảo ngược trạng thái của đèn LED. Đây là một loại bỏ qua toán tử "delay ()".

Một nhược điểm đáng kể của phương pháp này là phần mã phía trước bộ điều khiển đèn LED phải được thực thi nhanh hơn khoảng thời gian nhấp nháy của đèn LED "ledInterval". Nếu không, việc nhấp nháy sẽ xảy ra ít thường xuyên hơn mức cần thiết và chúng tôi sẽ không nhận được hiệu quả của việc thực hiện song song các tác vụ. Đặc biệt, trong bản phác thảo của chúng tôi, khoảng thời gian thay đổi âm thanh còi báo động là 200 + 200 + 200 + 200 = 800 mili giây và chúng tôi đặt khoảng thời gian nhấp nháy của đèn LED là 200 mili giây. Nhưng đèn LED sẽ nhấp nháy với khoảng thời gian 800 msec, chênh lệch 4 lần so với những gì chúng tôi thiết lập. Nói chung, nếu toán tử "delay ()" được sử dụng trong mã, thì rất khó để mô phỏng song song giả, vì vậy nên tránh nó.

Trong trường hợp này, bộ điều khiển âm thanh còi báo động cũng cần phải kiểm tra xem thời gian đã đến hay chưa và không sử dụng "delay ()". Nhưng điều này sẽ làm tăng số lượng mã và làm giảm khả năng đọc của chương trình.

Đèn LED nhấp nháy không có độ trễ () toán tử
Đèn LED nhấp nháy không có độ trễ () toán tử

Bước 4

Để giải quyết vấn đề này, chúng tôi sẽ sử dụng thư viện ArduinoThread tuyệt vời, cho phép bạn dễ dàng tạo các quy trình giả song song. Nó hoạt động theo cách tương tự, nhưng nó cho phép bạn không phải viết mã để kiểm tra thời gian - liệu bạn có cần thực hiện tác vụ trong vòng lặp này hay không. Điều này làm giảm số lượng mã và cải thiện khả năng đọc của bản phác thảo. Hãy kiểm tra thư viện đang hoạt động.

Trước hết, hãy tải xuống kho lưu trữ thư viện từ trang web chính thức https://github.com/ivanseidel/ArduinoThread/archive/master.zip và giải nén nó vào thư mục "thư viện" của Arduino IDE. Sau đó đổi tên thư mục "ArduinoThread-master" thành "ArduinoThread".

Cài đặt thư viện ArduinoThread
Cài đặt thư viện ArduinoThread

Bước 5

Sơ đồ kết nối sẽ được giữ nguyên. Chỉ có mã chương trình sẽ thay đổi. Bây giờ nó sẽ giống như trong thanh bên.

Trong chương trình, chúng tôi tạo ra hai luồng, mỗi luồng thực hiện hoạt động riêng: một luồng nhấp nháy với đèn LED, luồng thứ hai điều khiển âm thanh của còi báo động. Trong mỗi lần lặp lại của vòng lặp, đối với mỗi luồng, chúng tôi kiểm tra xem đã đến lúc thực thi nó hay chưa. Nếu nó đến, nó sẽ được khởi chạy để thực thi bằng phương thức "run ()". Điều chính là không sử dụng toán tử "delay ()".

Giải thích chi tiết hơn được đưa ra trong mã.

Hãy tải mã vào bộ nhớ Arduino, chạy nó. Bây giờ mọi thứ hoạt động chính xác như nó phải!

Đề xuất: