Bài 12. Điều khiển màn hình LCD (Phần 2)
Trong bài học này, chúng ta sẽ phát triển một ứng dụng sử dụng màn hình LCD để hiển thị nhiệt độ và độ sáng dựa trên bài số 11. Do đó, bạn nên đọc trước Bài 11 trước khi thực hành bài này nhé!.
Mức độ ánh sáng được đo bằng quang trở mà bạn đã học trong Bài 9. Còn nhiệt độ, bạn sẽ sử dụng một IC đo nhiệt độ, cho trang bảng linh kiện. IC này có ba chân, trong đó hai chân dùng cho 5V và GND, chân còn lại được kết nối với ngõ vào Analog của Arduino.
Linh kiện cần thiết
STT | Tên linh kiện | SL | Hình ảnh |
1 | Board Arduino Uno R3 | 1 | ![]() |
2 | Dây nguồn USB | 1 | ![]() |
3 | Breadboard mini | 1 | ![]() |
4 | Màn hình LCD (16×2 kí tự) | 1 | ![]() |
5 | Dây căm breadboard | 1 | ![]() |
6 | Biến trở 10kΩ | 1 | ![]() |
7 | Điện trở 1kΩ (nâu, đen, đỏ) | 1 | ![]() |
8 | Quang trở | 1 | ![]() |
9 | Cảm biến nhiệt LM35 | 1 | ![]() |
Sơ đồ đấu dây
Sơ đồ đi dây trong bài này dựa trên sơ đồ trong bài 11. Tuy nhiên sẽ có một số kết nối sẽ thay đổi, đặc biệt là gần biến trở. Quang trở, điện trở 1kΩ và cảm biến nhiệt LM35 là những linh kiện mới sẽ được thêm vào. Các bạn lưu ý về chiều lắp đặt của cảm biến LM35 như hình (mặt khuyết hướng lên trên)
Code cho Arduino
Sketch của bài này cũng dựa trên bài 11. Tải đoạn code này vào Arduino, bạn hãy thử làm ấm cảm biến nhiệt bằng cách đặt ngón tay của bạn lên cảm biến và xem giá trị nhiệt độ tăng trên màn hình.
Đồng thời, nếu bạn vẫy tay trên quang trở, làm giảm ánh sáng chiếu lên nó, giá trị của mức ánh sáng trên màn hình sẽ giảm.
/* Lesson 12. Light and Temperature */ #include <LiquidCrystal.h> int tempPin = 0; int lightPin = 1; const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); void setup() { lcd.begin(16, 2); } void loop() { // Display Temperature in C int tempReading = analogRead(tempPin); float tempVolts = tempReading * 5.0 / 1024.0; float tempC = (tempVolts - 0.5) * 100.0; float tempF = tempC * 9.0 / 5.0 + 32.0; // ---------------- lcd.print("Temp F "); lcd.setCursor(6, 0); lcd.print(tempF); // Display Light on second row int lightReading = analogRead(lightPin); lcd.setCursor(0, 1); // ---------------- lcd.print("Light "); lcd.setCursor(6, 1); lcd.print(lightReading); delay(500); }
Trong hàm ‘loop’ có hai việc được thực hiện. Đầu tiên, chúng ta sẽ chuyển tín hiệu analog từ cảm biến nhiệt độ thành nhiệt độ thực, và sau đó chúng ta sẽ hiển thị chúng ra LCD.
Trước hết, chúng ta sẽ tìm hiểu cách tính toán nhiệt độ.
int tempReading = analogRead(tempPin); float tempVolts = tempReading * 5.0 / 1024.0; float tempC = (tempVolts - 0.5) * 100.0; float tempF = tempC * 9.0 / 5.0 + 32.0;
Giá trị thô đọc được từ cảm biến nhiệt độ trước tiên được nhân lên 5 và sau đó chia cho 1024 để trả về cho chúng ta mức điện áp (từ 0 đến 5) tại chân ngõ vào ‘tempPin’.
Để chuyển đổi điện áp vào từ cảm biến nhiệt LM35 thành nhiệt độ theo thang độ C, bạn cần trừ đi 0.5V từ giá trị đo sau đó nhân cho 100.
Để chuyển đổi nhiệt độ sang thang độ F (Fahrenheit), bạn nhân giá trị đã tính theo thang độ C cho 9/5 và thêm vào 32.
Việc hiển thị giá trị đo trên màn hình LCD có thể bị sai. Nguyên nhân là do số chữ số của giá trị đo mỗi lúc khác nhau. Chẳng hạn, nếu nhiệt độ thay đổi từ 101.50 sang 99.00 thì số dư từ kết quả cũ sẽ không được xóa khỏi màn hình. Để tránh vấn đề này, chúng ta sẽ ghi lại toàn bộ văn bản hiển thị trên màn hình cho mỗi lần lặp.
lcd.print("Light "); lcd.setCursor(6, 1); lcd.print(lightReading);
Mỗi dòng trên màn hình có 16 kí tự, do đó chúng ta hiển thị một dòng với đủ số kí tự với số khoảng trống mà chúng ta sẽ ghi giá trị đọc được vào đó.
Đó điền vào chỗ trống này, đặt vị trí con trỏ vào vị trí trí đó và hiển thị kết quả đó ra màn hình.
Việc hiển thị mức độ sáng cũng tương tự như vậy. Tuy nhiên do không có đơn vị cho mức độ sáng, chúng ta chỉ hiện thị giá trị thô đọc được từ quang trở.
Mở rộng
Hãy thử thay đổi đoạn code trên để màn hình hiện thị nhiệt độ ở thang độ C thay cho thang độ F.
Trả lời