Hackster is hosting Hackster Holidays, Ep. 6: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Monday!Stream Hackster Holidays, Ep. 6 on Monday!
cstram
Published © LGPL

Yet another Arduino clock.... But this is a nice one :-)

A transparent display, my mania of numbers, plexiglass.... Yes you have a nice clock.

BeginnerFull instructions provided263
Yet another Arduino clock.... But this is a nice one :-)

Things used in this project

Hardware components

DFRobot Transparent Display
×1
Arduino Nano 33 IoT
Arduino Nano 33 IoT
×1

Hand tools and fabrication machines

Drill / Driver, Cordless
Drill / Driver, Cordless

Story

Read more

Schematics

Diagram

Code

Nice Display Clock

Arduino
// Sketch clock with Arduino and DF Robot Transparent Display 
// Carlo Stramaglia
// 26 March 2022
// Youtube channel https://www.youtube.com/c/CarloStramaglia


#include <Arduino.h>
#include <U8g2lib.h>
#include <WiFiNINA.h>
#include <UnixTime.h>
#include "arduino_secrets.h"

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

UnixTime tm (1);

int Year;
int Month;
int Day;
int Hour;
int Minute;
int Second;
int Status=0;
long SecondsToEnd;


U8G2_SSD1309_128X64_NONAME0_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 5, /* dc=*/ 7, /* reset=*/ 6);

///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key index number (needed only for WEP)

int status = WL_IDLE_STATUS;

void printWifiStatus()
{
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("Signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}



void setup() {
  Serial.begin(115200);
  u8g2.begin();
  WiFi.begin(SECRET_SSID, SECRET_PASS);
  delay(1000);
  
  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED)
  {    
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.status();
    delay(1000);
  }

  printWifiStatus();

}

void loop() {

  int i;
  
  for (i=0; i< 20; i++)
    display();
  for (i=0; i< 20; i++)
    secondsToYear();
  for (i=0; i< 20; i++)
    secondsToMonth();
  for (i=0; i< 20; i++)
    secondsToDay();
}

//Display second to end of day
void secondsToDay()
{
  char buf[40];
  tm.getDateTime (WiFi.getTime());
  Day = tm.day;
  Month = tm.month;
  Year = tm.year;
  Hour = tm.hour;
  Minute = tm.minute;
  Second = tm.second;
  
    SecondsToEnd = (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;      
    
  
  Serial.print ("Time: ");
  Serial.print (Hour);
  Serial.print (Minute);
  Serial.println (Second);
  Serial.print ("Seconds to end of day: ");
  sprintf(buf, "%.8ld", SecondsToEnd);
  Serial.println (buf);

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB18_tr);

  u8g2.drawStr(5,50, buf);
  sprintf(buf, "Seconds To Day End");
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(1,10, buf);
  u8g2.sendBuffer();

  delay(1000);
}

// Display Seconds to end of the month
void secondsToMonth()
{
  char buf[40];
  tm.getDateTime (WiFi.getTime());
  Day = tm.day;
  Month = tm.month;
  Year = tm.year;
  Hour = tm.hour;
  Minute = tm.minute;
  Second = tm.second;
  
  if (Month == 1 or Month == 3 or Month == 5 or Month == 7 or Month == 8 or Month == 10 or Month == 12)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (31-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(31-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    } 
    else
      SecondsToEnd = (long)(23-Hour)*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;      
    
  }
    
  else if (Month == 2)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (27-Day);
    if (Day != 28)
    {
      SecondsToEnd = (long)(27-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    } 
    else
      SecondsToEnd = (long)(23-Hour)*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  else if (Month == 4 or Month == 6 or Month == 9 or Month == 11)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (29-Day);
    if (Day !=30)
    {
      SecondsToEnd = (long)(29-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    } 
    else
      SecondsToEnd = (long)(23-Hour)*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  
  Serial.print ("Time: ");
  Serial.print (Hour);
  Serial.print (Minute);
  Serial.println (Second);
  Serial.print ("Seconds to end of month: ");
  sprintf(buf, "%.8ld", SecondsToEnd);
  Serial.println (buf);

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB18_tr);

  u8g2.drawStr(5,50, buf);
  sprintf(buf, "Seconds To Month End");
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0,10, buf);
  u8g2.sendBuffer();
  delay(1000);
}

// Display Seconds to end of the year
void secondsToYear()
{
  char buf[40];
  tm.getDateTime (WiFi.getTime());
  Day = tm.day;
  Month = tm.month;
  Year = tm.year;
  Hour = tm.hour;
  Minute = tm.minute;
  Second = tm.second;
  
  if (Month == 1)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (31-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(31-Day)*24*60*60; //da aggiungere
      SecondsToEnd = SecondsToEnd + (long)28*24*60*60;
    }
    else 
      SecondsToEnd = (long)28*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)6*31*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)4*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
  }
    
  else if (Month == 2)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (27-Day);
    if (Day != 28)
    {
      SecondsToEnd = (long)(27-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)6*31*24*60*60;
    }
    else
      SecondsToEnd = (long)6*31*24*60*60;
 
    SecondsToEnd = SecondsToEnd + (long)4*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  else if (Month == 3)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (30-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(30-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)5*31*24*60*60;
    }
    else
      SecondsToEnd = (long)5*31*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)4*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
  
  }
  else if (Month == 4)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (29-Day);
    if (Day != 30)
    {
      SecondsToEnd = (long)(24-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)5*31*24*60*60;
    }
    else
      SecondsToEnd = (long)5*31*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)3*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;  
    
  }
  else if (Month == 5)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (30-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(30-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)4*31*24*60*60;
    }
    else
      SecondsToEnd = (long)4*31*24*60*60;
    
    SecondsToEnd = SecondsToEnd + (long)3*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
  }
  else if (Month == 6)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (29-Day);
    if (Day !=30)
    {
      SecondsToEnd = (long)(29-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)4*31*24*60*60;
    }
    else
      SecondsToEnd = (long)4*31*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)2*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
  }
  else if (Month == 7)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (30-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(30-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)3*31*24*60*60;
    }
    else
      SecondsToEnd = (long)3*31*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)2*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
  }
  else if (Month == 8)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (30-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(30-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)2*31*24*60*60;
    }
    else
      SecondsToEnd = (long)2*31*24*60*60;
    
    SecondsToEnd = SecondsToEnd + (long)2*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
  }
  else if (Month == 9)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (29-Day);
    if (Day != 30)
    {
      SecondsToEnd = (long)(29-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)2*31*24*60*60;
    }
    else
      SecondsToEnd = (long)2*31*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)1*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  else if (Month == 10)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (30-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(30-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)1*31*24*60*60;
    }
    else
      SecondsToEnd = (long)1*31*24*60*60;
    
    SecondsToEnd = SecondsToEnd + (long)1*30*24*60*60;
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  else if (Month == 11)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (29-Day);
    if (Day != 30)
    {
      SecondsToEnd = (long)(29-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)1*31*24*60*60;
    }
    else
      SecondsToEnd = (long)1*31*24*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  else if (Month == 12)
  {
    Serial.print ("Days to end of month: ");
    Serial.println (30-Day);
    if (Day != 31)
    {
      SecondsToEnd = (long)(30-Day)*24*60*60;
      SecondsToEnd = SecondsToEnd + (long)(23-Hour)*60*60;
    }
    else
      SecondsToEnd = (long)(23-Hour)*60*60;
      
    SecondsToEnd = SecondsToEnd + (long)(59-Minute)*60;
    SecondsToEnd = SecondsToEnd + (long)60-Second;
    
  }
  
  Serial.print ("Months to end of year: ");
  Serial.println (12-Month);
  Serial.print ("Year now: ");
  Serial.println (tm.year);
  Serial.print ("Time: ");
  Serial.print (Hour);
  Serial.print (Minute);
  Serial.println (Second);
  Serial.print ("Seconds to end of year: ");
  sprintf(buf, "%.8ld", SecondsToEnd);
  Serial.println (buf);
  
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB18_tr);

  u8g2.drawStr(5,50, buf);
  sprintf(buf, "Seconds To Year End");
  u8g2.setFont(u8g2_font_ncenB08_tr);
  u8g2.drawStr(0,10, buf);
  u8g2.sendBuffer();
  
  delay(1000);
}


// Display Ora a data
void display()
{
  char buf[40];
  char monthWord[40];
  tm.getDateTime (WiFi.getTime());

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_ncenB08_tr);

  switch (tm.month)
  {
    case 1:
    sprintf(monthWord,"January");
    break;
    case 2:
    sprintf(monthWord,"February");
    break;
    case 3:
    sprintf(monthWord,"March");
    break;
    case 4:
    sprintf(monthWord,"April");
    break;
    case 5:
    sprintf(monthWord,"May");
    break;
    case 6:
    sprintf(monthWord,"June");
    break;
    case 7:
    sprintf(monthWord,"July");
    break;
    case 8:
    sprintf(monthWord,"August");
    break;
    case 9:
    sprintf(monthWord,"September");
    break;
    case 10:
    sprintf(monthWord,"October");
    break;
    case 11:
    sprintf(monthWord,"November");
    break;
    case 12:
    sprintf(monthWord,"December");
    break;
    default:
    sprintf(monthWord,"Unknown");
    break;
  }
  
  sprintf(buf, "%.2d %s %d", tm.day, monthWord, tm.year);
  Serial.print ("Date: ");
  Serial.println(buf);
  u8g2.drawStr(20,10, buf);

  switch (tm.dayOfWeek)
  {
    case 1:
    sprintf(buf,"Monday");
    break;
    case 2:
    sprintf(buf,"Tuesday");
    break;
    case 3:
    sprintf(buf,"Wednesday");
    break;
    case 4:
    sprintf(buf,"Thursday");
    break;
    case 5:
    sprintf(buf,"Friday");
    break;
    case 6:
    sprintf(buf,"Saturday");
    break;
    case 7:
    sprintf(buf,"Sunday");
    break;
    default:
    sprintf(buf,"Unknown");
    break;
  }
  Serial.print ("Day of Week: ");
  Serial.println(buf);
  u8g2.drawStr(35,30, buf);
   
  sprintf(buf, "%.2d:%.2d:%.2d", tm.hour, tm.minute, tm.second);
  Serial.print ("Time: ");
  Serial.println(buf);
  u8g2.drawStr(35,50, buf);   
    
  u8g2.sendBuffer();          
 
  delay(1000);

}

Credits

cstram

cstram

16 projects • 21 followers
Passionate about IT, Electronics and DIY. Strong believer in Raspberry and Arduino devices. Experience in digital television and security.

Comments