#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <U8g2_for_Adafruit_GFX.h>
RTC_DS1307 rtc;
#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 sharing Arduino reset pin)
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire, -1);
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2_for_adafruit_gfx;
char daysOfTheWeek[7][12] = {"MIN", "SEN", "SEL", "RAB", "KAM", "JUM", "SAB"};
static const unsigned char PROGMEM Star[] = {
0x92,0x54,0x38,0xfe,0x38,0x54,0x92
};
void setup() {
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
u8g2_for_adafruit_gfx.begin(display); // connect u8g2 procedures to Adafruit GFX
/*intialize OLED display*/
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.setTextColor(WHITE);
u8g2_for_adafruit_gfx.setCursor(10,18);
u8g2_for_adafruit_gfx.setFontMode(1);
u8g2_for_adafruit_gfx.setFontDirection(0);
u8g2_for_adafruit_gfx.setForegroundColor(WHITE);
//display.setTextSize(2);
u8g2_for_adafruit_gfx.setFont(u8g2_font_timB24_tn);
u8g2_for_adafruit_gfx.print("Bismillah");
display.display();
delay(2500);
//display.display(); //display initial Adafruit logo
//delay(2000);
// Clear the buffer
display.clearDisplay();
display.display();
}
String MonthText(uint8_t Month){
String MonthText;
if (Month == 1) MonthText = "JAN";
if (Month == 2) MonthText = "FEB";
if (Month == 3) MonthText = "MAR";
if (Month == 4) MonthText = "APR";
if (Month == 5) MonthText = "MAI";
if (Month == 6) MonthText = "JUN";
if (Month == 7) MonthText = "JUL";
if (Month == 8) MonthText = "AGU";
if (Month == 9) MonthText = "SEP";
if (Month == 10) MonthText = "OKT";
if (Month == 11) MonthText = "NOP";
if (Month == 12) MonthText = "DES";
return MonthText;
}
String AddLeadingZero(uint8_t x){
String AddLeadingZeroText;
if (x < 10) AddLeadingZeroText = "0";
else AddLeadingZeroText = "";
AddLeadingZeroText = AddLeadingZeroText + x;
return AddLeadingZeroText;
}
void drawCurrentTime(int x, int y, uint8_t h, uint8_t i, uint8_t s){
display.setCursor(x, y);
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.println(AddLeadingZero(h));
x += 30;
display.setCursor(x, y);
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.println(":");
x += 12;
display.setCursor(x, y);
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.println(AddLeadingZero(i));
x += 35;
display.setCursor(x, (y + 14));
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.println(AddLeadingZero(s));
}
void drawCentreString(String text, int y, int width=SCREEN_WIDTH, int textSize=1, int textColor=SSD1306_BLACK) {
// Calculate the length of the text to determine the center position
int16_t positionX, positionY;
uint16_t textWidth, textHeight;
display.setTextSize(textSize);
display.getTextBounds(text.c_str(), 0, 0, &positionX, &positionY, &textWidth, &textHeight);
int s_width = SCREEN_WIDTH;
if (SCREEN_WIDTH != width) {
s_width = width;
}
int16_t textX = (s_width - textWidth) / 2;
// Display text on center
display.setCursor(textX, y);
display.setTextSize(textSize);
display.setTextColor(textColor);
display.println(text);
}
void clockState() {
DateTime now = rtc.now();
display.fillRect(0, 0, 128, 32, SSD1306_BLACK);
display.fillRect(1, 1, 32, 9, SSD1306_WHITE);
display.fillRect(1, 11, 32, 20, SSD1306_WHITE);
display.fillRect(0, 32, 128, 35, SSD1306_WHITE);
// display Day of Week
display.setCursor(2, 2);
display.setTextSize(1);
display.setTextColor(SSD1306_BLACK);
display.println(daysOfTheWeek[now.dayOfTheWeek()]);
display.drawBitmap(22, 2, Star, 7, 7, BLACK);
// display Day Month Year
display.setCursor(2, 13);
display.setTextSize(1);
display.setTextColor(SSD1306_BLACK);
if(now.day() < 10) display.print(0);
display.println(now.day());
display.setCursor(15, 13);
display.setTextSize(1);
display.setTextColor(SSD1306_BLACK);
display.println(MonthText(now.month()));
drawCentreString(String(now.year()), 22, 35);
display.setCursor(13, 35);
display.setTextSize(3);
display.println("SCOOPY");
// display CurrentTime
drawCurrentTime(37, 5, now.hour(), now.minute(), now.second());
display.display();
delay(1000);
}
void loop() {
clockState();
}