Giám sát nhiệt độ bằng cảm biến LM35 OLED 0.96 với Arduino

Module màn hình OLED I2C 0.96 inch

Loại màn hình OLED mình sử dụng trong bài viết này rất nhỏ, kích thước thực tế chỉ 2.7 x 2.8 cm (~0.96 inch) tương tự kích thước của module Arduino Pro Mini, với độ phân giải 128 x 64. IC phụ trách điều khiển màn OLED là SSD1306, đây là loại chip đơn CMOS OLED / PLED với bộ điều khiển hệ thống hiển thị đồ họa ma trận dạng điểm diode phát quang hữu cơ / polymer. Module này có 4 chân trong đó 2 chân cấp nguồn VCC/GND, 2 chân còn lại là SCL/SDA chuẩn giao tiếp I2C. Chúng ta sẽ dùng 2 chân này để điều khiển màn hình. Module màn hình OLED này hoàn toàn tương thích với Arduino và có dải điện áp đầu vào từ 3,3V đến 6V, dòng điện tiêu thụ dưới 10 mA.

Nối dây

Việc kết nối màn hình OLED với Arduino khá đơn giản:

Chân           Đấu nối với Arduino Uno

Vin              5V

GND           GND

SCL             A5

SDA            A4

Nếu bạn đang sử dụng board Arduino khác chứ không phải uno, hãy tìm hiểu các chân SCL và SDA của chúng là gì.

  • Nano: SDA (A4); SCL (A5);
  • MEGA: SDA (20); SCL (21);
  • Leonardo: SDA (20); SCL (21);

Thư viện

Để điều khiển màn hình OLED, bạn sẽ cần thư viện của “adafruit_GFX.h” và “adafruit_SSD1306.h”.

Cài đặt thư viện adafruit_GFX

  1. Nhấn vào đây để tải về thư viện adafruit_GFX.
  2. Giải nén thư mục .zip và bạn sẽ thấy thư mục Adafruit-GFX-Library-master
  3. Đổi tên thư mục của bạn từ Adafbean-GFX-Library-mastervào thành Adafruit_GFX_Library
  4. Di chuyển thư mục Adafruit_GFX_Libraryvào thư mục thư viện cài đặt Arduino IDE của bạn
  5. Cuối cùng, mở lại Arduino IDE

Cài đặt thư viện adafruit_SSD1306

  1. Nhấn vào đây để tải xuống thư viện adafruit_SSD1306.
  2. Giải nén thư mục .zip và bạn sẽ thấy thư mục Adafruit-SSD1306-Library-master
  3. Đổi tên thư mục của bạn thành Adafruit-SSD1306
  4. Di chuyển thư mục Adafruit_SSD1306 vào thư mục thư viện cài đặt Arduino IDE của bạn
  5. Cuối cùng, mở lại Arduino IDE

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.

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.

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 độ

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_WIDTH SCREEN_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

sensorValuevoltageOuttemperatureC và temperatureF 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.

Leave a Reply

Your email address will not be published. Required fields are marked *