#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.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);
RTC_DS1307 rtc;
void setup() {
Serial.begin(115200);
rtc.begin(); // Initialize RTC module
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
//delay(2000);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
// Display static text
display.println("Hello, world!");
display.display();
delay(2000);
}
void loop() {
DateTime now = rtc.now();
display.clearDisplay();
display.setCursor(0, 0);
display.println("Date: " + String(now.day()) + "/" + String(now.month()) + "/" + String(now.year()));
display.println("Time: " + String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second()));
display.display();
delay(100);
}
/*
ESP32 có thể vừa đọc dữ liệu từ DS1307 và hiển thị lên OLED SSD1306 trên cùng một
đường I2C bởi vì giao thức I2C cho phép nhiều thiết bị chia sẻ cùng một đường truyền
(bus) I2C. Mỗi thiết bị được gán một địa chỉ duy nhất trên bus I2C, và ESP32 có thể
truy cập vào từng thiết bị bằng cách gửi tín hiệu điều khiển (control signal) với địa chỉ tương ứng.
Trong trường hợp này, ESP32 được sử dụng làm master device trên bus I2C, nghĩa
là nó sẽ điều khiển các thiết bị khác trên bus. ESP32 có thể gửi tín hiệu điều
khiển với địa chỉ của DS1307 để yêu cầu dữ liệu thời gian hiện tại, sau đó đọc
dữ liệu trả về từ DS1307. Sau đó, ESP32 có thể gửi tín hiệu điều khiển với địa
chỉ của SSD1306 để hiển thị thông tin thời gian trên màn hình OLED. Các thiết
bị khác trên bus I2C sẽ không bị ảnh hưởng bởi các tín hiệu điều khiển này do
chúng có địa chỉ khác nhau và không đáp ứng với các tín hiệu không dành cho chúng.
Vì vậy, việc sử dụng cùng một đường I2C để truyền dữ liệu giữa nhiều thiết
bị khác nhau là rất tiện lợi và tiết kiệm chi phí phát triển sản phẩm.
*/