Bạn đang ở đây
Đại Huỳnh gửi vào
Chủ nhật, 5 Tháng 10, 2014 - 15:16
Lời chia sẻ đầu tiên thì tôi không phải học ngành Điện - Điện tử và chuyên ngành của tôi là Công nghệ phần mềm và lập trình Game ( rock
- Timer:
- Sử dụng singleton để tất cả mọi hàm đều sử dụng 1 lần trong cả chương trình.
- Yêu cầu initialize ( khởi tạo ) ban đầu ở hàm setup() của Arduino.
- Yêu cầu gọi hàm update() đầu tiên trong hàm loop().
- Yêu cầu gọi hàm resetTick() cuối cùng trong hàm loop().
- Tôi xin giải thích về hàm Timer như sau:
- Đầu tiên chúng ta sẽ khởi tao Timer bằng cách cho lastTick ( lần tick trước ) bằng thời gian trôi qua hiện tại trong Arduino và đó là lý do tại sao phải gọi hàm initialize() trong setup().
- Ở hàm loop() mỗi lần bắt đầu phải gọi hàm update() để đánh dấu currentTick (lần tick hiện tại ) bằng thời gian trôi qua hiện tại trong Arduino để chúng ta có thể tính được delta giữa 2 lần loop() cũa Arduino. Thời gian delta phụ thuộc rất nhiều bằng rất nhiều vào logic trong hàm loop của bạn. Logic càng phức tạp thì thời gian delta giữa 2 lần loop() càng lớn.
- Ở cuối hàm loop() ta sẽ gọi resetTick() để cập nhật lastTick = currentTick để cho phép lần loop() sau tính delta()
- WorkScheduler:
- Ý tưởng của tôi khi viết lớp này là tôi muốn viết 1 lớp để lên lịch làm việc cho 1 pin trong Arduino sau 1 khoảng thời gian nhất định.
- Ở lớp này tôi dùng còn trỏ hàm với dạng như sau void (*func)(int) có thể hiểu là đây là 1 hàm không trả về giá trị void và nhận 1 tham số là int là số pin trên Arduino mà ta muốn nó sẽ làm việc. Bạn có thể thay đổi tùy ý dựa trên nhu cầu làm việc của mình.
- Tham số đầu vào cho hàm dựng của WorkScheduler của tôi yêu cầu 3 tham số là: số pin sẽ phải làm việc, thời gian sẽ làm việc, con trỏ hàm định nghĩa việc sẽ làm.
- Hàm update() được gọi để cập nhật thời gian trôi qua, nếu thời gian trôi qua lờn hơn thời gian làm việc thì Pin sẽ phải làm việc rồi chúng ta sẽ reset lại thời gian trôi qua. Tại sao tôi không set là 0 mà lại dùng -= cho thời gian sẽ làm việc? Đó là do thời gian delta giữa các loop() không đều nhau dẫn đến thời gian trôi qua nhiều khi sẽ lố qua thời gian làm việc nên chúng ta sẽ có 1 cơ số thời gian dư thừa cần phải bù đắp lại cho lần làm việc sau, vì vậy tôi sẽ giữ lại những cơ số thừa đó cho những lần cập nhật sau để lịch làm việc chính xác hơn
Sau đây là chương trình mẫu của tôi là cho 1 pin làm việc bằng cách chớp tắt 1 LED và bạn hoàn toàn có thể thêm bao nhiêu cũng được. Tôi đã thử cho 3 LED hoạt động trong thời gian khác nhau và nó hoàn toàn chính xác.
const int pinRed = 8; WorkScheduler *redPinWorkScheduler; void OnRedPin_Work(int pin) { static boolean wasLightedUp = false; digitalWrite(pin, !wasLightedUp ? HIGH: LOW); wasLightedUp = !wasLightedUp; } void setup() { pinMode(pinRed, OUTPUT); Timer::getInstance()->initialize(); redPinWorkScheduler = new WorkScheduler(pinRed, 1000UL, OnRedPin_Work); } void loop() { Timer::getInstance()->update(); redPinWorkScheduler->update(); Timer::getInstance()->resetTick(); }Kết luận
Hi vọng bài viết này sẽ làm cho thời gian lập trình của các bạn trên Arduino thật hiệu quả.
Các dự án được truyền cảm hứng
HACK NÃO gửi vào Thứ
năm, 1 Tháng 9, 2016 - 12:41
- Xem thêm về Hướng dẫn sử dụng mạch nguồn cho breadboard - BREADBOARD XD-42
- 8371 lượt xem
Mạch nguồn cho breadboard XD-42 là một sản phẩm được thiết kế đơn giản dễ dàng sử dụng, cung cấp nguồn cho breadboard thích hợp cho nhiều loại thiết bị với hai loại nguồn ngõ ra chuẩn 5V và 3.3V Mạch có hỗ trợ thêm các header... Các bạn chơi breadboard thì nên chơi thêm con này như mình nhé.
Các bài viết cùng tác giả
Tham gia Group Facebook để trao đổi nhanh hơn với BQT và các tác giả!
Liên hệ Mr. Khánh 097.276.8491 để được tư vấn triển khai các dự án IoT
Liên hệ Mr. Đạt ZN 037.3998.468 tư vấn đồ án môn học
Liên hệ Mr. Thân 097.111.3732 để tư vấn thiết kế PCB chất lượng cao 2-40 lớp
Chia sẻ tình yêu với
Arduino
Hãy trở thành thành viên của Cộng đồng Arudino Việt Nam để mở khóa chức năng này.
Bạn ơi
Cùng đăng nhập vào Cộng đồng Arduino Việt Nam để mở hết các chức năng của Cộng đồng nhé.