In this step-by-step tutorial, learn how to build a P10 RTC (Real-Time Clock) using Arduino! In this project, I’ll guide you through the entire process of setting up a P10 LED matrix display and integrating it with a real-time clock module to create a functional clock display.
This project is perfect for Arduino enthusiasts looking to take on a fun and practical challenge. By the end of this video, you will have a working P10 RTC clock that you can display in your home, office, or workshop!
In this tutorial, you'll learn how to build a real-time clock (RTC) using an Arduino and a P10 LED matrix display. This project will allow you to display the current time on the P10 matrix and showcase your Arduino skills.
To interact with the P10 matrix and the RTC module, we need to install the following libraries:
Here’s a simple example of how the code could look for displaying the current time on the P10 LED matrix:
//////////////////////////////////////////////////////////////////////////////////
/*
//---------------------------------------Arduino P10 Digital Clock------------------------------------
/*
#####################################################################################################################################################
# #
# -RTClib.h : https://github.com/adafruit/RTClib #
# #
# Installation: #
# Arduino Uno DS1307 #
# A5 ---------> SCL #
# A4 ---------> SDA #
# 5V ---------> VCC #
# GND ---------> GND #
######################################################################################################################################################
######################################################################################################################################################
#
# Installation: #
# Arduino Uno P10 Panel #
# 13 ---------> S / CLK #
# 11 ---------> R #
# 9 ---------> nOE / OE #
# 8 ---------> L / SCLK #
# 7 ---------> B #
# 6 ---------> A #
# GND ---------> GND #
# #
# The P10 panel can still turn on without 5V Power Input if it only uses one panel, but to increase brightness it must be added with 5V Power Input. #
# 5V Power Input must also be used if using more than one P10 Panel. #
######################################################################################################################################################
*/
//--------------------------------------------------------------------------------------Wire and RTC Library
#include <Wire.h>
#include "RTClib.h"
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------The SPI, DMD, TimerOne and Font libraries are used.
#include <SPI.h>
#include <DMD.h>
#include <TimerOne.h>
#include "SystemFont5x7.h"
#include "Font_6x14.h" //-> This font only contains numbers from 0-9
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------Configuration P10
#define DISPLAYS_ACROSS 1 //-> Number of P10 panels used, side to side.
#define DISPLAYS_DOWN 1
DMD dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);
//--------------------------------------------------------------------------------------
RTC_DS1307 rtc; //-> RTC Declaration
//--------------------------------------------------------------------------------------Variables for time and date
int _day, _month, _year, _hour24, _hour12, _minute, _second, _dtw;
int hr24;
String st;
char nameoftheday[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
char month_name[12][12] = {"January","February", "March", "April", "May", "June", "Jult", "August", "September", "October", "November", "December"};
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------Variable for Millis
const long interval = 1000; //-> Retrieve time and date data every 1 second
unsigned long previousMillis = 0;
const long interval_for_date = 75; //-> For scroll speed
unsigned long previousMillis_for_date = 0;
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------Variable to display hours and minutes
char hr_24 [3];
String str_hr_24;
char mn [3];
String str_mn;
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------ScanDMD()
void ScanDMD() {
dmd.scanDisplayBySPI();
}
//--------------------------------------------------------------------------------------setup
void setup() {
Serial.begin(115200);
Serial.println("Arduino RTC DS1307");
delay(1000);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled (Set the time and date based on your computer time and date)
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //-> Set the time and date based on your computer time and date. If that doesn't work, use this line of code outside of "if (! rtc.isrunning())"
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
// following line sets the RTC to the date & time this sketch was compiled (Set the time and date based on your computer time and date)
//rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //-> Set the time and date based on your computer time and date. Use this line of code if it doesn't work in "if (! rtc.isrunning())"
//rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
// If the time and date are successfully set, then deactivate the code line (make the code a comment), then re-upload the code.
// if not done then the time and date will return to the beginning when it was set when arduino is reset or restarted.
Timer1.initialize(1000);
Timer1.attachInterrupt(ScanDMD);
dmd.clearScreen(true);
}
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------loop
void loop() {
//_____________________________________________________millis() to display time
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; //-> save the last time
GetDateTime(); //-> Retrieve time and date data from DS1307
dmd.selectFont(Font_6x14);
//=====================================================Showing the clock in P10
str_hr_24=String(_hour24);
str_hr_24.toCharArray(hr_24,3);
if (_hour24<10) {
dmd.drawString(0, 0, "0", 1, GRAPHICS_NORMAL);
dmd.drawString(7, 0, hr_24, 1, GRAPHICS_NORMAL);
}
else {
dmd.drawString(0, 0, hr_24, 2, GRAPHICS_NORMAL);
}
//=====================================================
//=====================================================Showing ":" in P10
if (_second %2 == 0) {
dmd.drawFilledBox(15,3,16,4, GRAPHICS_OR);
dmd.drawFilledBox(15,11,16,12, GRAPHICS_OR);
}
else {
dmd.drawFilledBox(15,3,16,4, GRAPHICS_NOR);
dmd.drawFilledBox(15,11,16,12, GRAPHICS_NOR);
}
//=====================================================
//=====================================================Showing minutes in P10
str_mn=String(_minute);
str_mn.toCharArray(mn,3);
if (_minute<10) {
dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
dmd.drawString(26, 0, mn, 1, GRAPHICS_NORMAL);
}
else {
dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
}
//=====================================================
//=====================================================Call the scrolling_date() subroutine to display the date.
if (_second==11) { //-> Display the date when seconds equal to 11
scrolling_date();
}
//=====================================================
}
//_____________________________________________________
}
//--------------------------------------------------------------------------------------
//------------------------------------------------------------------------Subroutine to retrieve or update the time and date from DS1307
void GetDateTime() {
DateTime now = rtc.now();
_day=now.day();
_month=now.month();
_year=now.year();
_hour24=now.hour();
_minute=now.minute();
_second=now.second();
_dtw=now.dayOfTheWeek();
hr24=_hour24;
if (hr24>12) {
_hour12=hr24-12;
}
else if (hr24==0) {
_hour12=12;
}
else {
_hour12=hr24;
}
if (hr24<12) {
st="AM";
}
else {
st="PM";
}
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------Subroutine to display days, months and years
void scrolling_date() {
dmd.clearScreen(true);
delay(100);
//=====================================================Holds date data to display
String Date = String(nameoftheday[_dtw]) + ", " + String(_day) + "-" + String(month_name[_month-1]) + "-" + String(_year);
char dt[50];
Date.toCharArray(dt,50);
int i=32+10;
int j=strlen(dt)+(strlen(dt)*5);
//=====================================================
dmd.selectFont(SystemFont5x7);
while(1) {
//_____________________________________________________millis() to display time
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; //-> save the last time
//=====================================================Showing the clock in P10
str_hr_24=String(_hour24);
str_hr_24.toCharArray(hr_24,3);
if (_hour24<10) {
dmd.drawString(2, 0, "0", 1, GRAPHICS_NORMAL);
dmd.drawString(8, 0, hr_24, 1, GRAPHICS_NORMAL);
}
else {
dmd.drawString(2, 0, hr_24, 2, GRAPHICS_NORMAL);
}
//=====================================================
//=====================================================Showing ":" in P10
GetDateTime(); //-> Retrieve time and date data from DS1307
if (_second %2 == 0) {
dmd.drawString(14, 0, ":", 2, GRAPHICS_OR);
}
else {
dmd.drawString(14, 0, ":", 2, GRAPHICS_NOR);
}
//=====================================================
//=====================================================Showing minutes in P10
str_mn=String(_minute);
str_mn.toCharArray(mn,3);
if (_minute<10) {
dmd.drawString(19, 0, "0", 1, GRAPHICS_NORMAL);
dmd.drawString(25, 0, mn, 1, GRAPHICS_NORMAL);
}
else {
dmd.drawString(19, 0, mn, 2, GRAPHICS_NORMAL);
}
//=====================================================
}
//_____________________________________________________
//_____________________________________________________millis() for display & scrolling date
unsigned long currentMillis_for_date = millis();
if (currentMillis_for_date - previousMillis_for_date >= interval_for_date) {
previousMillis_for_date = currentMillis_for_date; //-> save the last time
i--;
dmd.drawString(i, 9, dt, strlen(dt), GRAPHICS_NORMAL);
if (i<=~j) {
dmd.clearScreen(true);
delay(100);
return;
}
}
//_____________________________________________________
}
}
//------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////
After uploading the code, the P10 LED matrix should start displaying the current time, updating every second. You should see something like 12:34 on the display.
You have successfully built a P10 RTC clock using Arduino! You can further customize the project by adding features like setting the time via buttons, using different displays, or adding additional functionalities such as alarms or temperature readings.
No comments:
Post a Comment