Digital Clock

Introduction

• The goal and purpose of this project is to build and design a simple Digital Clock with Alarm and LED Matrix Display, to displays the current time and date on LED display and it also can be set to sound an Alarm on a specific time. The clock uses an LED matrix to display the time, and a buzzer to sound the alarm.

General Description

Hardware Design

The following components are required for this project:

• Tiny RTC module with I2C interface

• LED matrix (8×8 or higher)

• 3 Push buttons

• Buzzer for alarm sound

• Arduino Uno

• Breadboard

* 3 Resistors

• Wires

Software Design

The following software requirements are necessary for this project:

• Libraries ( MD_Parola.h, RTClib.h, toneAC.h )

#include <MD_Parola.h>

#include “RTClib.h”

#include <toneAC.h>

RTC_DS1307 RTC;

DateTime now;

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW

#define MAX_DEVICES 4

#define CLK_PIN 13

#define DATA_PIN 11

#define CS_PIN 10

int i = 9;

int Animation;

String RandAn;

MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

Brightness variables int brightness = 5; Initial brightness level

const int brightnessStep = 1; Step to increase/decrease brightness const int brightnessMin = 0; Minimum brightness level

const int brightnessMax = 15; Maximum brightness level Button pin numbers

const int brightnessUpPin = 2;

const int brightnessDownPin = 3;

const int alarmButtonPin = 4; Alarm button pin const int alarmBuzzerPin = 9; Alarm buzzer pin

bool isAlarmEnabled = false;

bool isAlarmOn = false;

char daysOfTheWeek[7][12] = {“sun”, “mon”, “tues”, “wedn”, “thur”, “fri”, “sat”};

char monthOfTheYear[12][12] = {“Jan”, “Feb”, “Mar”, “April”, “May”, “Jun”, “Jul”, “Aug”, “Sept”, “Oct”, “Nov”, “Dec”};

struct sCatalog

{

textEffect_t  effect;   

const char *  psz;      

uint16_t      speed;    

uint16_t      pause;    

};

sCatalog catalog[] =

{

{ PA_PRINT,"",80,3000 },

{ PA_SCROLL_UP,"",80,3000 },

{ PA_SCROLL_DOWN,"",80,3000 },

{ PA_SCROLL_LEFT,"",80,3000 },

{ PA_SCROLL_RIGHT,"",80,3000 },

{ PA_SPRITE,"",80,3000  },

{ PA_SLICE,"",15,3000  },

{ PA_MESH,"",150,3000  },

{ PA_FADE,"",250,3000  },

{ PA_DISSOLVE,"",500,3000  },

{ PA_BLINDS,"",120,3000  },

{ PA_RANDOM,"",50,3000  },

{ PA_WIPE,"",80,3000  },

{ PA_WIPE_CURSOR,"",80,3000  },

{ PA_SCAN_HORIZ,"",80,3000  },

{ PA_SCAN_HORIZX,"",80,3000  },

{ PA_SCAN_VERT,"",80,3000  },

{ PA_SCAN_VERTX,"",80,3000  },

{ PA_OPENING,"",80,3000  },

{ PA_OPENING_CURSOR,"",80,3000  },

{ PA_CLOSING,"",80,3000  },

{ PA_CLOSING_CURSOR,"",80,3000  },

{ PA_SCROLL_UP_LEFT,"",80,3000  },

{ PA_SCROLL_UP_RIGHT,"",80,3000   },

{ PA_SCROLL_DOWN_LEFT,"",80,3000  },

{ PA_SCROLL_DOWN_RIGHT,"",80,3000  },

{ PA_GROW_UP,"",80,3000  },

{ PA_GROW_DOWN,"",80,3000  },

};

Sprite Definitions const uint8_t F_PMAN1 = 6; const uint8_t W_PMAN1 = 8; static const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] = gobbling pacman animation {

0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,

};

const uint8_t F_PMAN2 = 6; const uint8_t W_PMAN2 = 18; static const uint8_t PROGMEM pacman2[F_PMAN2 * W_PMAN2] = ghost pursued by a pacman { 0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe, 0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe, 0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe, 0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe, 0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe, 0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe, }; void setup() { Serial.begin(9600);

P.begin();
P.setInvert(false); 
P.setIntensity(0);
Wire.begin();
RTC.begin();
//if (! RTC.isrunning())
    //{
      //Serial.println("RTC is NOT running!");
      RTC.adjust(DateTime(2023, 5, 30, 15, 15, 0));
    //}

#if ENA_SPRITE

P.setSpriteData(pacman1, W_PMAN1, F_PMAN1, pacman2, W_PMAN2, F_PMAN2);

#endif

      P.displayText("Digital clock ARDUINO - BY- ALNASER SAJJAD" , PA_CENTER, 50, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT); 
       while (!P.displayAnimate());

pinMode(brightnessUpPin, INPUT_PULLUP); pinMode(brightnessDownPin, INPUT_PULLUP); pinMode(alarmButtonPin, INPUT_PULLUP); pinMode(alarmBuzzerPin, OUTPUT); }

const char *ZiuaCurenta = ” ”;

String Hour; String TIMP=” ”; String ORA=” ”; String MINUT=” ”; String SECUNDA=” ”; String DATA=””;

String Day; String Month; String Year; String HumSTR; String CelSTR; String FarSTR;

void loop() {

String DayOfWeek = daysOfTheWeek[now.dayOfTheWeek()];

String MonthOfYear = monthOfTheYear[now.month() - 1];
const char *DayOfWeekC = DayOfWeek.c_str();
const char *MonthOfYearC = MonthOfYear.c_str();

ORA = (now.hour());

if (ORA.length() < 2)
       {
         ORA = "0"+ ORA;
       }

MINUT = (now.minute());

if (MINUT.length() < 2)
       {
         MINUT = "0"+ MINUT;
       }

TIMP = ORA + ”:” + MINUT;

const char *Timp = TIMP.c_str();

Day = now.day();

Month = now.month();
Year = now.year();

const char *Ziua = Day.c_str();

const char *Luna = Month.c_str();
const char *Anul = Year.c_str();

String Date = Day + ”/” + Month + ”/” + Year;

const char *Data = Date.c_str(); 

if (i == 1)

  {
      Animation = random(1, 29);
      P.displayText(DayOfWeekC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect); 
       while (!P.displayAnimate());
  }
if (i == 2)
  {
      Animation = random(1, 29);
      P.displayText(Ziua, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect); 
       while (!P.displayAnimate());
  }
  if (i == 3)
  {
      Animation = random(1, 29);
      P.displayText(MonthOfYearC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect); 
       while (!P.displayAnimate());
  }
  if (i == 4)
  {
      Animation = random(1, 29);
      P.displayText(Anul, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect); 
       while (!P.displayAnimate());
  }

if (i == 5)

  {
      Animation = random(1, 29);
      P.displayText(Timp, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect); 
       while (!P.displayAnimate());
  }

Serial.println(Animation); i= i+1; if (i > 5) { i=1; }; Button handling

if (digitalRead(brightnessUpPin) == LOW) {
  increaseBrightness();
  delay(200);  // Add a small delay to avoid button bouncing
}
if (digitalRead(brightnessDownPin) == LOW) {
  decreaseBrightness();
  delay(200);  // Add a small delay to avoid button bouncing
}
if (digitalRead(alarmButtonPin) == LOW) {
  delay(200);  // Add a small delay to avoid button bouncing
}
 // Check for alarm condition
if (isAlarmEnabled && isAlarmTime()) {
  activateAlarm();
}

} void increaseBrightness() {

brightness += brightnessStep;
if (brightness > brightnessMax) {
  brightness = brightnessMax;
}
P.setIntensity(brightness);

}

void decreaseBrightness() {

brightness -= brightnessStep;
if (brightness < brightnessMin) {
  brightness = brightnessMin;
}
P.setIntensity(brightness);

}

bool isAlarmTime() {

// Get the current time
now = RTC.now();
// Define the alarm time (hours and minutes)
int alarmHour = 8;
int alarmMinute = 30;
// Compare the current time with the alarm time
if (now.hour() == alarmHour && now.minute() == alarmMinute) {
  return true;  // It's alarm time
} else {
  return false; // It's not alarm time
}

}

void activateAlarm() {

digitalWrite(alarmBuzzerPin, HIGH); // Turn on the buzzer
delay(1000); // Adjust the delay as needed
digitalWrite(alarmBuzzerPin, LOW); // Turn off the buzzer

}

Function to deactivate the alarm void deactivateAlarm() { digitalWrite(alarmBuzzerPin, LOW); Turn off the buzzer }

Results Obtained

After i built the Hardware components and wrote the Software (CODE):

* The digital clock should display the current time in hours and minutes using the LED matrix.

* The clock should retrieve the time from the Tiny RTC module using the I2C interface.

* The clock should display the current day of the week, date, month, and year on the LED matrix.

* The clock should support different text effects and animations for displaying the time and date.

* The clock should have three push buttons for controlling the brightness of the LED matrix and activating/deactivating the alarm.

* The clock should activate an alarm sound using the buzzer at a predefined alarm time (8:30 AM).

Conclusions

the project demonstrates the ability to create a digital clock using an Arduino Uno, LED matrix, Tiny RTC module, push buttons, and a buzzer. The project combines both hardware and software components to deliver a functional and interactive digital clock.

Download

An archive (or more if necessary) with the files obtained as a result of the project: sources, schemes, etc. A README file, a ChangeLog, a build script and automatic copy on uC always make a good impression ;-).

The files are uploaded to the wiki using the Add Images or other files feature. The namespace in which the files are uploaded is of the type :pm:prj20??:c? or :pm:prj20??:c?:student_name (if applicable). Example: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Journal

You can also have a journal section where the project assistant can track the progress of the project.

Bibliography/Resources

pm/prj2023/tmiu/digitalclock.txt · Last modified: 2023/05/30 16:58 by sajjad.al
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0