#include <Wire.h> // Include Wire library (required for I2C devices)
#include <Adafruit_GFX.h> // Include Adafruit graphics library
#include <Adafruit_SSD1306.h> // Include Adafruit SSD1306 OLED driver
#include <DHT.h> // Include DHT library
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if Display Having four pins VCC GND SCL SDA)
#define DHTPIN 2 // Pin where the DHT22 is connected
#define DHTTYPE DHT22 // DHT22 (AM2302) sensor type
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
DHT dht(DHTPIN, DHTTYPE);
void setup(void) {
delay(1000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C (for the 128x64)
display.clearDisplay();
display.display();
dht.begin(); // Initialize the DHT22 sensor
display.setTextColor(WHITE, BLACK);
}
char time[] = " : "; // Time format HH:MM
char Calendar[] = " / /20 "; // Date format DD/MM/YYYY
char tempHum[] = "00C, 00%"; // Combined temperature and humidity
byte second, minute, hour, day, date, month, year;
bool colonVisible = true;
void display_day() {
switch(day) {
case 1: draw_text(40, 0, " SUNDAY ", 1); break;
case 2: draw_text(40, 0, " MONDAY ", 1); break;
case 3: draw_text(40, 0, " TUESDAY ", 1); break;
case 4: draw_text(40, 0, "WEDNESDAY", 1); break;
case 5: draw_text(40, 0, "THURSDAY ", 1); break;
case 6: draw_text(40, 0, " FRIDAY ", 1); break;
default: draw_text(40, 0, "SATURDAY ", 1);
}
}
void DS3231_display() {
second = (second >> 4) * 10 + (second & 0x0F);
minute = (minute >> 4) * 10 + (minute & 0x0F);
hour = (hour >> 4) * 10 + (hour & 0x0F);
date = (date >> 4) * 10 + (date & 0x0F);
month = (month >> 4) * 10 + (month & 0x0F);
year = (year >> 4) * 10 + (year & 0x0F);
time[4] = minute % 10 + 48;
time[3] = minute / 10 + 48;
time[1] = hour % 10 + 48;
time[0] = hour / 10 + 48;
Calendar[9] = year % 10 + 48;
Calendar[8] = year / 10 + 48;
Calendar[4] = month % 10 + 48;
Calendar[3] = month / 10 + 48;
Calendar[1] = date % 10 + 48;
Calendar[0] = date / 10 + 48;
draw_text(4, 14, Calendar, 2); // Display the date (format: DD/MM/YYYY)
draw_text(30, 35, time, 2); // Display the time (HH:MM)
if (colonVisible) {
draw_text(54, 35, ":", 2); // Display the colon
} else {
draw_text(54, 35, " ", 2); // Clear the colon
}
colonVisible = !colonVisible; // Toggle colon visibility
}
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
display.setCursor(x_pos, y_pos);
display.setTextSize(text_size);
display.print(text);
display.display();
}
void loop() {
// Read temperature and humidity from DHT22
float t = dht.readTemperature();
float h = dht.readHumidity();
// Check if any reads failed and exit early (to try again)
if (isnan(t) || isnan(h)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Convert temperature to integer and format it with humidity
int tempInt = (int)t;
sprintf(tempHum, "%dC, %02d%%", tempInt, (int)h);
// Read the time from the DS3231
Wire.beginTransmission(0x68); // Start I2C protocol with DS3231 address
Wire.write(0); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 7); // Request 7 bytes from DS3231
second = Wire.read(); // Read seconds from register 0
minute = Wire.read(); // Read minutes from register 1
hour = Wire.read(); // Read hour from register 2
day = Wire.read(); // Read day from register 3
date = Wire.read(); // Read date from register 4
month = Wire.read(); // Read month from register 5
year = Wire.read(); // Read year from register 6
display_day();
DS3231_display(); // Display time, date, and temperature/humidity
draw_text(40, 56, tempHum, 1); // Display combined temperature and humidity
delay(1000); // Wait 1 second before updating
}