//#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, 4); // (SCREEN_WIDTH,SCREEN_HEIGHT,wire,OLED_RESET)
// data refreshed frmo RTC :
String sHour="00"; String sMinute="00"; String sSecond="00";
String sDay="01"; String sMonth="01"; String sYear="2024";
int debuglight=1; // debug
#define BTN_PIN 8
// Setup
void setup() {
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
pinMode(8, INPUT_PULLUP); // connect the btn
display.clearDisplay();
localDrawRect( 0, 0, display.width(), display.height(), WHITE ); // startCol, startLine, endCol, endLine, color
drawCalendarLines();
display.setTextColor( SSD1306_WHITE ); // Draw white text
display.setCursor(4,11);
display.println(F("SE TE QA QI SE SA DM"));
display.setCursor(4,20);
display.println(F("01 02 03 04 05 06 07"));
display.setCursor(4,29);
display.println(F("08 09 10 11 12 13 14"));
display.setCursor(4,38);
display.println(F("15 16 17 18 19 20 21"));
display.setCursor(4,47);
display.println(F("22 23 24 25 26 27 28"));
display.setCursor(4,56);
display.println(F("29 30 31"));
display.display();
}
void loop() {
readRTC();
display.setTextColor(WHITE, BLACK); // Draw white text
display.setCursor(4,1);
display.println("Dec:"+sHour+":"+sMinute+":"+sSecond);
// Check if btn was pressed
if ( digitalRead(BTN_PIN) == HIGH ) {
digitalWrite( 13 , debuglight ); debuglight = invert01(debuglight);
}
display.display();
delay(1000);
}
// Draw the lines for the calendar dates, its fixed and draw only once at start
void drawCalendarLines() {
int16_t i; // Draw day lines separators
for(i=1; i<7; i+=1)
localDrawLine( 0,9*i,display.width(),9*i,WHITE ); // startCol, startLine, endCol, endLine, color
for(i=1; i<7; i+=1) // Draw day Colunms separators
localDrawLine( 18*i , 18 , 18*i , display.height() , WHITE ); // startCol, startLine, endCol, endLine, color
}
// Draw a rect, ex: localDrawRect( 0, 0, display.width()-2, display.height()-2, SSD1306_WHITE);
void localDrawRect( int startCol, int startLine, int endCol, int endLine, int color ) {
display.drawRect( startCol, startLine, endCol, endLine, color );
display.display(); //delay(1);
}
// Draw a single like, ex: display.drawLine(0, 0, 0, display.height()-1, SSD1306_WHITE);
void localDrawLine( int startCol, int startLine, int endCol, int endLine, int color ) {
display.drawLine( startCol, startLine, endCol, endLine, color );
display.display(); //delay(1);
}
// Used for rtc data get, conversion and set into strings
void readRTC() {
char Time[] = " : : "; char Calendar[] = " / /20 ";
byte _second, _minute, _hour, _day, _date, _month, _year;
Wire.beginTransmission(0x68); // Start I2C protocol with DS1307 address
Wire.write(0); // Send register address
Wire.endTransmission(false); // I2C restart
Wire.requestFrom(0x68, 7); // Request 7 bytes from DS1307 and release I2C bus at end of reading
_second = Wire.read(); // Read seconds from register 0
_minute = Wire.read(); // Read minuts 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
// convertBCDtoDecimal :
_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[7] = _second % 10 + 48;
Time[6] = _second / 10 + 48;
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;
// Save date time info into strings with complete0 at left
sHour=""; sHour+=Time[0]; sHour+=Time[1]; if(sHour.length()==1) sHour="0"+sHour;
sMinute=""; sMinute+=Time[3]; sMinute+=Time[4]; if(sMinute.length()==1) sMinute="0"+sMinute;
sSecond=""; sSecond+=Time[6]; sSecond+=Time[7]; if(sSecond.length()==1) sSecond="0"+sSecond;
sDay=""; sDay+=Calendar[0]; sDay+=Calendar[1]; if(sDay.length()==1) sDay="0"+sDay;
sMonth=""; sMonth+=Calendar[3]; sMonth+=Calendar[4]; if(sMonth.length()==1) sMonth="0"+sMonth;
sYear=""; sYear+=Calendar[8]; sYear+=Calendar[9]; if(sYear.length()==1) sYear="0"+sYear;
}
// Used to invert a int boolean
int invert01( int v01) { if(v01==0) return 1; else return 0;}