#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
RTC_DS3231 rtc;
DHT dht(2, DHT22);
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Tidak dapat menemukan RTC DS3231. Pastikan koneksi sudah benar!");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya. Atur waktu RTC terlebih dahulu.");
}
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
}
display.display();
delay(2000);
display.clearDisplay();
display.display();
dht.begin();
}
String DayOfTheWeek(uint8_t Day){
String DayText;
if (Day==1) DayText="Monday";
if (Day==2) DayText="Tuesday";
if (Day==3) DayText="Wednesday";
if (Day==4) DayText="Thursday";
if (Day==5) DayText="Friday";
if (Day==6) DayText="Saturday";
if (Day==7) DayText="Sunday";
return DayText;
}
String DayMonthYear(uint8_t Day,uint8_t Month,uint16_t Year){
String DayMonthYearText;
if (Month==1) DayMonthYearText="JAN ";
if (Month==2) DayMonthYearText="FEB ";
if (Month==3) DayMonthYearText="MAR ";
if (Month==4) DayMonthYearText="APR ";
if (Month==5) DayMonthYearText="MAY ";
if (Month==6) DayMonthYearText="JUN ";
if (Month==7) DayMonthYearText="JUL ";
if (Month==8) DayMonthYearText="AUG ";
if (Month==9) DayMonthYearText="SEP ";
if (Month==10) DayMonthYearText="OCT ";
if (Month==11) DayMonthYearText="NOV ";
if (Month==12) DayMonthYearText="DEC ";
DayMonthYearText=DayMonthYearText+Day;
if (Day==1)DayMonthYearText=DayMonthYearText+"st ";
if (Day==2)DayMonthYearText=DayMonthYearText+"nd ";
if (Day>2)DayMonthYearText=DayMonthYearText+"th ";
DayMonthYearText=DayMonthYearText+Year;
return DayMonthYearText;
}
String AddLeadingZero(uint8_t x){
String AddLeadingZeroText;
if(x<10) AddLeadingZeroText="0";
else AddLeadingZeroText="";
AddLeadingZeroText=AddLeadingZeroText+x;
return AddLeadingZeroText;
}
String CurrentTime(uint8_t h, uint8_t i ){
String CurrentTimeText="";
CurrentTimeText=CurrentTimeText + AddLeadingZero(h) +":"+AddLeadingZero(i);
return CurrentTimeText;
}
void loop() {
DateTime now = rtc.now();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
display.fillRect(0, 0, 128, 16, SSD1306_WHITE);
display.fillRect(0, 16, 128, 28, SSD1306_BLACK);
display.fillRect(0, 28, 128, 46, SSD1306_WHITE);
display.fillRect(0, 46, 128, 64, SSD1306_BLACK);
display.setCursor(15, 1);
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK);
display.println(DayOfTheWeek(now.dayOfTheWeek()));
display.setCursor(1, 18);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.println(DayMonthYear(now.day(), now.month(), now.year()));
display.setCursor(15, 30);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.println(CurrentTime(now.hour(), now.minute()));
display.setCursor(75, 30);
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK);
display.println(":");
display.setCursor(87, 30);
display.setTextSize(2);
display.setTextColor(SSD1306_BLACK);
display.println(AddLeadingZero(now.second()));
display.setCursor(2, 48);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.println("Temp");
display.setCursor(55, 48);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.print(temperature);
display.setCursor(116, 46);
display.setTextSize(1);
display.print("o");
display.display();
delay(1000);
}