Matrix clock

What I am trying to achieve is to have a matrix clock with a scrolling display of time and date for a set period that is then cleared from the display and only the time will then be displayed for a set period then it reverts back to a scrolling display etc.
When the display is in just the time mode how to get the seconds to tick over like a normal clock.
The program at the moment scrolls the time and date twice then shows only the time then starts to scroll again etc.
I am using 8xMax7219, DS1307 RTC, and UNO R3.

Any help in setting the periods of scrolling and the period of time with seconds changing would be of great assistance.

Program code is enclosed.

[/#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*/
int Max7219_pinCLK = 13;
int Max7219_pinCS = 10;
int Max7219_pinDIN = 11;
 

 
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 = 24;
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[12] = '0' + ((now.day())/10); 
  tape[13] = '0' + ((now.day())%10);
  tape[15] = '0' + ((now.month())/10);
  tape[16] = '0' + ((now.month())%10);
  tape[18] = '0' + ((now.year())/1000);
  tape[19] = '0' + (((now.year())/100)%10);
  tape[20] = '0' + (((now.year())/10)%10);
  tape[21] = '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 */
  matrix.setPosition(0,0,0);
 matrix.print(now.hour(),DEC);
 matrix.print(':');
 matrix.print(now.minute(),DEC);
 matrix.print(':');
 matrix.print(now.second(),DEC);
 matrix.write();
  
   for(j=0;j<38;j++)
  {
   for(a=1;a<9;a++)
    Write_Max7219(a,disp1[j][a-1]);
   delay(200);
  
}

}code]

Could someone explain and help as to why the above program only has the scrolling display when run on external power and both scrolling and displayed time when on usb.
I’m at a loss as to why this is happening, have I missed a vital part of the program.
This is a follow up to my original post of the 19/11/2014.
Help needed.

what kind of power supply are you using?

Can you post the schematic how you connected things.

Here is how it is wired:-

Arduino RTC Max 1 I/P Max 1 O/P Max X I/P
0v 0v 0v 0v 0v
+5v +5v +5v +5v +5v
P16 SDA
P17 SCL
P13 DIN DOUT DIN
P10 CS CS CS
P11 CLK CLK CLK

The Max7219’s are wired as Max72xxPanel library program ‘Ticker’ O/P of the first to the I/P of the next down to the last Max7219 (Daisy Chained on bread board), am using 5 displays for testing .
USB for system is a powered hub.
External power is from a power adapter 12v @1A.
The problem only happens when the USB from the system is removed and external power is connected, display only runs the scrolling time and date with the delays of the time only and no display.
This to me seems to point to the program that a piece of program is missing or extra programming lines are causing the problem.
The original scrolling program ‘Ticker’ worked with either USB or external power, its only since the RTC part was added that this problem showed up.
Hope this info helps.

The fact that the code works with USB power means that the code is OK.

Can you measure the voltages on the board then connected to USB
and when connected to the external power?

When connected to the PC's USB voltage reads 4.79v, when connected to the BE voltage reads 4.93v.
I do not think that the problem is power, when using the BE you are not connected to the serial port as with USB, so somewhere in the program is the problem, IMO, so I also could be wrong.