1. Trang chủ
  2. » Thể loại khác

Hướng dẫn lập trình Micro:bit nâng cao cho học sinh

47 82 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Hướng Dẫn Lập Trình Micro:bit Nâng Cao Cho Học Sinh
Tác giả Tiến Sĩ Lê Trọng Nhân
Trường học Đại học Bách Khoa thành phố Hồ Chí Minh
Thể loại giáo trình
Thành phố thành phố Hồ Chí Minh
Định dạng
Số trang 47
Dung lượng 6,43 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • Bài 1: Chương trình đầu tiên với ChiPi (4)
  • Bài 2: Điều khiển loa Buzzer (11)
  • Bài 3: Nhận dữ liệu từ nút nhấn (15)
  • Bài 4: Cảm biến cường độ ánh sáng (18)
  • Bài 5: Giới thiệu thư viện mở rộng cho MicroBit (22)
  • Bài 7: Tái cấu trúc chương trình đèn giao thông (32)
  • Bài 8: Hiện thực trụ đèn phụ (37)
  • Bài 9: Hiện thực trụ đèn phụ thứ 2 (41)
  • Bài 10: Tích hợp thêm dịch vụ cho dự án Đèn Giao Thông (44)

Nội dung

Chương trình đầu tiên với ChiPi

1 Giới thiệu về hệ thống ChiPi

Chipi Series là một hệ thống mô-đun điện tử dễ sử dụng, cho phép người dùng lắp ghép các mô-đun như một trò chơi So với phương pháp truyền thống sử dụng breadboard và linh kiện điện tử cơ bản, hệ thống ChiPi giúp đơn giản hóa quy trình học tập và tiết kiệm thời gian đáng kể trong việc tiếp cận và sử dụng các dự án điện tử.

Hình 1: MicroBit ChiPi Base Shield: Kết nối các mô-đun khác với mạch

Hệ thống Chipi bao gồm một MicroBit ChiPi Base Shield và nhiều mô-đun cảm biến, trong đó Base Shield đóng vai trò là mạch trung gian kết nối các mô-đun Chipi với MicroBit Mỗi mô-đun Chipi thực hiện một chức năng riêng biệt, từ nút nhấn đơn giản đến bộ cảm biến nhịp tim phức tạp Các mô-đun được thiết kế theo chuẩn kết nối đồng nhất, giúp người dùng dễ dàng kết nối nhiều mô-đun khác nhau trong cùng một ứng dụng mà không cần phải lo lắng về việc kết nối nhiều dây với các tiêu chuẩn khác nhau.

Lưu ý quan trọng: Màn hình củ a m ạ ch MicroBit quay v ề phía các chân kế t n ố i

• Làm quen với hệ thống cảm biến ChiPi

• Kết nối được MicroBit và mạch ChiPi LED

• Hiện thực được chương trình đầu tiên với mạch

• Có thể lưu và mở lại chương trình cũ

1 Giới thiệu về hệ thống ChiPi

2 Mô trường lập trình cho MicroBit

3 Chương trình đầu tiên (10 phút)

Hình 2: Hệ thống kết nối MicroBit thông thường với breadboard

Hệ thống ChiPi cho MicroBit được xây dựng chủ yếu để giải quyết vấn đề kết nối khó khăn với các chân mở rộng trên mạch MicroBit, nơi người dùng thường chỉ có thể sử dụng 3 chân P0, P1 và P2 Mặc dù có nhiều dự án ấn tượng trong cộng đồng, việc mở rộng chức năng vẫn gặp nhiều khó khăn.

Bên cạnh ChiPi Base Shield, các mô-đun cảm biến Chipi cung cấp "giác quan" cho hệ thống điện tử của bạn Chúng cho phép đo đạc và phát hiện các yếu tố môi trường như nhiệt độ, ánh sáng, độ ẩm, từ đó giúp bạn biểu đồ hóa, phân tích và điều khiển thiết bị một cách linh hoạt, phù hợp với từng điều kiện.

Trong giáo trình này, chúng tôi sẽ hướng dẫn sử dụng 4 mô-đun sau đây

• LED: Đây là mô-đun cơ bản nhất trong hệ thống Mô-đun này có thể điều khiển để hiện thị được

3 màu: Đỏ Xanh và Vàng

• Buzzer: Loa báo động, có thể được dùng để phát ra âm thanh cảnh báo

• Button: Nút nhấn, đây cũng là một trong những mô-đun căn bản nhận tương tác từ người dùng

Cảm biến ánh sáng, hay còn gọi là quang trở, hoạt động dựa trên nguyên lý quang học, mang lại độ chính xác cao hơn so với cảm biến nội bộ của MicroBit.

Bài viết này sẽ hướng dẫn bạn cách lập trình một hệ thống đèn giao thông thông minh bằng cách kết hợp các mô-đun Hướng dẫn được chia thành hai phần: phần đầu giới thiệu các hướng dẫn cơ bản để sử dụng các mô-đun, trong khi phần hai sẽ trình bày cách kết hợp các mô-đun này để tạo ra một ứng dụng giao thông thông minh.

Trong bài hướng dẫn đầu tiên này, chúng ta sẽ làm việc với module đơn giản nhất, có tên là LED ChiPi

Chương trình lập trình trực tuyến MakeCode trên máy tính, có thể truy cập tại https://makecode.microbit.org/, là một lựa chọn hàng đầu cho việc lập trình MicroBit Một trong những ưu điểm nổi bật của MakeCode là khả năng mô phỏng chương trình trước khi nạp vào mạch MicroBit, giúp tiết kiệm thời gian kiểm tra và đảm bảo tính chính xác của mã nguồn.

Chọn vào mục New Project ở Hình 3, giao diện sau đây sẽ hiện ra để chúng ta có thể bắt đầu lập trình

Một trong những ưu điểm nổi bật của lập trình trên máy tính là quá trình nạp chương trình vào mạch MicroBit rất đơn giản Chỉ cần sao chép file hex vào mạch MicroBit giống như cách sao chép dữ liệu vào USB, chương trình sẽ tự động chạy ngay trên mạch.

Trên Windows 10, người dùng có thể truy cập một môi trường lập trình ngoại tuyến sẵn có trên máy tính thông qua kho ứng dụng Microsoft Store từ nút Start.

Hình 5: Kho ứng dụng Microsoft Store trên Windows 10

Bước tiếp theo, chúng ta có thể gõ vào ô tìm kiếm (Search) ở góc trên bên phải từ khóa

“MakeCode” để tìm và cài đặt ứng dụng (nhấn vào nút Get) như hình bên dưới

Sau khi cài đặt xong, chúng ta có giao diện lập trình quen thuộc bên dưới sẽ hiện ra

Hình 7: Giao diện lập trình ngoại tuyển trên máy tính hệ điều hành Windows 10

Gần đây, việc lập trình cho MicroBit bằng điện thoại hoặc máy tính bảng ngày càng trở nên phổ biến nhờ tính tiện lợi Tuy nhiên, trong giáo trình này, chúng tôi sẽ chỉ tập trung vào việc sử dụng môi trường lập trình MakeCode trên máy tính.

Trong hướng dẫn này, chúng ta sẽ lập trình điều khiển mô-đun ChiPi LED, một mô-đun đèn tích hợp với 2 màu cơ bản là đỏ và xanh lá Khi cả hai đèn này cùng sáng, chúng ta sẽ có màu vàng Lưu ý vị trí của 2 chân LED1 và LED2, là 2 chân tín hiệu dùng để điều khiển đèn sáng hoặc tắt.

Hình 8: Mô-đun ChiPi LED

Chúng ta sẽ kết nối mô-đun LED với mô-đun Base Shield qua các chân P1, P0, GND và VCC Theo hình minh họa, LED0 được kết nối với chân P0 và LED1 với chân P1, giúp dễ dàng nhận biết qua màu dây kết nối.

Hình 9: Kết nối giữa mạch Base Shield và mạch ChiPi LED

Chúng ta có thể hiện thực một chương trình nhỏ, điều khiển chân P0 (được nối với LED0) để

Hình 10: Chương trình đầu tiên trên MicroBit với mạch mở rộng ChiPi

Trong chương trình, chúng ta đã sử dụng lệnh digital write để xuất tín hiệu ra chân P0, kết nối với chân LED0 của mô-đun LED ChiPi Lệnh này được tìm thấy trong phần Advance, Pins, như thể hiện trong Hình 11.

Hình 11: Câu lệnh digital wite, nằm trung mục Advance/Pins

Sau khi hoàn thành chương trình trên máy tính, chúng ta cần tải nó xuống board mạch MicroBit để kiểm tra kết quả Chương trình này khiến đèn LED chớp tắt mỗi giây với màu đỏ.

Với câu lệnh digital write sử dụng ở trên, chúng ta có 2 tùy chọn như sau:

• Chọn chân: Bằng cách nhấn vào phím mũi tên, chúng ta sẽ có rất nhiều chân để kết nối với các thiết bị bên ngoài, như trình bày ở Hình 12

Hình 12: Lựa chọn chân xuất tín hiệu trong câu lệnh digital write

• Chọn dữ liệu: Ở tùy chọn thứ 2 này, chúng ta chỉ có 2 trạng thái là 0 hoặc 1 Khi xuất ra giá trị

Chân P0 sẽ tương ứng với điện áp 0V cho giá trị 0 và 3.3V cho giá trị 1 Khi P0 được kết nối với một bóng đèn, nếu giá trị là 1, bóng đèn sẽ sáng, còn khi giá trị là 0, bóng đèn sẽ tắt.

1 Hiệu chỉnh lại chương trình, để LED chớp tắt mỗi giây với màu xanh

Gợi ý: Thay đổi chân P0 thành P1

Hình 13: Chương trình điều khiển LED xanh

2 Viết chương trình chuyển màu LED sau mỗi giây theo trình tự: Đỏ - Xanh – Vàng

Gợi ý: Xuất kết hợp đồng thời 2 chân P0 và P1 để điều khiển màu cho LED Ví dụ để có màu đỏ: P0 = 1 và P1 = 0, để có màu vàng thì P0 = 1 và P1 = 1

Hình 14: Chương trình điều khiển 3 màu của LED

3 Giáo viên cho học sinh thay đổi chân kết nối với mạch MicroBit và sửa lại chương trình cho phù hợp

Điều khiển loa Buzzer

1 Giới thiệu về loa Buzzer

ChiPi - Buzzer là mô-đun loa bíp trong hệ thống Chipi của ChipFC, với đầu ra là rào cắm 4 chân tương thích với Chipi Base Shield Mô-đun này cho phép người dùng dễ dàng tạo ứng dụng báo động âm thanh hoặc lập trình để phát nhạc theo ý muốn.

Hình 16: Mô-đun ChiPi Buzzer

Khi làm việc với mạch ChiPi Buzzer, cần chú ý đến các chân kết nối Ngoài hai chân nguồn là GND và VCC, chỉ có một chân tín hiệu được đánh dấu là SIGNAL Chân còn lại có ký hiệu NC, viết tắt của Not Connected, có nghĩa là không kết nối, là thuật ngữ phổ biến trong kết nối giữa các mạch điện tử.

Việc điều khiển loa rất đơn giản, giống như việc cho một đèn LED sáng lên ở bài trước Loa sẽ kêu khi tín hiệu xuất ra là

1 và sẽ không kêu nếu tín hiệu xuất ra là 0

2 Điều khiển Buzzer cơ bản

Dựa trên nguyên lý đã nêu, chúng ta sẽ phát triển một chương trình đơn giản để điều khiển Buzzer Trong ví dụ này, Buzzer sẽ được kết nối vào các chân VCC, GND, P2 và P3, như hình minh họa bên dưới.

Hình 17: Kết nối giữa Buzzer và mạch Base Shield

Dựa vào màu dây kết nối, chân tín hiệu điều khiển loa Buzzer được kết nối với chân P2 của MicroBit Chương trình đơn giản dưới đây sẽ khiến loa phát ra âm thanh trong 0,5 giây và tạm dừng trong 3 giây.

• Làm quen với hệ thống cảm biến ChiPi

• Hiểu được nguyên lý điều khiển loa ChiPi Buzzer

• Hiện thực được chương trình phát nhạc với MicroBit và ChiPi

• Phân biệt được 2 dạng xuất dữ liệu: digital và analog

2 Điều khiển Buzzer cơ bản

3 Điều khiển âm lượng của Buzzer

Hình 18: Chương trình điều khiển loa cơ bản

3 Điều khiển âm lượng của Buzzer

Câu lệnh set digital chỉ phát ra âm thanh với âm lượng tối đa (dữ liệu 1) hoặc tắt âm thanh (dữ liệu 0) Để điều chỉnh âm lượng cho ứng dụng thân thiện hơn với người sử dụng, chúng ta cần sử dụng câu lệnh analog write.

Hình 19: Câu lệnh set pwm để điều chỉnh điện áp xuất ra

Câu lệnh analog write bao gồm hai thông số: chân kết nối với Buzzer (trong hướng dẫn này là chân P2) và một danh sách giá trị từ 0 đến 1023 Bạn có thể chọn giá trị trực tiếp từ danh sách hoặc nhập một số mong muốn trong khoảng [0 – 1023] Trong chương trình gợi ý, âm lượng loa được giảm xuống còn 500 đơn vị bằng cách thay thế câu lệnh digital write bằng analog write Khi nạp chương trình này, âm lượng phát ra từ loa sẽ nhỏ hơn nhiều so với chương trình trước đó.

Hình 20: Điều chỉnh âm lương bằng câu lệnh analog write

Chi tiết hơn, câu lệnh digital write chỉ xuất là được 2 trạng thái là HIGH và LOW, tương ứng với

Câu lệnh set digital cho phép xuất dữ liệu đầu ra ở 2 mức điện áp tối đa 3V và tối thiểu 0V, trong khi câu lệnh analog write cho phép tinh chỉnh điện áp đầu ra từ 0V đến 3V với 1024 giá trị khác nhau Cụ thể, giá trị 0 tương ứng với 0V và giá trị 1023 tương ứng với 3V; ví dụ, để xuất 1.5V, ta sử dụng giá trị 512 Nhờ vào nhiều trạng thái đầu ra và mức điện áp gần nhau giữa các trạng thái, câu lệnh analog write còn được gọi là xuất dữ liệu ở dạng analog Với câu lệnh này, chúng ta có thể điều khiển âm lượng loa, độ sáng bóng đèn, và trong các hướng dẫn sau, còn có thể điều khiển tốc độ động cơ.

4 Chơi nhạc với ChiPi Buzzer

Hình 21: Các câu lệnh trong mục Music

Dựa trên nguyên lý của câu lệnh analog write, chúng ta có thể tạo ra âm thanh bằng cách xuất tín hiệu theo chu kỳ xác định Việc xuất dữ liệu này được hỗ trợ bởi câu lệnh play tone trong mục Music Chúng ta có thể hiện thực hóa chương trình để kiểm tra kết quả trên ChiPi Buzzer.

Bài viết này trình bày một ví dụ về cách điều khiển Buzzer phát ra âm thanh với tần số nhất định, cụ thể là đoạn nhạc mở đầu của bài "Happy Birthday", sử dụng nốt Đô chuẩn (Middle C).

Nốt D tương ứng với nốt Rê, nốt Middle G tương ứng với nốt Sol và nốt Middle F tương ứng với nốt Pha Câu lệnh play tone bao gồm hai thông số: nốt nhạc cần phát ra từ loa và thời gian ngân của nốt đó tính theo giây.

Chú ý: để sử dụng câu lệnh play tone này, loa phải được nối vào chính xác chân P0, như mô phỏng của

MakeCode ở Hình 21 Do đó, chúng ta cần phải kết nối giữa mạch ChiPi Buzzer với cổng VCC-GND- P0-P1 nếu muốn sử dụng câu lệnh play tone

Chúng ta có thể nâng cao trải nghiệm người dùng bằng cách thay thế âm thanh báo động đơn điệu bằng một bản nhạc thân thiện hơn Việc này không chỉ làm cho ứng dụng trở nên hấp dẫn mà còn cho phép người dùng thưởng thức một bản nhạc hoàn chỉnh trong quá trình sử dụng.

Tuy nhiên, MakeCode cũng hỗ trợ cho chúng ta những bản nhạc có sẵn, bằng cách sử dụng câu lệnh start melody, như ví dụ ở chương trình dưới đây:

Hình 23: Chương trình phát nhạc với các bài hỗ trợ sẵn trên MakeCode

Lưu ý rằng câu lệnh "start melody" không nên được đặt trong khối lệnh "forever", vì điều này sẽ dẫn đến việc bài nhạc được lặp lại ngay lập tức, khiến chúng ta chỉ nghe được một đoạn nhỏ.

Nhận dữ liệu từ nút nhấn

1 Giới thiệu về nút nhấn

Nút nhấn là thiết bị đầu vào cơ bản, cho phép nhận tương tác từ người dùng Mô-đun nút nhấn được thiết kế tương thích hoàn toàn với Base Shield ChiPi.

Hình 1: Mô-đun nút nhấn

Khi kết nối mô-đun vào mạch Base Shield, cần chú ý rằng chân của Arduino sẽ được kết nối với chân IN (hoặc SIG) của nút nhấn Như minh họa trong Hình 2, nút nhấn được nối với chân P0 và đèn LED1 (màu đỏ) sẽ được kết nối với chân P1.

Hình 2: Kêt nối nút nhấn và đèn LED vào hệ thống

2 Chương trình nút nhấn đơn giản

Trong đoạn này, chúng ta sẽ xây dựng một chương trình ngắn với chức năng điều khiển đèn Khi nút nhấn được kích hoạt, đèn sẽ sáng lên, trong khi ở trạng thái bình thường, đèn sẽ tắt Dưới đây là gợi ý cho chương trình.

• Làm quen với các thiết bị nhận dữ liệu

• Lấy được dữ liệu từ nút nhấn đơn giản

• Lập trình chống nhiễu cho nút nhất

• Xây dựng được ứng dụng sử dụng nút nhấn

1 Giới thiệu về nút nhấn (05 phút)

2 Chương trình nút nhấn đơn giản

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

Để lập trình nút nhấn đơn giản, chúng ta cần sử dụng câu lệnh "set pull pin P0 to up" trong phần "on start" để cấu hình chân nhập dữ liệu Câu lệnh này nằm trong mục Pins, chọn thêm "more" Để nhận dữ liệu, câu lệnh "digital read" là bắt buộc Cuối cùng, sử dụng câu lệnh điều kiện "if" để kiểm tra trạng thái nút nhấn, từ đó điều khiển đèn đỏ: khi nút nhấn được kích hoạt, đèn sẽ sáng, ngược lại, đèn sẽ tắt.

Trong chương trình nút nhấn nâng cao này, chúng ta sẽ cải tiến chức năng điều khiển đèn LED Mỗi lần nhấn nút, trạng thái của đèn LED sẽ thay đổi: nếu đèn đang tắt, nó sẽ bật sáng, và nếu đèn đang sáng, nó sẽ tắt Chúng ta sẽ tập trung vào phần đầu tiên của chương trình để thực hiện yêu cầu này.

Để điều khiển bóng đèn, chúng ta cần nhấn nút và chờ cho đến khi nút được thả ra Trước khi kiểm tra trạng thái của nút nhấn, cần đợi một khoảng thời gian ngắn để tín hiệu ổn định, như mô phỏng trong Hình 4.

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

Thời gian từ khi nút được nhấn cho đến khi tín hiệu ổn định có thể kéo dài đến 100ms do các rung động cơ khí Để lưu trạng thái của đèn LED, chúng ta cần tạo một biến, có thể đặt tên là "Trạng thái đèn LED".

Chương trình gợi ý của chúng ta như sau

Hình 5: Chương trình đổi trạng thái của đèn khi nhấn nút

Trong MakeCode, do không có câu lệnh "đợi cho đến khi", chúng ta sử dụng câu lệnh "while do" để đạt được chức năng tương tự Điều này có nghĩa là khi nút được nhấn, không có hành động nào xảy ra Các câu lệnh tiếp theo chỉ được thực hiện khi nút được thả ra, tức là chờ cho đến khi nút nhấn được thả thì mới tiếp tục thực hiện các câu lệnh.

Thay vì sử dụng nút nhấn cơ truyền thống, chúng ta có thể sử dụng nút nhấn cảm ứng ChiPi Touch, được thiết kế với chuẩn đầu ra tương tự như nút nhấn thông thường Hình ảnh của mô-đun này được trình bày bên dưới.

Hình 6: Nút nhấn cảm ứng ChiPi Touch

Chỉ cần thay thế nút nhấn cơ bằng nút nhấn cảm ứng, chương trình vẫn hoạt động bình thường Đây là ưu điểm nổi bật của hệ thống ChiPi với các mô-đun tương thích cao và dễ dàng thay thế lẫn nhau.

Cảm biến cường độ ánh sáng

1 Giới thiệu về cảm biến ánh sáng

Cảm biến ánh sáng trong hướng dẫn này hoạt động dựa trên nguyên lý của quang trở, một loại điện trở có trở kháng thay đổi theo cường độ ánh sáng Khi cường độ ánh sáng thay đổi, điện áp đầu ra của cảm biến cũng sẽ thay đổi tương ứng.

Hình 24: Mô-đun cảm biến ánh sáng

Mạch MicroBit đã tích hợp sẵn cảm biến cường độ ánh sáng, nhưng việc áp dụng vào thực tế gặp nhiều khó khăn Nguyên nhân là do 25 bóng đèn trên mạch MicroBit đóng vai trò chính trong việc cảm nhận ánh sáng, khiến cho việc lắp đặt trong ứng dụng thực tiễn trở nên phức tạp Hơn nữa, công nghệ cảm biến của MicroBit có chi phí cao hơn so với công nghệ quang trở, làm giảm khả năng ứng dụng của nó.

Do đó, cảm biến dựa trên quang trở thích hợp để triển khai cho các ứng dụng thực tế hơn

Khác với nút nhấn chỉ có hai trạng thái LOW và HIGH, cảm biến ánh sáng cung cấp 1024 trạng thái khác nhau, dẫn đến việc dữ liệu từ nút nhấn được gọi là dữ liệu digital, trong khi dữ liệu từ cảm biến ánh sáng là dữ liệu analog Bài viết này sẽ mô phỏng ứng dụng bật tắt đèn tự động: khi trời tối, đèn tự động bật sáng và tắt khi có ánh sáng để tiết kiệm điện Cần lưu ý rằng cảm biến có thể bị nhiễu bởi ánh đèn ô tô khi trời tối.

• Làm quen với các thiết bị nhận dữ liệu

• Hiểu được khái niệm và dữ liệu tương tự (dữ liệu analog)

• Lấy được dữ liệu từ cảm biến ánh sáng

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

1 Giới thiệu về cảm biến ánh sáng

2 Chương trình đọc dữ liệu từ cảm biến

3 Phát triển ứng dụng điều khiển đèn

Hình 25: Kêt nối cảm biến ánh sáng và đèn LED vào hệ thống

Một gợi ý cho việc kết nối các phần cứng trong yêu cầu của bài này là sử dụng cảm biến ánh sáng nối vào chân P0, trong khi đèn điều khiển được kết nối vào chân P1 và P2, như thể hiện trong Hình 25.

2 Chương trình đọc dữ liệu từ cảm biến

Dữ liệu từ cảm biến được trả về dưới dạng analog, vì vậy chúng ta sẽ sử dụng câu lệnh "analog read pin" Dưới đây là chương trình kiểm tra đơn giản đầu tiên.

Chương trình đọc dữ liệu từ cảm biến ánh sáng sẽ xuất kết quả ra màn hình 25 đèn LED mà không sử dụng câu lệnh led enable false Để tối ưu hóa, việc xuất dữ liệu sẽ diễn ra sau mỗi nửa giây thay vì liên tục.

Chúng ta có thể kiểm tra sự thay đổi cường độ ánh sáng bằng cách dùng ngón tay bịt quang, khiến giá trị hiển thị giảm đáng kể Đồng thời, cần thống kê giá trị cảm biến trong điều kiện sáng và tối để chuẩn bị dữ liệu cho phần lập trình tiếp theo.

Giáo viên yêu cầu học sinh thực hiện bài tập đo lường, trong đó các em sẽ ghi lại giá trị của cảm biến 10 lần khi trời sáng và 10 lần khi trời tối Sau khi thu thập dữ liệu, học sinh sẽ tính toán giá trị trung bình cho cả hai trạng thái ánh sáng này.

3 Phát triển ứng dụng điều khiển đèn

Trong phần này, chúng ta sẽ phát triển ứng dụng tự động bật đèn dựa vào điều kiện ánh sáng, minh họa cho việc điều khiển đèn đường tự động Đèn sẽ tự động sáng khi trời tối (khi cảm biến ghi nhận 200 đơn vị) và tắt khi trời sáng (khi cảm biến ghi nhận 500 đơn vị) Chúng ta sẽ thiết lập một ngưỡng trung bình, ví dụ như 350, để quyết định việc bật tắt đèn Chương trình đơn giản ban đầu sẽ được xây dựng dựa trên các điều kiện này.

Hình 27: Chương trình gợi ý cho việc bật tắt đèn

Không cần kiểm tra điều kiện liên tục, nên câu lệnh đợi 2 giây được sử dụng ở cuối chương trình, tuy nhiên điều này có thể làm giảm độ nhạy của hệ thống Trong trường hợp xấu nhất, khi che cảm biến lại, đèn sẽ tắt sau 2 giây Dù vậy, đối với một ứng dụng thực tế, điều này là bình thường.

Để cải thiện hiệu suất của hệ thống kiểm tra cảm biến ánh sáng, cần phải xem xét việc tắt đèn khi có ánh đèn xe ô tô chiếu vào Để tránh tình trạng tắt đèn không hợp lý trong điều kiện thực tế, chúng ta sẽ khai báo thêm biến số counter_light, với giá trị tăng lên 1 đơn vị mỗi khi có ánh sáng Chỉ khi giá trị của biến này vượt quá 5 đơn vị, hệ thống mới quyết định bật đèn Mặc dù việc này làm giảm độ nhạy của hệ thống trong khoảng thời gian 10 giây, nhưng nó sẽ giúp loại bỏ hiện tượng ánh sáng nhiễu từ đèn ô tô giao thông.

Chương trình gợi ý cho chức năng cải tiến này được trình bày Hình 28 Cần lưu ý là phải gán biến này về 0 khi trời tối

Trước khi bật đèn ô tô, cần đảm bảo trời đã tối để tránh hiện tượng nhiễu Một số trường hợp nhiễu có thể xảy ra khi vật lạ vướng vào cảm biến Để xử lý tình huống này, chúng ta sẽ khai báo một biến số mới, gọi là counter_dark, trong chương trình hiệu chỉnh.

Hình 29: Chương trình loại bỏ nhiễu cho cả 2 trường hợp

Giáo viên có thể cho học sinh làm trường hợp thứ 2 như 1 bài tập về nhà.

Giới thiệu thư viện mở rộng cho MicroBit

Giới thiệu về lập trình NPNBot, chúng tôi cung cấp bộ thư viện chuyên biệt cho Robot NPNBot, giúp người dùng dễ dàng tiếp cận Để thêm thư viện này, từ cửa sổ lập trình, chọn mục Advanced và sau đó chọn Extensions, như được minh họa trong Hình 1.

Hình 1: Thêm thư viện mở rộng

Giao diện hiển thị cho phép người dùng thêm thư viện Để sử dụng NPNBot, cần nhập chính xác đường liên kết https://github.com/chipfc/NPNBot vào ô tìm kiếm và nhấn nút Tìm kiếm Kết quả tìm kiếm sẽ xuất hiện, cho phép người dùng nhấn vào để tự động thêm thư viện NPNBot vào cửa sổ lập trình.

• Làm quen với NPNBot – Robot dựa trên MicroBit

• Sử dụng được thư viện hỗ trợ cho MicroBit

• Viết được chương trình cơ bản trên NPNBot

• Nạp được chương trình và cho

Robot vận hành cơ bản

• Làm quen với bộ thư viện cho nhà thông minh

2 Chương trình điều khiển động cơ

3 Nạp chương trình cho Robot (10 phút)

5 Thư viện cho Nhà thông minh (15 phút)

Hình 2: Giao diện thêm thư viện mở rộng trên MicroBit

Hình 3: Kết quả tìm kiếm thư viện NPNBot

Hình 4: Thư viện NPNBot đã được thêm vào cửa sổ lập trình

Trong chương trình đầu tiên, chúng ta sẽ tập trung vào câu lệnh điều khiển tốc độ của hai động cơ trên Robot, như được thể hiện trong Hình 5.

Câu lệnh yêu cầu hai tham số đầu vào là tốc độ của bánh trái và bánh phải, tương ứng với động cơ M1 và M2 Người dùng có thể nhập giá trị số hoặc điều chỉnh tốc độ bằng cách kéo thanh trượt Khi tốc độ được nhập là số dương, động cơ sẽ quay về phía trước, trong khi nếu là số âm, động cơ sẽ quay lùi.

Để đảm bảo dữ liệu được xuất chính xác ra các chân mở rộng của MicroBit, cần tắt chức năng hiển thị trên màn hình 25 bóng đèn của thiết bị Điều này có thể thực hiện bằng cách sử dụng câu lệnh "led enable false" trong phần more của khối lệnh Led, như được minh họa trong Hình 6.

Hình 6: Tắt màn hình hiển thị 25 LED của MicroBit

Chúng ta có thể phát triển một chương trình đơn giản để kiểm tra hai động cơ, như được minh họa trong Hình 7 Chương trình sẽ điều khiển hai bánh xe di chuyển tới trong 2 giây, sau đó lùi lại trong 2 giây, dừng lại trong 2 giây và lặp lại chu trình này.

Hình 7: Chương trình kiểm tra 2 động cơ

Hình 8: Tắt công tắt nguồn từ USB để nạp chương trình

Khi chương trình đã nạp xong, chúng ta có thể rút dây kết nối USB, bật công tắc nguồn để thử chương trình

Việc tắt nguồn từ PIN là rất quan trọng khi nạp chương trình từ điện thoại, vì chúng ta cần chuyển mạch MicroBit sang chế độ Bluetooth Trong chế độ này, mạch sẽ phát xung liên tục ra các chân mở rộng, ảnh hưởng lớn đến độ bền của động cơ Để đảm bảo an toàn, luôn tắt nguồn khi nạp và chỉ mở nguồn điện sau khi nạp thành công.

4 Phát triển dự án Robot

Với sự trợ giúp từ thư viện lập trình NPNBot, chúng ta có thể triển khai một dự án điều khiển không dây cho Robot, như được thể hiện trong hình bên dưới.

Hình 9: Mô hình điều khiển không dây giữa mạch MicroBit và Robot

Chúng ta sẽ quy ước rằng các "thông điệp" từ mạch MicroBit tới Robot sẽ được thể hiện dưới dạng các con số, mỗi con số sẽ tương ứng với một chức năng cụ thể.

Với những quy ước như trên, chương trình dành cho Robot sẽ như hình bên dưới:

Hình 300: Chương trình cho NPNBot: Xử lý trong hàm nhận dữ liệu on radio received number

Có 3 điều cần lưu ý về chương trình này:

Để thiết lập giao tiếp không dây, chỉ những mạch cùng nhóm mới có thể trao đổi dữ liệu Việc chỉnh nhóm được thực hiện bằng câu lệnh set radio group chỉ cần thực hiện một lần và nên được đặt trong khối lệnh on start.

Để thực thi việc di chuyển trong hàm nhận số từ radio, chúng ta cần xử lý dữ liệu số trong hàm này Sau khi hoàn thành, chúng ta có thể nạp chương trình cho Robot Lưu ý rằng trước khi nạp chương trình, cần phải tắt nguồn điện từ PIN.

Nguyên lý của chương trình bên GamePad rất đơn giản, làm sao để gửi được 5 con số, tương ứng với

Chương trình này cho phép người dùng sáng tạo nhiều phiên bản khác nhau dựa trên 5 hành vi từ người điều khiển Việc xác định thời điểm truyền số 0 hay số 1 (đi tới) sẽ quyết định cách thức hoạt động của chương trình.

Để tuân thủ quy ước giao tiếp không dây, chúng ta cần điều chỉnh nhóm cho chương trình GamePad trong khối lệnh "on start" tương tự như nhóm của Robot.

Hình 11: Chương trình điều khiển GamePad

Với chương trình gợi ý, nhấn nút A để tiến và nút B để lùi; nhấn cả hai nút A và B cùng lúc để dừng Robot Để thực hiện các thao tác rẽ trái hoặc phải, người dùng chỉ cần nghiêng mạch MicroBit tương ứng sang trái hoặc phải.

Việc điều khiển không hề đơn giản và thuận tiện, vì vậy người dùng cần tự xác định cách thức điều khiển phù hợp nhất với bản thân.

5 Thư viện cho Nhà thông minh

Tái cấu trúc chương trình đèn giao thông

Chương trình hiện tại chỉ hiển thị đèn đỏ, cho thấy những hạn chế trong việc thực hiện các chức năng khác.

Hình 37: Chương trình điều khiển cho đèn đó ở bài trước

Trong chương trình này, chúng ta sử dụng vòng lặp while để thực hiện chức năng đếm lùi trong 7 giây, với mỗi lần lặp mất 1 giây do có câu lệnh đợi Khi đèn đỏ đang đếm lùi, không thể thực hiện thêm tác vụ nào khác với mạch MicroBit Nếu muốn kiểm tra xem người đi bộ có nhấn nút để xin đi qua đường hay không, điều này gần như không khả thi, vì chương trình chỉ nhận tín hiệu khi nút được nhấn trong 7 giây, sau khi kết thúc vòng lặp while.

Hiện tượng block trong lập trình, đặc biệt trong các hệ thống mạch điện tương tác với người dùng, gây ra nhiều vấn đề không tốt Để khắc phục hiện tượng này, cần tuân thủ một số quy ước nhất định.

• Không được sử dụng bất kì câu lệnh lặp nào nữa, chủ yếu là các câu lệnh while và repeat

• Không được sử dụng bất kì câu lệnh pause nào trong chương trình, ngoại trừ duy nhất 1 câu lệnh pause(100) ở cuối vòng forever

• Nắm được nhược điểm của kiến trúc cũ

• Tái cấu trúc được chương trình mới tối ưu hơn

• Hiểu được luồng thực thi của chương trình

• Tích hợp được khả năng gửi dữ liệu không dây giữa các trụ đèn

1 Hạn chế của chương trình hiện tại

2 Hiện thực đèn xanh và đèn đỏ

3 Gửi tín hiệu cho các trụ đèn khác

Với yêu cầu như trên, chương trình của chúng ta sẽ có cấu trúc ban đầu như sau:

Hình 38: Cấu trúc chương trình mới

Bài tập trên lớp: Hãy hiện thực lại chức năng của đèn đỏ, nhưng không được sử dụng câu lệnh while và câu lệnh pause

Gợi ý: Chúng ta sẽ tạo thêm 1 biến counter để đếm, khi biến này có giá trị là 10, tức là đã qua 10 lần của 100ms, nghĩa là 1 giây

Dưới đây là một chương trình để điều khiển đèn màu đỏ nhưng không sử dụng câu lệnh đợi (pause) và lệnh trong nhóm lặp (while)

Hình 39: Chương trình cho đèn màu đỏ

Để tạo hiệu ứng thời gian trong chương trình, cần khai báo biến và kiểm tra điều kiện của nó Trong câu lệnh if đầu tiên, điều kiện counter_timer = 10 được sử dụng để thiết lập hiệu ứng đợi trong 1 giây Câu lệnh if thứ hai kiểm tra khi chu kỳ của đèn đỏ kết thúc, với điều kiện counter_red = -1 để giá trị 0 hiển thị trong 1 giây Cuối cùng, chương trình điều khiển đèn đỏ được đóng gói trong hàm RED_LIGHT như hình bên dưới.

Hình 40: Chương trình cho đèn đỏ được rút gọn trong hàm RED_LIGHT

Khi điều kiện if được thỏa mãn, chúng ta thường thực hiện một số tác vụ và gán lại giá trị cho các biến đếm, nhằm khởi động một chu kỳ mới.

2 Hiện thực đèn xanh và đèn đỏ

Chúng ta sẽ làm tương tự với trường hợp đèn xanh, cũng tạo ra 1 biến số counter_green và hiện thực hàm GREEN_LIGHT như sau:

Hình 41: Chương trình cho đèn xanh

Chúng ta không thể trực tiếp gọi chương trình điều khiển đèn màu xanh trong khối forever, vì các chương trình con này không có khả năng chờ đợi lẫn nhau như lệnh while trong bài học trước.

Hình 42: Chương trình cho 2 màu đèn được phân chia bằng giá trị của biến status

Lưu ý rằng việc gán giá trị cho biến status cần được thực hiện ở cuối mỗi hàm RED_LIGHT và GREEN_LIGHT Chương trình sẽ chuyển sang trạng thái mới chỉ khi trạng thái cũ đã hoàn thành chức năng của nó.

Khi thay đổi giá trị của status trong khối "on start" thành 1, đèn màu xanh sẽ được kích hoạt trước, sau đó là đèn đỏ, và chương trình sẽ lặp lại Điều này cho thấy status đóng vai trò là điểm khởi đầu cho một trạng thái, và chương trình sẽ chạy tương ứng với trạng thái đó Việc chuyển đổi giữa các trạng thái phụ thuộc vào từng ứng dụng cụ thể Tương tự, chúng ta có thể hiện thực hóa chương trình với đèn màu vàng.

Hình 43: Chương trình đèn giao thông đầy đủ với 3 trạng thái

Hình 44: Chương trình đèn giao thông đầy đủ với 3 trạng thái

3 Gửi tín hiệu cho các trụ đèn khác

Với tính năng gửi trạng thái hệ thống trong hàm forever, các trụ đèn sẽ tự động điều chỉnh màu sắc tương ứng khi nhận giá trị này Điều này mang lại lợi thế lớn cho việc thiết kế chương trình theo trạng thái, giúp quản lý và giao tiếp trở nên thuận lợi hơn Cần lưu ý rằng việc chỉnh nhóm trong khối on start là rất quan trọng, vì chương trình chỉ hoạt động hiệu quả trong khối on start và forever.

Hình 45: Hoàn thiện chương trình với tính năng giao tiếp không dây

Hiện thực trụ đèn phụ

Chương trình mạch chủ hiện tại bao gồm các câu lệnh quan trọng cần được xem xét kỹ lưỡng.

• Nắm được nhược điểm của kiến trúc cũ

• Tái cấu trúc được chương trình mới tối ưu hơn

• Hiểu được luồng thực thi của chương trình

• Tích hợp được khả năng gửi dữ liệu không dây giữa các trụ đèn

1 Sơ lược về chương trình mạch chủ

2 Hiện thực trụ đèn phụ thứ nhất

3 Chuyển trạng thái ở trụ đèn phụ

4 Xử lý lỗi mất đồng bộ giữa 2 trụ đèn

Hình 46: Chương trình trụ đèn chủ

Chương trình của chúng ta hoạt động dựa trên trạng thái, tức là giá trị của biến status Các câu lệnh gán giá trị cho biến này được thực hiện trong những khối lệnh quan trọng sau đây.

Giá trị khởi động trong chương trình xác định trạng thái đèn giao thông: giá trị 0 tương ứng với đèn đỏ, 1 cho đèn xanh, và 2 cho đèn vàng Nếu gán giá trị khác như 3, chương trình sẽ không hoạt động.

• Hàm RED_LIGHT: khi chạy xong chu kì của đèn đó, biến này được gán lại giá trị là 1, để chuyển sang chu kì của đèn xanh

Hàm GREEN_LIGHT hoạt động giống như đèn giao thông, sau khi hoàn thành chu kỳ của đèn xanh, nó được gán giá trị 2 để khởi động chu kỳ mới cho đèn vàng.

• Hàm YELLOW_LIGHT: Cuối cùng, khi xong đèn vàng, nó được gán trở lại bằng 0, để quay lại đèn đỏ

Chúng ta sẽ lắp đặt một trụ đèn phụ đối diện với trụ đèn chính tại ngã tư, đảm bảo rằng trụ đèn này hiển thị trạng thái giống hệt như trụ đèn chủ.

2 Hiện thực trụ đèn phụ thứ nhất

Trụ đèn phụ không cần sáng đèn khi mới bật nguồn Chúng ta có thể điều chỉnh câu lệnh trong hàm on start để giá trị ban đầu của trụ đèn là 4, với quy ước rằng trụ đèn sẽ không hoạt động khi ở trạng thái này.

Khi đèn phụ đã hoàn thành thời gian hiển thị đèn đỏ, nó không cần chuyển sang đèn xanh để đồng bộ với trụ đèn chính Chúng ta cũng sẽ điều chỉnh lại các câu lệnh RED_LIGHT, GREEN_LIGHT và YELLOW_LIGHT Chương trình của chúng ta sẽ được cập nhật như sau:

Hình 47: Thay đổi các câu lệnh chuyển trạng thái cho đèn phụ thứ nhất

Lưu ý rằng đèn phụ chỉ nhận lệnh từ đèn chính và phải thuộc cùng nhóm Radio Ngoài ra, câu lệnh gửi dữ liệu không dây trong khối forever ở đèn phụ cần phải loại bỏ, vì nó chỉ hoạt động ở chế độ nhận dữ liệu.

3 Chuyển trạng thái ở trụ đèn phụ

Khi nạp vào đèn phụ, sẽ không có hiện tượng gì xảy ra vì trạng thái ban đầu được gán là 4, và không có hàm nào được gọi với giá trị trạng thái 4 Việc chuyển trạng thái của trụ đèn phụ sẽ được thực hiện trong hàm nhận dữ liệu.

Hình 48: Chuyển trạng thái ở đèn phụ

Khi bật đèn phụ, ban đầu nó sẽ không hiển thị gì Tuy nhiên, khi đèn chính được kích hoạt, đèn phụ sẽ nhận trạng thái từ đèn chính và hoạt động đồng bộ với nó.

4 Xử lý lỗi mất đồng bộ giữa 2 trụ đèn

Lỗi mất đồng bộ xảy ra khi dữ liệu không được gửi thành công từ đèn chủ đến đèn phụ, dẫn đến việc đèn phụ nhận dữ liệu muộn 100ms Mặc dù thời gian này có vẻ nhỏ, nhưng khi hiển thị 25 đèn, sự chậm trễ này có thể kéo dài đến nửa giây, dễ dàng nhận thấy Để khắc phục, cần đồng bộ lại toàn bộ hệ thống khi giá trị receiveNumber khác với giá trị status Chúng ta sẽ thực thi lại các lệnh trong khối lệnh on start, và chương trình trong khối nhận dữ liệu không dây sẽ được cập nhật tương ứng.

Hình 49: Chương trình hoàn chỉnh, với các câu lệnh mới để đồng bộ

Trong quá trình nhận dữ liệu không dây, chúng ta cần chú ý đến các câu lệnh để kiểm tra giá trị vừa nhận (biến receivedNumber) so với trạng thái hiện tại (biến status) Nếu hai giá trị này khác nhau, chúng ta sẽ đồng bộ lại toàn bộ trạng thái của hệ thống bằng cách thiết lập lại giá trị của các biến về trạng thái ban đầu Cuối cùng, giá trị nhận được sẽ được gán cho biến trạng thái Sau khi thực hiện các bước này, chúng ta có thể bật nguồn hoặc mạch điện để kiểm tra việc thực thi chương trình hai bên, cho thấy rằng chúng hoạt động tương tự về mặt hiển thị.

Học sinh cần hiện thực hóa chức năng cho trụ đèn đối diện, trong đó trạng thái của đèn phụ sẽ ngược lại với hai trụ đèn chính Cụ thể, khi trụ đèn chính có màu đỏ, đèn phụ sẽ chuyển sang màu xanh và sau đó tự động chuyển sang màu vàng Khi trụ đèn chính có màu vàng, đèn phụ sẽ không thay đổi Cuối cùng, khi trụ đèn chính có màu xanh, đèn phụ sẽ chuyển sang màu đỏ.

Hiện thực trụ đèn phụ thứ 2

Chương trình mạch phụ được trình bày ở trụ phụ thứ nhất có cấu trúc đơn giản, tương tự như trụ chính Trong khi đó, trụ phụ thứ hai và thứ ba lại hiển thị thông tin gần như trái ngược với trụ chính Dưới đây là thống kê chức năng của các trụ này.

• Khi trạng thái là 0 (Trụ chính đang đỏ): Trụ phụ sẽ hiển thị đèn xanh

• Khi trạng thái là 1 (Trụ chính đang xanh): Trụ phụ sẽ hiển thị đèn đỏ

Khi trạng thái là 2 (trụ chính đang vàng), trụ phụ không thực hiện bất kỳ hành động nào và vẫn tiếp tục hiển thị màu đỏ, vì nó đang trong chu kỳ của đèn màu đỏ.

• Trụ phụ khi hoạt động hết chu kì xanh, sẽ tự động chuyển sang vàng mà không chờ lệnh từ trụ chính

Với 4 chức năng đã nêu, 3 chức năng đầu sẽ được thực hiện trong khối lệnh forever, trong khi chức năng cuối cùng sẽ yêu cầu thay đổi câu lệnh chuyển trạng thái trong hàm GREEN_LIGHT.

Dưới đây là chương trình của trụ phụ, đặt đối diện với trụ chính:

• Nắm được nhược điểm của kiến trúc cũ

• Tái cấu trúc được chương trình mới tối ưu hơn

• Hiểu được luồng thực thi của chương trình

• Tích hợp được khả năng gửi dữ liệu không dây giữa các trụ đèn

1 Sơ lược về chương trình mạch phụ bài trước

2 Hiện thực trụ đèn phụ thứ hai

3 Chuyển trạng thái từ xanh sang vàng

Hình 50: Chương trình trụ đèn chủ

2 Hiện thực trụ đèn phụ thứ hai

Để đảm bảo chương trình hoạt động hiệu quả, chúng ta cần gọi hàm với các giá trị trạng thái chính xác trong khối lệnh forever Dưới đây là mã chương trình cho trụ đèn phụ này.

3 Chuyển trạng thái từ xanh sang vàng

Khác với trụ phụ thứ nhất, trụ thứ 2 sẽ tự động chuyển sang màu vàng sau khi kết thúc màu xanh và chờ tín hiệu từ trụ chủ Cuối hàm GREEN_LIGHT, chúng ta sẽ có một câu lệnh để thay đổi trạng thái thành 3, giá trị để hệ thống chuyển sang màu vàng.

Hình ảnh toàn bộ chương trình cho trụ đèn phụ này sẽ như sau:

Hình 52: Tự chuyển sang đèn vàng sau khi hết đèn xanh

Lợi thế của việc tổ chức chương trình theo kiến trúc này là khả năng thay đổi nhanh chóng, chỉ cần điều chỉnh trạng thái của biến status tại vị trí phù hợp.

Tích hợp thêm dịch vụ cho dự án Đèn Giao Thông

dự án Đèn Giao Thông

Với những hướng dẫn ở bài trước, chúng ta cần phải tuân thủ

2 nguyên tắc lập trình trên phần cứng, như sau:

• Không sử dụng các câu lệnh lặp, sử dụng thêm biến để tạo hiện ứng đợi

• Không sử dụng câu lệnh pause, trừ câu lệnh duy nhất trong khối lệnh forever

Sau khi tuân thủ hai nguyên tắc này, việc tích hợp tính năng mới sẽ trở nên dễ dàng và không ảnh hưởng đến các tính năng đã có Chúng ta chỉ cần thêm các câu lệnh trong vòng lặp forever để thực hiện điều đó.

Kết nối nút nhấn vào chân P2 và loa báo động vào chân P8 là một giải pháp khả thi Cần chú ý đến vị trí kết nối của các thiết bị, vì mô đun LED đã chiếm dụng hai chân P0 và P1 Do đó, các phần cứng mới cần được kết nối vào các chân khác để tránh xung đột với phần cứng đã sử dụng.

Hình 54: Kết nối thêm nút nhấn và loa báo động

Chúng ta sẽ xây dựng một chương trình đơn giản để kiểm tra kết nối giữa hai thiết bị Khi nhấn nút, loa sẽ phát âm thanh, còn khi không nhấn, loa sẽ im lặng Lưu ý rằng để chân nhận tín hiệu, cần cấu hình nó là pull up trong phần khởi động.

• Hiểu được luồng thực thi của chương trình

• Kết nối được phần cứng với với dự án hiện có

• Tích hợp được thêm chức năng mới

• Hiểu được khái niệm “Lập trình độc lập”

2 Hiện thực tính năng xin qua đường

Hình 55: Chương trình kiểm tra nút nhấn và loa báo động

Trong chương trình, đôi khi loa không phát âm thanh khi nhấn nút, và đôi khi vẫn phát âm thanh sau khi thả nút, do độ trễ khoảng nửa giây khi xuất dữ liệu ra màn hình 25 LED Điều này cho thấy rằng việc chờ đợi trong bất kỳ câu lệnh nào có thể ảnh hưởng lớn đến các hệ thống tương tác bên ngoài, làm giảm hiệu suất của hệ thống Để khắc phục tình trạng này, một giải pháp nhanh chóng là tạo thêm một luồng xử lý song song bằng cách kết hợp khối lệnh chạy nền và vòng lặp vô tận.

Hình 56: Hiệu chỉnh chương trình: Thêm một luồng thực thi song song

2 Hiện thực tính năng xin qua đường

Sau khi kiểm tra dữ liệu đầu vào và đầu ra, chúng tôi triển khai dịch vụ mới cho người đi bộ, cho phép họ xin qua đường Dịch vụ này hoạt động như sau: khi người dùng nhấn nút, loa sẽ bắt đầu phát tín hiệu khi đèn đỏ sáng, và sẽ dừng lại khi đèn đỏ tắt.

Để tạo một biến số isBeep với giá trị khởi tạo là 0, bạn cần gán giá trị của nó thành 1 khi nhấn nút Hãy điều chỉnh hàm RED_LIGHT để tích hợp tính năng xuất dữ liệu ra loa.

Hình 57: Chương trình tích hợp thêm loa báo động cho người đi bộ

Chúng ta bắt đầu quá trình báo hiệu bằng nhóm lệnh cuối trong khối RED_LIGHT Khi chu kỳ đèn đỏ kết thúc, giá trị của biến isBeep được gán lại thành 0 và tín hiệu P8 sẽ bị tắt Cần lưu ý rằng biến isBeep sẽ được gán giá trị 1 khi nút được nhấn trong khối lệnh forever.

Để cải thiện tính thân thiện của ứng dụng, cần phân tích và hiện thực hóa các chức năng trong đoạn chương trình cuối hàm RED_LIGHT Ví dụ, thay vì phát âm thanh beep liên tục khi đèn đỏ, chúng ta chỉ cần phát âm thanh mỗi 300ms và lặp lại sau mỗi giây Biến counter_timer có thể được sử dụng để thực hiện chức năng này.

Ngày đăng: 21/06/2021, 01:17

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w