/*
Bài tập 2: Ghi và đọc từ cảm biến I2C
Lý thuyết:
• Mô tả quy trình giao tiếp với một thiết bị thông qua I2C. Giải thích các bước để ghi và
đọc dữ liệu từ một thiết bị I2C.
Thực hành:
• Kết nối ESP32 với cảm biến nhiệt độ và độ ẩm DHT22.
• Lập trình ESP32 để đọc giá trị nhiệt độ và độ ẩm từ DHT22 và hiển thị dữ liệu này trên
Serial Monitor và màn hình OLED
*/
#include "DHTesp.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Chiều rộng của OLED, tính bằng pixel
#define SCREEN_HEIGHT 64 // Chiều cao của OLED, tính bằng pixel
// Tạo một đối tượng màn hình OLED kết nối với I2C
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int DHT_PIN = 15;
DHTesp dhtSensor;
void setup() {
// Khởi động Serial Monitor
Serial.begin(115200);
// Khởi tạo màn hình OLED với địa chỉ I2C là 0x3C
if (!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Khởi tạo SSD1306 OLED thất bại"));
while (true); // Dừng chương trình nếu không khởi tạo được OLED
}
// Khởi tạo cảm biến DHT22
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
delay(2000); // Đợi 2 giây để cảm biến khởi tạo
}
void loop() {
TempAndHumidity data = dhtSensor.getTempAndHumidity();
// In ra dữ liệu lên Serial Monitor
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
// Xóa màn hình OLED
oled.clearDisplay();
// Hiển thị nhiệt độ và độ ẩm trên màn hình OLED
oled.setTextSize(1); // Thiết lập kích thước chữ
oled.setTextColor(WHITE); // Thiết lập màu chữ
oled.setCursor(0, 0); // Thiết lập vị trí để hiển thị (x,y)
oled.print("Humidity: " + String(data.humidity, 1) + "%");
oled.setCursor(0, 10); // Đặt con trỏ để hiển thị nhiệt độ
oled.print("Temp: " + String(data.temperature, 2) + " C");
oled.display(); // Hiển thị trên OLED
delay(2000); // Đợi 2 giây để đọc dữ liệu mới từ cảm biến
}