Chuẩn bị phần cứng
Trong ví dụ này, bạn sẽ cần các linh kiện sau:
- Màn hình OLED 1x 0,96 inch
- 1x Arduino
- 1x cảm biến nhiệt độ và độ ẩm DHT11
- 1x Breakboard
- 1x Điện trở 10k Ohm
- Dây dẫn
Thông số kĩ thuật DHT11:
- Điện áp hoạt động: 3-5.5V DC
- Ngưỡng độ ẩm: 20 – 90%
- Sai số độ ẩm: ± 5%
- Ngưỡng nhiệt độ: 0 – 55oC
- Sai số nhiệt độ: ± 2o

Màn hình OLED:

Đó là một màn hình rất nhỏ với 128 x 64 pixel OLED riêng lẻ và không cần đèn nền. Màn hình OLED là đơn sắc (màu trắng), nhưng có những mẫu khác với nhiều màu.
Màn hình này sử dụng giao tiếp I2C. Điều này có nghĩa là nó giao tiếp với Arduino chỉ bằng 2 chân.

- DHT11 VCC pin – 5V
- OLED VCC pin – 5V
- DHT11 GND pin – GND
- OLED GND pin – GND
- DHT11 Data pin – D2 của Arduino Uno
- OLED SCL pin – A4 của Arduino Uno
- OLED SDA pin – A5 của Arduino Uno
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);
Code chương trình
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
- Nhấn vào đây để tải về thư viện adafruit_GFX.
- Giải nén thư mục .zip và bạn sẽ thấy thư mục Adafruit-GFX-Library-master
- Đổi tên thư mục của bạn từ Adafbean-GFX-Library-mastervào thành Adafruit_GFX_Library
- 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
- Cuối cùng, mở lại Arduino IDE
Cài đặt thư viện adafruit_SSD1306
- Nhấn vào đây để tải xuống thư viện adafruit_SSD1306.
- Giải nén thư mục .zip và bạn sẽ thấy thư mục Adafruit-SSD1306-Library-master
- Đổi tên thư mục của bạn thành Adafruit-SSD1306
- 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
- Cuối cùng, mở lại Arduino IDE
Đây là một số chức năng sẽ giúp bạn xử lý thư viện màn hình OLED để viết văn bản hoặc vẽ đồ họa đơn giản.
- clearDisplay () – tất cả các pixel đều tắt
- drawPixel (x, y, color) – vẽ một pixel theo tọa độ x, y
- setTextSize (n) – đặt kích thước phông chữ, hỗ trợ kích thước từ 1 đến 8
- setCoder (x, y) – đặt tọa độ để bắt đầu viết văn bản
- print (tin nhắn trực tiếp) – in các ký tự ở vị trí x, y
Cài đặt thư viện cảm biến DHT
- Nhấn vào đây để tải về thư viện cảm biến DHT.
- Giải nén thư mục .zip và bạn sẽ nhận được thư viện DHT-sensor-library-master
- Đổi tên thư mục của bạn thành DHT-sensor-library
- Di chuyển thư mục DHT_sensor_Library vào thư mục thư viện cài đặt Arduino IDE của bạn
- Cuối cùng, mở lại Arduino IDE
Code hiển thị nhiệt độ và độ ẩm lên màn hình OLED
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"
#define DHTPIN 2
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C
display.display(); // show splash screen
delay(2000);
display.clearDisplay(); // clears the screen and buffer
dht.begin();
delay(2000);
}
void loop() {
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed.
if (isnan(h) || isnan(t) || isnan(f)) {
delay(2000);
}
else {
// routine for converting temp/hum floats to char arrays
char temp_buff[5]; char hum_buff[5];
char temp_disp_buff[11] = "Tmp:";
char hum_disp_buff[11] = "Hum:";
// appending temp/hum to buffers
dtostrf(t,2,1,temp_buff);
strcat(temp_disp_buff,temp_buff);
dtostrf(h,2,1,hum_buff);
strcat(hum_disp_buff,hum_buff);
// routine for displaying text for temp/hum readout
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(temp_disp_buff);
display.println(hum_disp_buff);
display.display();
delay(2000);
}
}

Code khác, có chuyển đổi độ F:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define DHTPIN 2 // what pin we're connected to
#define DHTTYPE DHT11 // DHT 11
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Wire.begin();
dht.begin(); // initialize dht
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// initialize with the I2C addr 0x3C (for the 128x32)(initializing the display)
Serial.begin(9600);
}
void displayTempHumid(){
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
display.clearDisplay(); // clearing the display
display.setTextColor(WHITE); //setting the color
display.setTextSize(1); //set the font size
display.setCursor(5,0); //set the cursor coordinates
display.print("Failed to read from DHT sensor!");
return;
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.print("Humidity: ");
display.print(h);
display.print(" %\t");
display.setCursor(0,10);
display.print("Temperature: ");
display.print(t);
display.print(" C");
display.setCursor(0,20);
display.print("Temperature: ");
display.print(f);
display.print(" F");
}
void loop()
{
displayTempHumid();
display.display();
}

Theo:
https://vietmachine.com.vn/
https://electrosome.com/