Menu
CoddyTech

Cảm biến đỗ xe: màn hình

Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 12 trên 24.

Bước cuối cùng hiển thị khoảng cách chính xác lên màn hình. Màn hình LCD 16x2 được nối theo cách thông thường: RS vào chân 12, E vào chân 11, D4 đến D7 vào các chân 5, 4, 3 và 2.

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Hàng trên không bao giờ thay đổi, vì vậy hãy ghi Distance: một lần trong setup(), sau lcd.begin(16, 2). Chỉ hàng dưới được cập nhật trong loop().

Màn hình LCD giữ nguyên mọi ký tự cho đến khi có nội dung khác thay thế. Khi khoảng cách đổi từ 250 cm xuống 8 cm, nếu in 8 cm đè lên 250 cm, phần cuối của dòng cũ vẫn còn, khiến màn hình hiển thị 8 cmcm. Hãy in thêm vài dấu cách sau văn bản để che phần còn sót lại của số dài hơn:

lcd.setCursor(0, 1);
lcd.print(cm);
lcd.print(" cm    ");

Dấu cách cũng giúp tránh hiện tượng nhấp nháy do lcd.clear(), vốn sẽ xóa trắng toàn bộ màn hình mười lần mỗi giây.

challenge icon

Thử thách

Dễ

Hiển thị khoảng cách trên LCD:

  • thêm LiquidCrystal.h và tạo lcd(12, 11, 5, 4, 3, 2)
  • trong setup(): dùng lcd.begin(16, 2) và hiển thị Distance: ở hàng trên cùng
  • trong loop(): hiển thị khoảng cách và cm ở hàng dưới cùng, chẳng hạn 57 cm, rồi thêm các khoảng trắng

Giữ nguyên đèn, tiếng bíp và lệnh in ra. Nhấn Chạy, rồi nhấn Kiểm tra.

Tự làm thử

// Cảm biến khoảng cách
const int trigPin = 9;
const int echoPin = 10;
// Đèn cảnh báo
const int greenPin = 6;
const int yellowPin = 7;
const int redPin = 13;
// Còi báo
const int buzzerPin = 8;

unsigned long lastBeep = 0;  // thời điểm tiếng bíp gần nhất bắt đầu

// Phát xung siêu âm và trả về khoảng cách tính bằng cm.
long readDistance() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long duration = pulseIn(echoPin, HIGH);
  return duration / 58;
}

// Đèn xanh khi vật ở xa, đèn vàng khi vật ở gần, đèn đỏ khi vật ở quá gần.
void showLights(long cm) {
  digitalWrite(greenPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(redPin, LOW);
  if (cm >= 100) {
    digitalWrite(greenPin, HIGH);
  } else if (cm >= 30) {
    digitalWrite(yellowPin, HIGH);
  } else {
    digitalWrite(redPin, HIGH);
  }
}

// Vật càng gần, tiếng bíp càng nhanh.
void beep(long cm) {
  if (cm >= 100) {
    noTone(buzzerPin);
  } else if (cm < 10) {
    tone(buzzerPin, 1000);  // quá gần: âm báo liên tục
  } else if (millis() - lastBeep >= cm * 10) {
    lastBeep = millis();
    tone(buzzerPin, 1000, 50);
  }
}

void setup() {
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(redPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  long cm = readDistance();
  Serial.println(cm);
  showLights(cm);
  beep(cm);
  delay(100);
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Dự án

Tự luyện tập: Playground Arduino