Lập trình Arduino cho người mới bắt đầu: Hệ thống đèn giao thông

28 tháng 04, 2016 - 12418 lượt xem

Bài viết được dịch từ trang web Makeuseof

Học lập trình Arduino cơ bảnTrong bài viết trước, chúng ta đã học về cấu trúc cơ bản của một chương trình Arduino và đã phân tích code của chương trình 'blink' có chức năng làm đèn LED nhấp nháy. Hy vọng rằng bạn đã có cơ hội để thử nghiệm một chút với lập trình Arduino. Bài này sẽ hướng dẫn bạn viết một chương trình điều khiển hệ thống đèn giao thông bằng Arduino.

Ngoài Arduino ra thì bạn sẽ cần thêm các linh kiện sau đây:

  • 03 đèn LED với các các màu: đỏ, vàng và xanh
  • Một breadboard
  • 03 Điện trở thích hợp với các đèn LED của bạn (có thể dùng loại 220 Ohm) 
  • Dây nối
  • Nút ấn
  • Một điện trở có giá trị cao (10k)

Thiết kế

Học Arduino cơ bản đến nâng cao

Sơ đồ thiết kế rất đơn giản - chỉ cần ba đèn LED, dây dẫn và điện trở mắc phối hợp với LED. Từ các chân 11, 12, 13 của Arduino chúng ta nối với 3 điện trở (loại 220 Ohm), đầu còn lại của 3 điện trở này nối tới chân dương của 03 bóng LED. 03 chân âm của các LED đều được nối đến GND của Arduino.

Khóa học "Arduino qua các dự án thực tế" tại TechMaster sẽ hướng dẫn bạn làm các dự án thú vị có tính chất ứng dụng và khả năng tái sử dụng cao. Phù hợp với nhiều đối tượng khác nhau: sinh viên bất kỳ ngành nào, lập trình viên, nông dân...

Lập trình

Chúng ta bắt đầu bằng việc định nghĩa các biến để có thể xử lý với các đèn theo tên chứ không phải là một con số. Khởi tạo một project Arduino mới, và bắt đầu bằng những dòng code này:

int red = 13;
int yellow = 12;
int green = 11;

Tiếp theo, chúng ta thêm vào function setup, trong đó định nghĩa các đèn LED đỏ, vàng, xanh tới mode OUTPUT. Vì chúng ta đã tạo ra các biến để đại diện cho số của chân, nên bây giờ chúng ta có thể tham chiếu đến các chân bằng tên thay thế.

void setup(){
pinMode(red,OUTPUT);
pinMode(yellow,OUTPUT);
pinMode(green,OUTPUT);
}

Bây giờ đến vấn đề khó hơn là - logic thực tế của hệ thống đèn giao thông. Tôi sẽ tạo ra một function riêng để bật tắt các đèn có tên là changeLights():

void loop(){
changeLights();
delay(15000);
}

void changeLights(){
// green off, yellow for 3 seconds
digitalWrite(green,LOW);
digitalWrite(yellow,HIGH);
delay(3000);

// turn off yellow, then turn red on for 5 seconds
digitalWrite(yellow,LOW);
digitalWrite(red,HIGH);
delay(5000);

// red and yellow on for 2 seconds (red is already on though)
digitalWrite(yellow,HIGH);
delay(2000);

// turn off red and yellow, then turn on green
digitalWrite(yellow,LOW);
digitalWrite(red,LOW);
digitalWrite(green,HIGH);
}

Vậy là xong! Bây giờ, tải nó vào Arduino và chạy. Bạn sẽ có một hệ thống đèn giao thông cứ thay đổi sau mỗi 15 giây. Tuy nhiên, tôi nghĩ rằng như vậy thì hơi đơn giản, vì vậy chúng ta hãy thêm vào một nút nhấn dành cho người đi bộ để họ có thể bấm nút xin đường bất cứ khi nào họ muốn. Hãy tham khảo sơ đồ mạch được cập nhật dưới đây:

Học lập trình Arduino qua dự án thực tế

Cấp +Vcc 5V từ Arduino đến nút ấn, đầu kia nút ấn cấp váo chân 0 Rx của Arduino. Một đầu điện trở kéo xuống (pull down) nối vào nút ấn, đầu kia của điện trở nối GND. Bạn sẽ nhận thấy rằng công tắc nút ấn có đấu với một điện trở có trở kháng cao 10k. Điều này được gọi là một điện trở kéo xuống (pull down resistor). Một công tắc sẽ cho phép dòng điện chạy qua, hoặc không. Điều này có vẻ đơn giản, nhưng trong một mạch logic, dòng điện luôn có 2 trạng thái cao hoặc thấp (0 hoặc 1, cao hay thấp). Bạn có thể giả định rằng một công tắc nút nhấn nếu không thực sự được ấn sẽ được xác định là đang trong trạng thái thấp, nhưng trên thực tế nó được thả 'nổi (floating)', khi đó sẽ không có dòng điện chạy qua.

Bây giờ, ở trong hàm loop(), thay vì thay đổi tín hiệu đèn mỗi 15 giây, chúng ta sẽ đọc trạng thái của công tắc nút nhấn, và chỉ thay đổi đèn khi nó được nhấn.

Bằng cách thêm một số biến mới:

int button = 2; // switch is on pin 2
int buttonValue = 0; // switch defaults to 0 or LOW

Bây giờ, trong function setup(), thêm một dòng code mới để khai báo công tắc switch như một đầu vào (input). Tôi cũng đã thêm một dòng để thiết lập đèn sáng lúc đầu là đèn xanh. Nếu không có thiết lập ban đầu này, chúng sẽ bị tắt, cho đến khi lần đầu tiên một function changeLights () được khởi tạo.

pinMode(switch,INPUT);
digitalWrite(green,HIGH);

Thay đổi code của function loop lại như sau:

void loop(){
// read the value of the switch
buttonValue = digitalRead(button);
// if the switch is HIGH, ie. pushed down - change the lights!
if (buttonValue == HIGH){
changeLights();
delay(15000); // wait for 15 seconds
}
}

Bằng việc để delay trong khối lệnh if để dừng 15 giây, chúng ta đảm bảo rằng các đèn giao thông không thể thay đổi ít nhất trong khoảng thời gian đó. Khi 15 giây trôi qua, thì hàm loop lại được chạy lặp trở lại. Mỗi lần chạy trở lại hàm loop, chúng ta sẽ đọc trạng thái của nút nhấn trở lại, nhưng nếu nó không được nhấn thì lệnh if sẽ chẳng bao giờ được thực thi, các đèn sẽ không thay đổi.

Bình luận

avatar
Triều Dương 2020-04-29 03:20:46.795959 +0000 UTC
nếu gắn thêm led 7 thanh 4 số (12 chân) vào thì kết nối và code như thế nào ad?
Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  +1 Thích
+1