I have build a matrix clock to display a scrolling time and date and modified the program to display time only for a set period then back to repeating scrolling and display time.
The problem I have is that when the time only is displayed the seconds do not advance to change minutes, and minutes do not change hours when required.
I am using 6 max7219 8x8 displays, a ds1307 rtc, and a mega 2560,libraries used are SPI, Wire, RTClib, Adafruit_GFX, Max72xxPanel.
I have searched the forum for ideas but most refer to either 7seg readouts or only show hh:mm no seconds.
This is an ongoing project where temp/humi, and buttons to display other things will be added.
Any advice will be welcomed, and a thank you in advance for any help.
Program is listed below, it runs on both uno and mega2560, by changing pins.
[/#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
/* Max7219 settings */
int pinCS = 10; // Attach CS to this pin, DIN to MOSI and CLK to SCK (cf http://arduino.cc/en/Reference/SPI )
int numberOfHorizontalDisplays = 5;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
RTC_DS1307 rtc;
unsigned char a;
unsigned char j;
/*Port Definitions UNO*/
int Max7219_pinCLK = 13; //Mega SCK-52
int Max7219_pinCS = 10; //Mega CS-10
int Max7219_pinDIN = 11; //Mega DIN-MOSI
unsigned char disp1[38][8]={
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//0
{0x10,0x18,0x14,0x10,0x10,0x10,0x10,0x10},//1
{0x7E,0x2,0x2,0x7E,0x40,0x40,0x40,0x7E},//2
{0x3E,0x2,0x2,0x3E,0x2,0x2,0x3E,0x0},//3
{0x8,0x18,0x28,0x48,0xFE,0x8,0x8,0x8},//4
{0x3C,0x20,0x20,0x3C,0x4,0x4,0x3C,0x0},//5
{0x3C,0x20,0x20,0x3C,0x24,0x24,0x3C,0x0},//6
{0x3E,0x22,0x4,0x8,0x8,0x8,0x8,0x8},//7
{0x0,0x3E,0x22,0x22,0x3E,0x22,0x22,0x3E},//8
{0x3E,0x22,0x22,0x3E,0x2,0x2,0x2,0x3E},//9
{0x8,0x14,0x22,0x3E,0x22,0x22,0x22,0x22},//A
{0x3C,0x22,0x22,0x3E,0x22,0x22,0x3C,0x0},//B
{0x3C,0x40,0x40,0x40,0x40,0x40,0x3C,0x0},//C
{0x7C,0x42,0x42,0x42,0x42,0x42,0x7C,0x0},//D
{0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x7C},//E
{0x7C,0x40,0x40,0x7C,0x40,0x40,0x40,0x40},//F
{0x3C,0x40,0x40,0x40,0x40,0x44,0x44,0x3C},//G
{0x44,0x44,0x44,0x7C,0x44,0x44,0x44,0x44},//H
{0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x7C},//I
{0x3C,0x8,0x8,0x8,0x8,0x8,0x48,0x30},//J
{0x0,0x24,0x28,0x30,0x20,0x30,0x28,0x24},//K
{0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x7C},//L
{0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81},//M
{0x0,0x42,0x62,0x52,0x4A,0x46,0x42,0x0},//N
{0x3C,0x42,0x42,0x42,0x42,0x42,0x42,0x3C},//O
{0x3C,0x22,0x22,0x22,0x3C,0x20,0x20,0x20},//P
{0x1C,0x22,0x22,0x22,0x22,0x26,0x22,0x1D},//Q
{0x3C,0x22,0x22,0x22,0x3C,0x24,0x22,0x21},//R
{0x0,0x1E,0x20,0x20,0x3E,0x2,0x2,0x3C},//S
{0x0,0x3E,0x8,0x8,0x8,0x8,0x8,0x8},//T
{0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1C},//U
{0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18},//V
{0x0,0x49,0x49,0x49,0x49,0x2A,0x1C,0x0},//W
{0x0,0x41,0x22,0x14,0x8,0x14,0x22,0x41},//X
{0x41,0x22,0x14,0x8,0x8,0x8,0x8,0x8},//Y
{0x0,0x7F,0x2,0x4,0x8,0x10,0x20,0x7F},//Z
};
/* Set up Scrolling Time and Date settings */
String tape ="99:99:99 99/99/9999";
int tape_length = 22;
int wait = 50; // In milliseconds
int spacer = 1;
int width = 5 + spacer; // The font width is 5 pixels
int i = 0;
/* Set up display of Time only */
void Write_Max7219_byte(unsigned char DATA)
{
unsigned char a;
digitalWrite(Max7219_pinCS,LOW);
for(a=8;a>=1;a--)
{
digitalWrite(Max7219_pinCLK,LOW);
digitalWrite(Max7219_pinDIN,DATA&0x80);// Extracting a bit data
DATA = DATA<<1;
digitalWrite(Max7219_pinCLK,HIGH);
}
}
void Write_Max7219(unsigned char address,unsigned char dat)
{
digitalWrite(Max7219_pinCS,LOW);
Write_Max7219_byte(address); //address,code of LED
Write_Max7219_byte(dat); //data,figure on LED
digitalWrite(Max7219_pinCS,HIGH);
}
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0x00); //decoding :BCD
Write_Max7219(0x0a, 0x03); //brightness
Write_Max7219(0x0b, 0x07); //scanlimit;8 LEDs
Write_Max7219(0x0c, 0x01); //power-down mode:0,normal mode:1
Write_Max7219(0x0f, 0x00); //test display:1;EOT,display:0
}
void setup()
{
/*Init Max7219*/
pinMode(Max7219_pinCLK,OUTPUT);
pinMode(Max7219_pinCS,OUTPUT);
pinMode(Max7219_pinDIN,OUTPUT);
delay(50);
Init_MAX7219();
/* Check if RTC running and set intensity of display */
matrix.setIntensity(0); // Use a value between 0 and 15 for brightness
#ifdef AVR
Wire.begin();
#else
Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
rtc.begin();
if (! rtc.isrunning()) {
matrix.print("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__));
}
}
void loop() {
DateTime now = rtc.now();
/* Scrolling to show the date and time */
tape[0] = '0' + ((now.hour())/10); // I assume you want the time first
tape[1] = '0' + ((now.hour())%10);
tape[3] = '0' + ((now.minute())/10);
tape[4] = '0' + ((now.minute())%10);
tape[6] = '0' + ((now.second())/10);
tape[7] = '0' + ((now.second())%10);
tape[10] = '0' + ((now.day())/10);
tape[11] = '0' + ((now.day())%10);
tape[13] = '0' + ((now.month())/10);
tape[14] = '0' + ((now.month())%10);
tape[16] = '0' + ((now.year())/1000);
tape[17] = '0' + (((now.year())/100)%10);
tape[18] = '0' + (((now.year())/10)%10);
tape[19] = '0' + ((now.year())%10);
for ( int i = 0 ; i < width * tape_length + matrix.width() - 1 - spacer; i++ ) {
matrix.fillScreen(LOW);
int letter = i / width;
int x = (matrix.width() - 1) - i % width;
int y = (matrix.height() - 8) / 2; // center the text vertically
while ( x + width - spacer >= 0 && letter >= 0 ) {
if ( letter < tape_length ) {
matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
}
letter--;
x -= width;
}
matrix.write(); // Send bitmap to display
delay(wait);
}
/* Print time only */
char timeStr[4]; // enough space for "XX:XX\0"
sprintf( timeStr, "%02d:%02d", now.hour(), now.minute(), now.second());
matrix.print( timeStr );
matrix.write();
for(j=0;j<38;j++)
{
for(a=1;a<9;a++)
Write_Max7219(a,disp1[j][a-1]);
delay(700);
}
}code]