Help With POV Clock Code

Hello Everyone,

I need some help working a POV Clock. I had posted a few times and had great advice from others and I need it again.

I am having problems modifying my sketch to display my digits correctly.

Originally, I was using a motor that rotated clockwise and the speed was regulated by without using an Arduino. Everything was working great until my motor burned out because of a bad voltage regulator. Now I am using a different DC brushless motor, but it rotates counter-clockwise.

I was able to modify my code so the digits are not showing backwards, as if they were seen in a mirror. I was also able to correct the display sequence so that it displays the hours, minutes, and seconds correctly. However, this is where my problem is, my digits are not showing in the correct order. For example, if the time is 16:56:17, it will display 61:65:71. I cannot figure out how to modify the code to get it to show correctly.

Here is a copy of my current code.

#include <Wire.h>
#include <MsTimer2.h>
#include <RTClib.h>

RTC_DS1307 RTC;

// font data - each character is 8 pixels deep and 5 pixels wide

byte font [96] [5] PROGMEM = {
  { 0x00, 0x00, 0x00, 0x00, 0x00 }, // space  (0x20)
  { 0x00, 0x00, 0x2F, 0x00, 0x00 }, // !
  { 0x00, 0x07, 0x00, 0x07, 0x00 }, // "
  { 0x14, 0x7F, 0x14, 0x7F, 0x14 }, // #
  { 0x24, 0x2A, 0x7F, 0x2A, 0x12 }, // $
  { 0x23, 0x13, 0x08, 0x64, 0x62 }, // %
  { 0x36, 0x49, 0x55, 0x22, 0x50 }, // &
  { 0x00, 0x05, 0x03, 0x00, 0x00 }, // '
  { 0x00, 0x1C, 0x22, 0x41, 0x00 }, // (
  { 0x00, 0x41, 0x22, 0x1C, 0x00 }, // (
  { 0x14, 0x08, 0x3E, 0x08, 0x14 }, // *
  { 0x08, 0x08, 0x3E, 0x08, 0x08 }, // +
  { 0x00, 0x50, 0x30, 0x00, 0x00 }, // ,
  { 0x08, 0x08, 0x08, 0x08, 0x08 }, // -
  { 0x00, 0x30, 0x30, 0x00, 0x00 }, // .
  { 0x20, 0x10, 0x08, 0x04, 0x02 }, // /
   
  { 0xFE, 0x81, 0x81, 0x81, 0xFE }, // 0  (0x30)
  { 0x80, 0x80, 0xFF, 0x82, 0x84 }, // 1
  { 0x8E, 0x91, 0xA1, 0xC2, 0x84 }, // 2
  { 0x76, 0x89, 0x89, 0x81, 0x42 }, // 3
  { 0x10, 0xFF, 0x12, 0x14, 0x18 }, // 4
  { 0x71, 0x89, 0x89, 0x89, 0x8F }, // 5
  { 0x72, 0x89, 0x89, 0x89, 0xFE }, // 6
  { 0x07, 0x09, 0x11, 0x21, 0xC1 }, // 7
  { 0x76, 0x89, 0x89, 0x89, 0x76 }, // 8
  { 0xFE, 0x09, 0x09, 0x09, 0x06 }, // 9
  { 0x00, 0x00, 0x66, 0x00, 0x00 }, // :
  { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;
  { 0x08, 0x14, 0x22, 0x41, 0x00 }, // <
  { 0x14, 0x14, 0x14, 0x14, 0x14 }, // =
  { 0x00, 0x41, 0x22, 0x14, 0x08 }, // >
  { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?
  
  { 0x32, 0x49, 0x79, 0x41, 0x3E }, // @  (0x40)
  { 0x7E, 0x11, 0x11, 0x11, 0x7E }, // A
  { 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B
  { 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C
  { 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D
  { 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E
  { 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F
  { 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G
  { 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H
  { 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I
  { 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J
  { 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K
  { 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L
  { 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M
  { 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N
  { 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O
  
  { 0x3F, 0x09, 0x09, 0x09, 0x06 }, // P  (0x50)
  { 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q
  { 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R
  { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S
  { 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T
  { 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U
  { 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V
  { 0x3F, 0x40, 0x30, 0x40, 0x3F }, // W
  { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X
  { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y
  { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z
  { 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [
  { 0x02, 0x04, 0x08, 0x10, 0x20 }, // backslash
  { 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ]
  { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^
  { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _
  
  { 0x00, 0x01, 0x02, 0x04, 0x00 }, // `  (0x60)
  { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a
  { 0x7F, 0x50, 0x48, 0x48, 0x30 }, // b
  { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c
  { 0x38, 0x44, 0x44, 0x48, 0x7F }, // d
  { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e
  { 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f
  { 0x0C, 0x52, 0x52, 0x52, 0x3E }, // g
  { 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h
  { 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i
  { 0x20, 0x40, 0x44, 0x3D, 0x00 }, // j
  { 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k
  { 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l
  { 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m
  { 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n
  { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o
  
  { 0x7C, 0x14, 0x14, 0x14, 0x08 }, // p  (0x70)
  { 0x08, 0x14, 0x14, 0x08, 0x7C }, // q
  { 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r
  { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s
  { 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t
  { 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u
  { 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v
  { 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w
  { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x
  { 0x0C, 0x50, 0x50, 0x50, 0x3C }, // y
  { 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z
  { 0x00, 0x08, 0x36, 0x41, 0x00 }, // {
  { 0x00, 0x00, 0x7F, 0x00, 0x00 }, // |
  { 0x00, 0x41, 0x36, 0x08, 0x00 }, // }
  { 0x30, 0x08, 0x10, 0x20, 0x18 }, // ~
  { 0x7F, 0x55, 0x49, 0x55, 0x7F }  // unknown char (0x7F)
  
};

char displayThis [40] = { 0 };
byte pos, pixel;

void blink() 
  {
  // get current letter
  char thisLetter = displayThis [pos];
  
  // look up bit pattern for this pixel (table starts at 0x20 - space)
  byte bitPattern = pgm_read_byte ( &font [thisLetter - 0x20] [pixel++]);
 
  // output to LEDs
  PORTD = bitPattern;
  
  // move onto next letter if required
  if (pixel >= 5)
    {
    pixel = 0;
    pos++;
    if (displayThis [pos] == 0)  // back to start
      pos = 0;  
    }  // if done all 5 pixels

}  // end of blink

void setup()
  {
  //Applys voltage to DS1307 Circuit. Sets Analog Pins 2 and 3 on UNO to outputs.
  //Also sets pin 2 as a ground and 3 as +5v.
  pinMode(16, OUTPUT);
  pinMode(17, OUTPUT);
  digitalWrite(16, LOW);
  digitalWrite(17, HIGH);

  //Send data to Serial Monitor  
    Wire.begin();
    RTC.begin();
    
    
  DDRD = 0b11111111; // set digital  0- 7 to output
  MsTimer2::set(2, blink);
  MsTimer2::start();
} // end of setup

void loop()
  {

  //Calling time from RTC.    
  DateTime now = RTC.now();

  //Declaring variables.    
  int Hrs = now.hour();
  int Mins = now.minute();
  int Sec = now.second();
  
  
  sprintf (displayThis, "   %02i:%02i:%02i   ", Sec, Mins, Hrs);
    
  delay (1000);
  }  // end of loop

Can you please help me with this? I would greatly appreciate it because it is a very important project.

Thank you for your time,
Phillip B.

Moderator edit: [code][/code] tags added instead of “quote” tags. (Nick Gammon)

bafill: For example, if the time is 16:56:17, it will display 61:65:71.

Are you sure it's not showing: 71:65:61?

Are you sure it's not showing: 71:65:61? [/quote]

Hey Nick

I was able to fix the hours, minutes, seconds order by changing part of the sprintf by calling the seconds first, then minutes, then hours. Any suggestions on how to reverse the digits of each field?

bafill:

Are you sure it’s not showing: 71:65:61?

I was able to fix the hours, minutes, seconds order by changing part of the sprintf by calling the seconds first, then minutes, then hours. Any suggestions on how to reverse the digits of each field?

I’ll take that as a “no”.

Put the time back the “right way” (hours, mins, seconds) and then call strrev on the string. As in:

strrev (displayThis);

You are going to have to reverse the order of the digits in your numbers:

int Hrs = now.hour(); int Mins = now.minute(); int Sec = now.second();

int RevHrs=(Hrs/10+(10*(Hrs%10))); int RevMins =(Mins/10+(10*(Mins%10))); int RevSec=(Sec/10+(10*(Sec%10)));

sprintf (displayThis, " %02i:%02i:%02i ", RevSec, RevMins, RevHrs);

Thanks Nick

That worked. Thanks so much for your help.