Trong bài hướng dẫn hôm nay, ta sẽ “biến” Arduino thành một nhiệt kế – sử dụng Cảm biến nhiệt độ để đo nhiệt độ (bề mặt cơ thể người) và đưa tín hiệu đầu ra đến ba đèn LED. Mặc dù Arduino là một công cụ kỹ thuật số, nó vẫn có thể chuyển đổi các tín hiệu analog đầu vào (ví dụ như Cảm biến nhiệt độ TMP36) bằng bộ chuyển đổi Analog-to-Digital (ADC) tích hợp sẵn (truy cập thông qua các chân analog A0 đến A5).
Mạch mẫu Cảm biến nhiệt độ TMP36 với Arduino trên Tinkercad.
Bạn hãy tự khám phá mạch mẫu bên trên. Nhấp Start Simulation, nhấp vào cảm biến TMP, sau đó kéo thanh trượt để điều chỉnh nhiệt độ mô phỏng đầu vào và quan sát các đèn LED hiển thị kết quả.
Trong bài viết này, bạn sẽ tự xây dựng một mạch mô phỏng tương tự mạch mẫu. Nếu muốn thực hành thực tế, bạn sẽ cần sử dụng:
- 1 Arduino Uno
- 1 cáp USB
- 1 breadboard và dây
- 3 đèn LED
- 3 điện trở giống nhau (giá trị bất kỳ từ 100 – 1K, tốt nhất nên sử dụng 220 Ohms)
- 1 cảm biến nhiệt độ TMP36
Tham khảo thêm: Sản phẩm Cảm Biến Nhiệt Độ LM35
Bước 1: Xây dựng mạch LED
Tương tự như những bài viết trước, ta bắt đầu bằng cách đấu dây Arduino và breadboard với nguồn và đất, sau đó thêm ba đèn LED màu đỏ. Đây sẽ là các đèn chỉ báo hoặc “bar graph” cho mạch.
Kéo Arduino Uno và breadboard từ bảng components vào bảng làm việc, đặt bên cạnh mạch hiện có.
Nối chân 5 volt và chân đất trên Arduino với đường dây nguồn (+) và đất (-) trên breadboard. Bạn có thể thay đổi màu sắc dây nếu muốn (sử dụng inspector hoặc phím số trên bàn phím).
Kéo ba đèn LED vào hàng E của breadboard, đặt cách nhau 2 lỗ. Bạn có thể thay đổi màu đèn trong mục inspector khi nhấp vào từng đèn.
Sử dụng điện trở 220 Ohm để nối cực âm của mỗi đèn LED (chân trái) với thanh nối đất (màu đen) của bảng mạch. Trong Tinkercad Circuits, bạn có thể thay đổi giá trị điện trở bằng cách chọn nó và chỉnh từ menu thả xuống của inspector.
Nối cực dương của các đèn LED (bên phải, chân dài hơn) với các chân digital 4, 3 và 2 trên Arduino. Đây là nơi mà dòng điện sẽ chạy vào.
Cực âm (-) là cực mà dòng điện chạy qua, được nối với đất.
Bước 2: Thêm cảm biến nhiệt độ
Cảm biến nhiệt độ tạo ra một tín hiệu điện áp thay đổi, tùy thuộc vào nhiệt độ mà nó cảm nhận được. Cảm biến có ba chân: một chân kết nối với đất, một chân kết nối với 5V và một chân thứ ba tạo ra điện áp thay đổi cho Arduino (tương tự như tín hiệu analog phát ra từ biến trở).
HIện tại thị trường có nhiều mẫu cảm biến nhiệt độ khác nhau. Tuy nhiên, mẫu TMP36 khá tiện lợi vì điện áp đầu ra của nó tỷ lệ thuận với nhiệt độ tính bằng độ C.
Trong trình chỉnh sửa mạch, tìm cảm biến nhiệt độ trong mục components.
Đặt cảm biến (TMP36) trên breadboard với phần tròn quay ra xa Arduino, như trong hình (đây là hướng mặc định).
Đặt cảm biến nhiệt độ trên hàng E của breadboard, như minh họa.
Nối dây cảm biến nhiệt độ để chân trái nối với thanh điện áp 5V, chân giữa kết nối với A0 trên Arduino và chân phải nối với thanh GND.
Bước 3: Quan sát đầu vào analog
Trong sơ đồ mạch trên, bạn có thể thấy rằng cảm biến nhiệt độ được kết nối với nguồn 5V, đất 0V và chân analog A0. Khi nhiệt độ tăng, chân nối với A0 cũng tăng điện áp. Ngoài ra, bạn cũng có thể thấy rằng ba đèn LED được kết nối với các chân digital của riêng chúng.
Mặc dù Arduino là một công cụ digital, nó vẫn có thể lấy thông tin từ các cảm biến analog để đo những yếu tố như nhiệt độ hoặc ánh sáng. Để làm được điều này, ta sẽ sử dụng bộ chuyển đổi Analog-to-Digital (ADC) được tích hợp sẵn của Arduino.
Các chân Analog-in từ A0 đến A5 có thể đọc điện áp (từ 0 đến 5V) và chuyển dịch điện áp đó thành giá trị (từ 0 đến 1023) để Arduino sử dụng. Trên thực tế, các chân analog này chủ yếu được dùng để đọc thông tin từ các cảm biến.
Trên mạch mẫu mô phỏng của Tinkercad Circuits, nhấp vào “Start Simulation”.
Mở trình chỉnh sửa code (Code Editor) và tìm nút ” Serial Monitor ” để xem các giá trị cảm biến được đổ vào.
Bước 4: Khối Code
Giờ bạn hãy thử sử dụng trình chỉnh sửa code để xem trạng thái của cảm biến, sau đó đoán xem đèn LED nào sẽ sáng, dựa trên giá trị của cảm biến nhé.
Ta nhấp vào nút “Code” để mở trình chỉnh sửa. Các khối màu xám là chú thích để ghi lại nhận xét. Chúng không bắt buộc và sẽ không được thực thi khi chương trình chạy.
Nhấp vào danh mục Variables trong trình chỉnh sửa. Tạo một biến mới có tên là baselineTemp và sử dụng khối “set” để đặt nó thành 40 (độ C).
Để lưu trữ giá trị cảm biến, hãy tạo một biến có tên “celsius“.
Kéo khối “set” ra và điều chỉnh từ menu thành biến celsius vừa tạo.
Trong danh mục Math, hãy kéo một khối “map” ra và lồng hai khối arithmetic (“1 + 1“) trong ô đầu tiên.
Điều chỉnh phạm vi từ -40 đến 125.
Nhấp vào danh mục Input, kéo ra một khối “analog read pin” và đặt nó vào ô arithmetic đầu tiên, bên trong khối “map“.
Điều chỉnh các khối arithmetic thành “(read analog pin A0 – 20) x 3.04“.
Bạn có thể tuỳ chọn tạo một biến mới để chuyển đổi nhiệt độ sang độ F, bằng một khối set và một số khối arithmetic thành “set fahrenheit to (celsius x 9)/5 + 32“.
Thêm một số khối serial monitoring để xuất ra nhiệt độ (độ C, độ F hoặc cả hai).
Nhấp vào danh mục Control và kéo ra một khối “if then”, sau đó điều hướng đến mục Math và kéo một khối so sánh (comparator) vào khối “if”.
Trong danh mục Variables, lấy biến “celsius” và biến “baselineTemp” rồi kéo chúng vào khối so sánh comparator, điều chỉnh từ menu để nó thành “if celsius < baselineTemp then“.
Thêm ba khối đầu ra digital bên trong câu lệnh if để đặt các chân 2, 3 và 4 thành LOW.
Nhân bản câu lệnh if này bốn lần, thêm các khối số học arithmetic và khối “and/or” để tạo ra năm câu lệnh if phát hiện các trạng thái tổng thể.
- Trạng thái đầu tiên là “the temperature is below our target baseline” (nhiệt độ dưới mức cơ sở) nên không có đèn LED nào sáng lên.
- Khi nhiệt độ lớn hơn hoặc bằng baselineTemp (“the temperature is greater than or equal to the baselineTemp“) và nhỏ hơn baselineTemp+10 (“less than baselineTemp+10“), chỉ sáng đèn LED của pin 2.
- Khi nhiệt độ nằm giữa baselineTemp+10 và baselineTemp+20 (“the temperature is between baselineTemp+10 and baselineTemp+20“), thì sáng hai đèn LED.
Và như vậy ta đã có tất cả các trạng thái mong muốn.
Bước 5: Giải thích code Arduino
Khi trình chỉnh sửa code mở, bạn có thể nhấp vào menu bên trái và chọn “Blocks + Text” để hiển thị mã Arduino được tạo bởi các khối.
int baselineTemp = 0;
int celsius = 0;
int fahrenheit = 0;
Trước hàm setup(), chúng ta tạo các biến để lưu trữ nhiệt độ cơ sở (baseline temperature) và giá trị cảm biến. Chúng được khai báo bằng int vì là số nguyên.
void setup()
{
pinMode(A0, INPUT);
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
Bên trong setup, các chân được cấu hình bằng hàm pinMode (). Chân A0 được cấu hình như một đầu vào, để chúng ta có thể nhận tín hiệu điện của Cảm biến nhiệt độ. Các chân 2, 3 và 4 được cấu hình làm đầu ra để điều khiển đèn LED.
void loop()
{
// set threshold temperature to activate LEDs
baselineTemp = 40;
// measure temperature in Celsius
celsius = map(((analogRead(A0) - 20) * 3.04), 0, 1023, -40, 125);
Các nội dung sau hai dấu gạch chéo // đều là phần nhận xét, chỉ để chúng ta đọc (và không được đưa vào chương trình khi Arduino chạy). Trong vòng lặp chính, baselineTemp được đặt thành 40 độ C.
// convert to Fahrenheit
fahrenheit = ((celsius * 9) / 5 + 32);
Serial.print(celsius);
Serial.print(" C, ");
Serial.print(fahrenheit);
Serial.println(" F");
Công thức chuyển đổi giữa độ C và độ F là F = (C * 9) / 5 + 32. Việc hiển thị ra màn hình (serial monitor ) sẽ giúp bạn quan sát được sự thay đổi nhiệt độ chi tiết hơn (so với khi chỉ có duy nhất đèn LED hiển thị trạng thái).
if (celsius < baselineTemp) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
if (celsius >= baselineTemp && celsius < baselineTemp + 10) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
if (celsius >= baselineTemp + 10 && celsius < baselineTemp + 20) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (celsius >= baselineTemp + 20 && celsius < baselineTemp + 30) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
}
if (celsius >= baselineTemp + 30) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
}
delay(1000); // Wait for 1000 millisecond(s)
}
Sáu câu lệnh if của vòng lặp đánh giá các phân đoạn khác nhau của một phạm vi nhiệt độ nhất định, từ 40 đến 46 độ C. Càng nhiều đèn LED sáng sẽ cho thấy nhiệt độ càng ấm.
Nếu bạn muốn thấy sự thay đổi rõ ràng hơn ở các đèn (bộ ba đèn còn được gọi là bar graph lights), bạn có thể thay đổi biến nhiệt độ cơ sở baselineTemp và/hoặc phạm vi mà bạn đang xem, bằng cách thay đổi các đối số trong câu lệnh if (). Việc này được gọi một cách chuyên môn là hiệu chuẩn (calibration).
Bước 6: Sử dụng mạch
Nếu bạn đã dựng mạch thực tế, hãy dùng thử mạch với serial monitor của phần mềm Arduino (nút kính lúp ở phía trên bên phải của cửa sổ phác thảo), kích hoạt cảm biến bằng ngón tay của bạn. Kết quả có thể sẽ không như mong muốn nếu nhiệt độ phòng (hoặc ngón tay của bạn) lạnh hoặc ấm hơn.
Nếu sử dụng bảng mạch vật lý, hãy quan sát nhiệt độ phòng bằng serial monitor và đặt baselineTemp thành giá trị đó.
Hãy điều chỉnh “nhóm” ngưỡng nhiệt độ khác biệt thành một phạm vi nhỏ hơn (2, 4, 6, thay vì 10, 20, 30).
Cuối cùng, tải lại mã và thử giữ cảm biến bằng ngón tay. Khi nhiệt độ tăng lên, bạn sẽ thấy các đèn LED bật lên từng cái một.
Bước 7: Khám phá thêm
Ở bài hướng dẫn này, bạn đã sử dụng analogRead(), serial monitor để theo dõi những thay đổi bên trong Arduino và tạo một màn hình hiển thị nhiệt độ đơn giản với đèn LED. Hãy thử áp dụng kỹ thuật này với các loại cảm biến khác nhé.
Một hướng nâng cao để mở rộng cho mạch này là tạo ra giải pháp để hai người cùng so sánh nhiệt độ ngón tay. Trong trường hợp này, bạn sẽ làm như thế nào? cần hai cảm biến hay để các cảm biến thay phiên nhau? Bạn sẽ xây dựng code như thế nào để mạch hoạt động? Nếu có ý tưởng, hoặc thực hiện thành công, hãy comment bên dưới để chia sẻ cho mọi người cùng biết nhé. ?
Nguồn: instructables.com
Lượt dịch: Fuvitech.vn