Internet OLED Clock
Uses NTP server to display day, date, time in analog and digital fashion using OLED display.
Components and supplies
1
OLED Display 128x64 0.96 inch, I2C Interface
1
NodeMCU ESP8266 Breakout Board
1
Jumper Wires
Apps and platforms
1
Arduino IDE
Project description
Code
Source Code
arduino
1//Self Adjusting OLED Clock 2//by Shubham Santosh 3 4 5#include<ESP8266WiFi.h> 6#include<NTPClient.h> 7#include<WiFiUdp.h> 8#include<SPI.h> 9#include<Adafruit_SSD1306.h> 10#include<Adafruit_GFX.h> 11#include<Wire.h> 12 13#define utcoffset 19800 // adds 19800 seconds = 5hr and 30 mins 14 15Adafruit_SSD1306 display(128,64,&Wire,-1); 16WiFiUDP ntp; 17NTPClient timeclient(ntp,"asia.pool.ntp.org",utcoffset); 18 19const char *ssid= " Enter SSID"; // enter SSID of your WiFi router 20const char *password= "Enter Password"; // enter password of the router 21 22 23String Week[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; 24 25void setup() { 26 Serial.begin(115200); 27 WiFi.begin(ssid,password); 28 display.begin(SSD1306_SWITCHCAPVCC,0x3C); 29 /*if(!(display.begin(SSD1306_SWITCHCAPVCC,0x3C))) 30 { 31 Serial.println("Connection Error"); 32 while (true) 33 {continue;} 34 } 35 */ 36 delay(1000); 37 38 // animation 39display.clearDisplay(); 40display.setTextColor(WHITE); 41display.setCursor(0,0); 42display.setTextSize(2); 43display.println("OLED"); 44display.setCursor(0,32); 45display.println("CLOCK"); 46display.display(); 47display.startscrollright(0x00,0x05); 48delay(1500); 49display.invertDisplay(1); 50display.stopscroll(); 51delay(1000); 52 53 // displays ssid of the router to be connected 54display.invertDisplay(0); 55display.clearDisplay(); 56display.setCursor(0,0); 57display.setTextColor(WHITE); 58display.setTextSize(2); 59display.println("CONNECTING"); 60display.setCursor(52,16); 61display.println("TO"); 62display.setTextSize(1); 63display.println(ssid); 64display.display(); 65while(WiFi.status()!=WL_CONNECTED) 66{ 67 Serial.print("."); 68 delay(500); 69} 70display.setCursor(0,48); 71display.setTextSize(2); 72display.setTextColor(BLACK,WHITE); 73display.print("Connected"); 74display.display(); 75delay(500); 76display.clearDisplay(); 77display.setTextSize(1); 78display.setTextColor(WHITE); 79} 80 81 82const int xcenter=90; //x and y center points for clock 83const int ycenter=32; 84const int radius=30; // radius of clock 85 86 87void loop() { 88 timeclient.update(); 89 display.setCursor(0,0); 90 display.setTextSize(2); 91 display.setTextColor(BLACK,WHITE); 92 display.println("INDIA"); 93 display.setTextColor(WHITE); 94 display.setTextSize(1); 95 display.println(); 96 display.println(Week[timeclient.getDay()]); 97 display.println(); 98 display.println(timeclient.getFormattedTime()); 99 display.println(); 100 101 // to obtain and display date 102 103 int epochtime=timeclient.getEpochTime(); 104 struct tm *ptm = gmtime ((time_t *)&epochtime); 105 display.print(ptm->tm_mday); 106 display.print(":"); 107 display.print( ptm->tm_mon+1); 108 display.print(":"); 109 display.println(ptm->tm_year+1900); 110 111 // to display clock 112 113 display.drawCircle(xcenter,ycenter,radius,WHITE); 114 displaytime(timeclient.getHours(),timeclient.getMinutes(),timeclient.getSeconds()); 115 display.display(); 116 display.clearDisplay(); 117 delay(1000); 118} 119 120void displaytime(int hours,int mins,int secs) 121{ 122 int Sangle=secs*6; // second angle 123 int Mangle=mins*6; //minute angle 124 int Hangle; // hour angle 125 if(hours>=0 and hours<=12) 126 Hangle=30*hours+map(mins,0,60,0,30); // map for minor adjustments in hour hand 127 else if(hours>12) // hour format is 24hrs 128 Hangle=(hours-12)*30+map(mins,0,60,0,30); 129 130 //for displaying seconds 131 int shiftSecX=0.8*radius*sin(Sangle*0.0174533); //shifted x coordinate of second,0.8 is the 132 int shiftSecY=0.8*radius*cos(Sangle*0.0174533); //shifted y coordinate of second 133 134 // if(Sangle>=0 and Sangle<=90) 135 display.drawLine(xcenter,ycenter,xcenter+shiftSecX,ycenter-shiftSecY,WHITE); //1st quadrant 136/* else if(Sangle>90 and Sangle<=180) 137 display.drawLine(xcenter,ycenter,xcenter+shiftSecX,ycenter-shiftSecY,WHITE); //4th quadrant 138 else if(Sangle>180 and Sangle<=270) 139 display.drawLine(xcenter,ycenter,xcenter+shiftSecX,ycenter-shiftSecY,WHITE); // 3rd quadrant 140 else if(Sangle>270 and Sangle<=354) 141display.drawLine(xcenter,ycenter,xcenter+shiftSecX,ycenter-shiftSecY,WHITE); // 2nd quadrant 142*/ 143//for displaying minutes 144 int shiftMinX=radius*sin(Mangle*0.0174533); //shifted x coordinate of minutes 145 int shiftMinY=radius*cos(Mangle*0.0174533); //shifted y coordinate of minutes 146 147 display.drawLine(xcenter,ycenter,xcenter+shiftMinX,ycenter-shiftMinY,WHITE); 148 149//for displaying hours 150 int shiftHourX=0.6*radius*sin(Hangle*0.0174533); //shifted x coordinate of hours 151 int shiftHourY=0.6*radius*cos(Hangle*0.0174533); //shifted y coordinate of hours 152 153 display.drawLine(xcenter,ycenter,xcenter+shiftHourX,ycenter-shiftHourY,WHITE); 154 155/* 156// for testing purpose 157 Serial.print(Sangle); 158 Serial.print("\ "); 159 Serial.print(sin(Sangle*0.0174533)); 160 Serial.print("\ "); 161 Serial.print(cos(Sangle*0.0174533)); 162 Serial.print("\ "); 163 Serial.println(timeclient.getSeconds()); 164*/ 165}
Downloadable files
Sketch
Sketch

Sketch
Sketch

Comments
Only logged in users can leave comments