#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define segR 0
#define sh 10 //short line segment (10px - defult)
#define lg 11 //long line segment (11px - defult)
#define thk 2 //thick line segment (2px - defult)
#define digit1 0
#define digit2 17
#define digit3 43
#define digit4 60
bool blinkFlag = false;
unsigned long lastTimeBlink = 0;
unsigned long ms10 = 0;
const int timer = 200;
const int count = 6;
const int dispCount =4;
byte a[4],an,i;
int minute,hour, msec;
int move,a,b,c,d,e,f,g,segm;
int DM=700;
//int DM=70000;
int dotDel=800;
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Default OLED address, usually
//numEight();
//loading();
//errMs();
hours();
minutes();
}
void loop() {
}
void loading(){
for (int ldng=0; ldng<=6; ldng++){
display.clearDisplay();
segD();
delay(100);
display.display();
display.clearDisplay();
segE();
delay(100);
display.display();
display.clearDisplay();
segF();
delay(100);
display.display();
display.clearDisplay();
segA();
delay(100);
display.display();
display.clearDisplay();
segB();
delay(100);
display.display();
display.clearDisplay();
segC();
delay(100);
display.display();
display.clearDisplay();
}
}
void segment(){
switch(segm){
case 0: display.clearDisplay(); segA(); segB(); segC(); segD(); segE(); segF(); delay(timer); display.display(); break;
case 1: display.clearDisplay(); segB(); segC(); delay(timer); display.display(); break;
case 2: display.clearDisplay(); segA(); segB(); segD(); segE(); segG(); delay(timer); display.display(); break;
case 3: display.clearDisplay(); segA(); segB(); segC(); segD(); segG(); delay(timer); display.display(); break;
case 4: display.clearDisplay(); segB(); segC(); segF(); segG(); delay(timer); display.display(); break;
case 5: display.clearDisplay(); segA(); segC(); segD(); segF(); segG(); delay(timer); display.display(); break;
case 6: display.clearDisplay(); segA(); segC(); segD(); segE(); segF(); segG(); delay(timer); display.display(); break;
case 7: display.clearDisplay(); segA(); segB(); segC(); delay(timer); display.display(); break;
case 8: display.clearDisplay(); segA(); segB(); segC(); segD(); segE(); segF(); segG(); delay(timer); display.display(); break;
case 9: display.clearDisplay(); segA(); segC(); segD(); segB(); segF(); segG(); delay(timer); display.display(); break;
}
}
void hours(){
segment();
}
void minutes(){
segment();
}
void segA(){
switch(i){
case 0: display.fillRoundRect (29+digit1, 2, sh, thk, segR, SSD1306_INVERSE); break;
case 1: display.fillRoundRect (29+digit2, 2, sh, thk, segR, SSD1306_INVERSE); break;
case 3: display.fillRoundRect (29+digit3, 2, sh, thk, segR, SSD1306_INVERSE); break;
case 4: display.fillRoundRect (29+digit4, 2, sh, thk, segR, SSD1306_INVERSE); break;
}
}
void segB(){
switch(i){
case 0: display.fillRoundRect (39+digit1, 4, thk,lg, segR , SSD1306_INVERSE); break;
case 1: display.fillRoundRect (39+digit2, 4, thk,lg, segR , SSD1306_INVERSE); break;
case 3: display.fillRoundRect (39+digit3, 4, thk,lg, segR , SSD1306_INVERSE); break;
case 4: display.fillRoundRect (39+digit4, 4, thk,lg, segR , SSD1306_INVERSE);break;
}
}
void segC(){
switch(i){
case 0: display.fillRoundRect (39+digit1, 17, thk,lg, segR, SSD1306_INVERSE); break;
case 1: display.fillRoundRect (39+digit2, 17, thk,lg, segR, SSD1306_INVERSE); break;
case 3: display.fillRoundRect (39+digit3, 17, thk,lg, segR, SSD1306_INVERSE); break;
case 4: display.fillRoundRect (39+digit4, 17, thk,lg, segR, SSD1306_INVERSE);break;
}
// The INVERSE color is used so round-rects alternate white/black
}
void segD(){
switch(i){
case 0: display.fillRoundRect (29+digit1, 28, sh, thk, segR, SSD1306_INVERSE); break;
case 1: display.fillRoundRect (29+digit2, 28, sh, thk, segR, SSD1306_INVERSE); break;
case 3: display.fillRoundRect (29+digit3, 28, sh, thk, segR, SSD1306_INVERSE); break;
case 4: display.fillRoundRect (29+digit4, 28, sh, thk, segR, SSD1306_INVERSE); break;
}
}
void segE(){
switch(i){
case 0: display.fillRoundRect (27+digit1, 17, thk,lg, segR, SSD1306_INVERSE); break;
case 1: display.fillRoundRect (27+digit2, 17, thk,lg, segR, SSD1306_INVERSE); break;
case 3: display.fillRoundRect (27+digit3, 17, thk,lg, segR, SSD1306_INVERSE); break;
case 4: display.fillRoundRect (27+digit4, 17, thk,lg, segR, SSD1306_INVERSE); break;
}
}
void segF(){
switch(i){
case 0: display.fillRoundRect (27+digit1, 4, thk,lg, segR , SSD1306_INVERSE); break;
case 1: display.fillRoundRect (27+digit2, 4, thk,lg, segR , SSD1306_INVERSE); break;
case 3: display.fillRoundRect (27+digit3, 4, thk,lg, segR , SSD1306_INVERSE); break;
case 4: display.fillRoundRect (27+digit4, 4, thk,lg, segR , SSD1306_INVERSE); break;
}
}
void segG(){
switch(i){
case 0: display.fillRoundRect (29+digit1, 15, sh, thk, segR, SSD1306_INVERSE); break;
case 1: display.fillRoundRect (29+digit2, 15, sh, thk, segR, SSD1306_INVERSE); break;
case 3: display.fillRoundRect (29+digit3, 15, sh, thk, segR, SSD1306_INVERSE); break;
case 4: display.fillRoundRect (29+digit4, 15, sh, thk, segR, SSD1306_INVERSE); break;
}
// The INVERSE color is used so round-rects alternate white/black
}
void blinkPoint() {
if (millis() - lastTimeBlink >= dotDel) {
if (blinkFlag) {
display.fillRoundRect (63, 10, 3, 3, 0, SSD1306_INVERSE);
display.fillRoundRect (63, 20, 3, 3, 0, SSD1306_INVERSE);
blinkFlag = !blinkFlag;
} else {
display.fillRoundRect (63, 10, 3, 3, 0, SSD1306_INVERSE);
display.fillRoundRect (63, 20, 3, 3, 0, SSD1306_INVERSE);
blinkFlag = !blinkFlag;
}
lastTimeBlink = millis();
}
}