Giám sát nhiệt độ trong nhà bằng cảm biến LM35 hiển thị trên OLED 0.96 với Arduino

Giám sát nhiệt độ trong nhà bằng cảm biến LM35 hiển thị trên OLED 0.96 với Arduino

Nếu bạn đang tìm kiếm một cảm biến nhiệt độ giá rẻ, chính xác và dễ sử dụng, thì LM35 là một lựa chọn tuyệt vời. Nó có độ chính xác ±¼°C ở nhiệt độ phòng và ±¾°C trong khoảng nhiệt độ từ −55°C đến 150°C. Tuy nhiên, điểm hạn chế của cảm biến là đầu ra dữ liệu ở định dạng Analog, dễ bị ảnh hưởng bởi nhiễu từ môi trường bên ngoài. Vì vậy, trong hướng dẫn này, các bạn sẽ tìm hiểu cách kết nối cảm biến nhiệt độ LM35 với Arduino và hiển thị dữ liệu nhiệt độ trên màn hình OLED 0.96 I2C.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

Linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Cảm biến đo nhiệt độ LM35 1 Shopee | Cytron
Màn hình OLED 0.96 I2C 1 Shopee | Cytron
Dây cắm 10-20 Shopee | Cytron
Breadboard 1 Shopee | Cytron

Tổng quan về cảm biến nhiệt độ LM35

Cảm biến đo nhiệt độ LM35 là một cảm biến nhiệt độ analog thông dụng và đơn giản. Nó được sử dụng để đo nhiệt độ và chuyển đổi nhiệt độ thành một tín hiệu điện tương ứng. Cảm biến LM35 được thiết kế để cung cấp một tín hiệu đầu ra analog có tỷ lệ tuyến tính với nhiệt độ đo được.

Cấu tạo của cảm biến LM35 bao gồm một cảm biến nhiệt độ bên trong, được bảo vệ bởi một vỏ bọc nhựa. Cảm biến nhiệt độ sử dụng nguyên tắc cảm ứng nhiệt để đo nhiệt độ. Khi nhiệt độ tăng lên, điện áp đầu ra của cảm biến tăng lên theo tỷ lệ tuyến tính.

Xem thêm: Đo nhiệt độ bằng Cảm biến LM35 sử dụng Arduino Uno

Thông số kỹ thuật

Thông số Giải thích
Phạm vi đo -55 độ C đến +150 độ C
Độ chính xác ±0.5 độ C
Độ phân giải 10 mV/độ C
Điện áp hoạt động 4V đến 30V DC
Tiêu thụ điện năng Khoảng 60 μA
Đáp ứng nhiệt Khoảng 0.1 đến 0.2 giây
Độ ổn định Cao

Nguyên lý hoạt động của cảm biến nhiệt độ LM35

Cảm biến nhiệt độ LM35 sử dụng nguyên lý cơ bản của một diode để đo giá trị nhiệt độ đã biết trước đó. Như các bạn đã biết từ vật lý bán dẫn, khi nhiệt độ tăng, điện áp qua một diode tăng. Bằng cách tăng độ nhạy của điện áp thay đổi, các bạn có thể dễ dàng tạo ra một tín hiệu điện áp tỷ lệ trực tiếp với nhiệt độ xung quanh. Hình ảnh dưới đây cho thấy cấu trúc bên trong của IC cảm biến đo nhiệt độ LM35 theo datasheet.

Trong thực tế, diode được sử dụng để đo nhiệt độ không phải là một diode PN Junction thông thường mà là một transistor được kết nối như diode. Đó là lý do tại sao mối quan hệ giữa điện áp thuận và transistor là tuyến tính như vậy. Đồ thị hệ số nhiệt độ so với dòng thu thập dưới đây giúp bạn hiểu quá trình này hơn.

Cách hoạt động của cảm biến LM35 rất đơn giản và dễ hiểu. Các bạn chỉ cần kết nối 5V và GND vào cảm biến và đo điện áp đầu ra từ chân output.

Theo tài liệu kỹ thuật của thiết bị, cảm biến sẽ cung cấp 10mV/°C. Vì vậy, nếu nhiệt độ trong phòng là 18°C, cảm biến sẽ là 180mV tại chân output, và hình ảnh bên dưới thể hiện cho các bạn điều đó. Nếu bạn sử dụng đồng hồ đo đa năng vào chân output của cảm biến và đo điện áp đầu ra, bạn sẽ thu được một kết quả tương tự.

Sơ đồ chân cảm biến nhiệt độ LM35

  • VCC: là chân cấp nguồn của IC cảm biến LM35 có thể kết nối với 4V hoặc 32V 
  • GND: là chân nối đất của IC LM35 Arduino
  • Vout: Đây là chân đầu ra analog của cảm biến nhiệt độ

Cài đặt thư viện SSD1306 và GFX

Khởi động phần mềm Arduino IDE và truy cập vào đường dẫn như sau: Sketch Include Library > Manage Libraries

Nhập vào ô tìm kiếm “SSD1306” và tìm đến thư viện của Adafruit, chọn phiên bản mới nhất và tiến hành cài đặt.

Sau khi cài đặt thư viện SSD1306 từ Adafruit, hãy nhập “GFX ” vào ô tìm kiếm và cài đặt thư viện.

Sơ đồ đấu nối cảm biến nhiệt độ, màn hình OLED 0.96 với Arduino

Arduino Cảm biến nhiệt độ LM35 Màn hình OLED 0.96 I2C
5V VCC VCC
GND GND GND
A0 VOUT
A4 SDA
A5 SCK

Code cảm biến đo nhiệt độ LM35

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const int sensorPin = A0; 
float sensorValue;
float voltageOut;

float temperatureC;
float temperatureF;

// uncomment if using LM335
//float temperatureK;

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

void loop() {
  sensorValue = analogRead(sensorPin);
  voltageOut = (sensorValue * 5000) / 1024;
  
  // calculate temperature for LM35 (LM35DZ)
  temperatureC = voltageOut / 10;
  temperatureF = (temperatureC * 1.8) + 32;

  // calculate temperature for LM335
  //temperatureK = voltageOut / 10;
  //temperatureC = temperatureK - 273;
  //temperatureF = (temperatureC * 1.8) + 32;

  // calculate temperature for LM34
  //temperatureF = voltageOut / 10;
  //temperatureC = (temperatureF - 32.0)*(5.0/9.0);

  Serial.print("Temperature(ºC): ");
  Serial.print(temperatureC);
  Serial.print("  Temperature(ºF): ");
  Serial.print(temperatureF);

  // clear display
  display.clearDisplay();

  // display temperature Celsius
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0,10);
  display.print(temperatureC);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("C");

  // display temperature Fahrenheit
  display.setTextSize(1);
  display.setCursor(0, 35);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print(temperatureF);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("F");

  display.display();    
  delay(1000);
 }

Giải thích Code

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Khai báo và cấu hình các thư viện: Wire.h để sử dụng giao tiếp I2C, Adafruit_GFX.h và Adafruit_SSD1306.h để điều khiển màn hình OLED SSD1306.

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Định nghĩa hai hằng số SCREEN_WIDTHSCREEN_HEIGHT là kích thước của màn hình OLED 0.96 I2C. Giá trị của SCREEN_WIDTH 128, là chiều rộng của màn hình theo đơn vị pixel. Giá trị của SCREEN_HEIGHT 64, là chiều cao của màn hình.

// declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Khai báo một đối tượng display từ lớp Adafruit_SSD1306, màn hình SSD1306 được kết nối thông qua giao thức I2C (SDA, SCL pins).

const int sensorPin = A0;

Khai báo chân kết nối cảm biến LM35 với Arduino, ở đây mình sẽ sử dụng chân A0.

float sensorValue;
float voltageOut;

float temperatureC;
float temperatureF;

Các biến sensorValue, voltageOut, temperatureCtemperatureF là các biến kiểu dữ liệu float được khai báo để lưu trữ các giá trị liên quan đến nhiệt độ.

void setup() {
  pinMode(sensorPin, INPUT);
  Serial.begin(9600);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
}

Trong hàm setup(), khởi tạo kết nối Serial, khởi tạo màn hình OLED, và xóa màn hình.

void loop() {
  sensorValue = analogRead(sensorPin);
  voltageOut = (sensorValue * 5000) / 1024;
  
  // calculate temperature for LM35 (LM35DZ)
  temperatureC = voltageOut / 10;
  temperatureF = (temperatureC * 1.8) + 32;

  // calculate temperature for LM335
  //temperatureK = voltageOut / 10;
  //temperatureC = temperatureK - 273;
  //temperatureF = (temperatureC * 1.8) + 32;

  // calculate temperature for LM34
  //temperatureF = voltageOut / 10;
  //temperatureC = (temperatureF - 32.0)*(5.0/9.0);

  Serial.print("Temperature(ºC): ");
  Serial.print(temperatureC);
  Serial.print("  Temperature(ºF): ");
  Serial.print(temperatureF);

  // clear display
  display.clearDisplay();

  // display temperature Celsius
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0,10);
  display.print(temperatureC);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("C");

  // display temperature Fahrenheit
  display.setTextSize(1);
  display.setCursor(0, 35);
  display.print("Temperature: ");
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print(temperatureF);
  display.print(" ");
  display.setTextSize(1);
  display.cp437(true);
  display.write(167);
  display.setTextSize(2);
  display.print("F");

  display.display();    
  delay(1000);
 }

Trong hàm loop(), đọc giá trị từ cảm biến LM35 thông qua chân analog (sensorPin).

Tính toán nhiệt độ dựa trên giá trị đọc được từ cảm biến và chuyển đổi đơn vị nhiệt độ từ Celsius sang Fahrenheit.

Ghi giá trị nhiệt độ lên cổng Serial và hiển thị lên màn hình OLED 0.96 I2C.

Delay 1 giây và lặp lại quá trình trên.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments