Chương trình nút nhấn nâng cao

Một phần của tài liệu [GiaoTrinh]-MicrobitSmartHome (Trang 47 - 52)

Ở phần này, chúng ta sẽ hiện thực yêu cầu sau: mỗi lần nhấn nút sẽ đổi trạng thái của đèn LED: nếu đèn đang tắt thì sáng, ngược lại đèn đang sáng sẽ tắt đi. Trong yêu cầu này sẽ có 2 đoạn xử lý phức tạp. Đầu tiên, đó là việc hoán đổi tuần tự trạng thái của một bóng đèn. Thực ra, đây là yêu cầu rất thực tế trong các hệ thống tương tác bằng nút nhấn: đèn sẽ đổi từ sáng sang tắt, và ngược lại, mỗi khi nút được nhấn. Phát biểu theo ngôn ngữ lập trình, đèn sẽ đổi từ 1 sang 0 và ngược lại, mỗi khi có nút được nhấn.

Chúng ta sẽ hiện thực chức năng này, bằng cách khai báo một biếnled_statusđể lưu trạng thái của đèn. Ban đầu biến này bằng 0, và đèn sẽ tắt. Trong ngôn ngữ lập trình nói chung, để hoán đổi giá trị của biến này, chúng ta đơn giản là lấy 1 trừ đi chính nó. Lúc đó, khi biến này đang là 0, nó sẽ thành 1, và ngược lại, khi đang là 1 lại chuyển thành 0. Một chương trình con được tạo ra, đặt tên làsub_key_process,

hàm sẽ xử lý mỗi khi nút được nhấn, sẽ được hiện thực như sau:

Hình 5.6:Chương trình con hoán đổi trạng thái của đèn

Chương trình con sub_key_processsẽ được gọi khi nút được nhấn và trạng thái của đèn sẽ được điều khiển bằng câu lệnh digital write, với tham số là biếnled_status.

Tuy nhiên, khi nào một nút được nhấn, là vấn đề phức tạp tiếp theo trong phần này. Chúng ta hãy xem xét hình minh họa bên dưới:

Hình 5.7:Một tín hiệu trả về từ nút nhấn

Một nút nhấn, như đã trình bày ở phần đầu của hướng dẫn này, thường sẽ được thiết kế với tín hiệu mặc định (không nhấn) là mức điện áp cao. Khi nút được nhấn, tín hiệu sẽ thay đổi và chuyển xuống mức điện áp thấp. Tuy nhiên, do quá trình rung động của cơ khí, tín hiệu sẽ bị thay đổi liên tục từ cao xuống thấp trong khoảng tối đa, là 100ms.

Thực ra, vấn đề rung phím là bài toán rất kinh điển trong các ứng dụng thực tế. Cách giải quyết thông dụng nhất là định kì đọc dữ liệu từ nút nhấn. Nếu như 2 (hoặc nhiều hơn) lần đọc liên tiếp có giá trị giống nhau. Chúng ta mới xác nhận đó là dữ liệu hợp lệ, và mới bắt đầu xử lý. Đây là chức năng xử lý định kì, do đó nó sẽ được hiện thực trong vòngforever. Chương trình gợi ý sẽ như sau:

Hình 5.8:Đọc dữ liệu nhiều lần từ nút nhấn

Trong đoạn chương trình trên, cứ mỗi 20ms chúng ta sẽ đọc kết quả từ nút nhấn, và lưu kết quả 2 lần đọc liên tiếp trong 2 biến sốkey1 và key0. Khi 2 biến này bằng

nhau, chúng ta đã có thể xử lý. Thực ra, 10ms mới là con số tối ưu trong các hệ thống vi điều khiển. Tuy nhiên, với ngôn ngữ lập trình cấp cao như MakeCode,

10ms là quá nhỏ và khó có thể định thời được chính xác, nên chúng tôi đề xuất thời gian giữa 2 lần đọc phím là 20ms.

Vấn đề cuối cùng trong xử lý phím nhấn, là sau khi đã xử lý chống rung, chúng ta phải xử lý thêm việc nhấn đè từ phía người dùng. Hãy thử tượng tượng rằng, sau khi đã qua giai đoạn chống rung, và tín hiệu từ phím nhấn đang là 0. Người sử dụng nhấn đè nó trong 1 giây (1000ms), tức là đèn của chúng ta sẽ đổi trạng thái 50 lần trong 1 giấy (1000/20 = 50)!!

Do đó, chúng ta cần thêm 1 biến số mới, đặt tên làkey_process, dùng để lưu lại

giá trị sau cùng của nút nhấn sau khi đã chống rung. Tiếp theo, một khối lệnh điều kiện sẽ được sử dụng để biết nút vừa mới được nhấn (key_process 6= key1) hay đang nhấn đè. Ở đây, mỗi khi nhấn đè trong 1 giây, chúng tôi mới xử lý một lần. Một biếntime_outđược tạo ra, với giá trị giảm dần từ 50 cho đến 0, để xử lý cho việc nhấn đè trong vòng 1 giây. Chương trình hoàn thiện được trình bày bên dưới:

Hình 5.9:Hoàn thiện chương trình xử lý nút nhấn

Chương trình xử lý cho nút nhấn thực sự rất phức tạp, và nó tạo nên bản chất của các hệ thống vi điều khiển. Chương trình này được chia sẻ ở đường dẫn sau đây, để bạn đọc tiện tham khảo:

https://makecode.microbit.org/_4mmA4WHc1CVd

7 Câu hỏi ôn tập

1. Trong thiết kế đầy đủ của một nút nhấn, nó sẽ có thiết bị gì được thêm vào? A. Điện trở kéo lên

B. Điện trở kéo xuống C. Tụ điện kéo lên D. Tụ điện kéo xuống

2. Nếu nút nhấn không có thiết kế điện trở kéo lên, câu lệnh nào sau đây cần được sử dụng?

A. set pull pin to up B. set pull pin to down C. digital read pin D. digital write pin

3. Với điện trở kéo lên, ở trạng thái bình thường, giá trị đọc về từ nút nhấn là bao nhiêu?

A. 0 B. 1

C. Không xác định D. Tất cả đều sai

4. Với điện trở kéo lên, ở trạng nút được nhấn, giá trị đọc về từ nút nhấn là bao nhiêu?

A. 0 B. 1

C. Không xác định D. Tất cả đều sai

5. Để đọc dữ liệu từ nút nhấn, câu lệnh nào sẽ được sử dụng? A. analog read (adsbygoogle = window.adsbygoogle || []).push({});

B. analog write C. digital read D. digital write

6. Mặc định, nút nhấn cảm ứng ChiPi Touch trả về giá trị bao nhiêu? A. 0 B. 1 C. Không xác định D. Tất cả đều sai 7. Các vấn đề trong xử lý nút nhấn là gì? A. Tín hiệu bị rung B. Nhấn đè một phím C. Cả 2 vấn đề trên D. Tất cả đều sai Đáp án 1. A 2. A 3. B 4. A 5. C 6. A 7. C

CHƯƠNG 6

1 Giới thiệu

Từ bài hướng dẫn này, chúng ta sẽ làm việc với các thiết bị đầu vào, phức tạp hơn so với nút nhấn, gọi là các cảm biến. Một điều hiển nhiên, các dự án tự động nói chung đều dựa trên thông tin từ các cảm biến để đưa ra quyết định. Trong dự án nhà thông minh của giáo trình này, chúng ta sẽ bắt đầu làm việc với cảm biến rất căn bản trong môi trường trong nhà, đó là cảm biến Nhiệt độ và độ ẩm không khí.

Hình 6.1:Cảm biến Nhiệt độ và độ ẩm

Trong bài hướng dẫn, cảm biến DHT11 sẽ được sử dụng để cung cấp thông tin về nhiệt độ và độ ẩm không khí. DHT11 là một loại cảm biến rất phổ biến đối với các ứng dụng trong gia đình, với ưu điểm là giá thành thấp và sử dụng đơn giản. Đây là mô đun nhiều chức năng có thể đọc tín hiệu nhiệt độ và độ ẩm cùng lúc. Sensor sử dụng là DTH11 phù hợp cho những ứng dụng thông dụng trong gia đình. Dãy đo của cảm biến khá phù hợp trong môi trường bình thường không có biến động lớn, với độ ẩm trong khoảng 20 - 90% và nhiệt độ là 0 - 50°C. Cảm biến này được thiết kế với đầu ra tương thích hoàn toàn với mạch mở rộng ChiPi Base Shield. Các mục tiêu chính của bài hướng dẫn này như sau:

• Hiểu nguyên lý họt động của cảm biến DHT11.

• Lấy được dữ liệu nhiệt độ và độ ẩm từ cảm biến.

• Xây dựng được ứng dụng sử dụng cảm biến DHT11.

• Học sinh cấu trúc lại chương trình để phát triển trong bài sau.

Một phần của tài liệu [GiaoTrinh]-MicrobitSmartHome (Trang 47 - 52)