Arduino POV analog clock

I want to make a analog pov clock using arsuino. I need help with the code. I am using 3 74hc595 shift register to connect 24 led. Plz help with the code.

(deleted)

//Propeller clock2 

//digitalClock.ino


#include <Wire.h>
#include <Rtc_Pcf8563.h>

Rtc_Pcf8563 rtc; 
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
int delayVar = 400;
const byte BUTTON = 2;
volatile int r=0;

// interrupt handler...
void pinChange ()
{
  r=1;
}

void setup() {
  
  
  pinMode(latchPin, OUTPUT);
  digitalWrite (BUTTON,HIGH);  
  attachInterrupt (0, pinChange,RISING);
  
  rtc.initClock();
  //set a time to start with.
  //day, weekday, month, century, year
  rtc.setDate(20, 6, 1, 0, 14);
  //hr, min, sec
  rtc.setTime(8, 35, 40);
  
//Serial.begin(9600);
}

void loop() {
 
 if(r==1){ 
numWrite(12);
numWrite(12);
second();
numWrite(11);
minute();
numWrite(11);
hour();
delay(14);
day();
numIWrite(11);
month();
numIWrite(11);
year();
}
r=0;
rtc.formatTime();
rtc.formatDate();
  }


void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
 
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {	
      pinState= 0;
    }
    
    digitalWrite(myDataPin, pinState);
    digitalWrite(myClockPin, 1);
    digitalWrite(myDataPin, 0);
  }
  digitalWrite(myClockPin, 0);
}

// Function to write numbers
void numWrite(int alp)
{
int AL=alp;
switch(AL)
{
case 1:
ledWrite(0);
delayMicroseconds(delayVar);
ledWrite(128);
delayMicroseconds(delayVar);
ledWrite(254);
delayMicroseconds(delayVar);
ledWrite(132);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 2:
ledWrite(140);
delayMicroseconds(delayVar);       
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(98);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 3:
ledWrite(198);
delayMicroseconds(delayVar);       
ledWrite(170);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(130);
delayMicroseconds(delayVar);
ledWrite(130);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 4:
ledWrite(254);
delayMicroseconds(delayVar);       
ledWrite(16);
delayMicroseconds(delayVar);
ledWrite(16);
delayMicroseconds(delayVar);
ledWrite(16);
delayMicroseconds(delayVar);
ledWrite(30);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 5:
ledWrite(98);
delayMicroseconds(delayVar);       
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(140);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 6: 
ledWrite(98);
delayMicroseconds(delayVar);       
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(124);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 7: 
ledWrite(16);
delayMicroseconds(delayVar);       
ledWrite(254);
delayMicroseconds(delayVar);
ledWrite(18);
delayMicroseconds(delayVar);
ledWrite(2);
delayMicroseconds(delayVar);
ledWrite(2);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 8: 
ledWrite(108);
delayMicroseconds(delayVar);       
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(108);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 9: 
ledWrite(124);
delayMicroseconds(delayVar);       
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(146);
delayMicroseconds(delayVar);
ledWrite(140);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 0: 
 
ledWrite(124);
delayMicroseconds(delayVar);       
ledWrite(130);
delayMicroseconds(delayVar);
ledWrite(130);
delayMicroseconds(delayVar);
ledWrite(130);
delayMicroseconds(delayVar);
ledWrite(124);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 11:
ledWrite(0);
  delayMicroseconds(delayVar);
 ledWrite(108);
 delayMicroseconds(delayVar);
 ledWrite(0);
 delay(2);
break;

default:
ledWrite(0);
delayMicroseconds(delayVar);
break;

}}

void ledWrite(int var)
{
int data = var;
digitalWrite(latchPin, 0);
   
    shiftOut(dataPin, clockPin,data); 
    
   shiftOut(dataPin, clockPin,0);
   
    digitalWrite(latchPin,1);

}

void second()
{
  int sec= rtc.getSecond();
  int sec1 = sec/10;
  int sec2 = sec%10;
  numWrite(sec2);
  numWrite(sec1);    
}

void minute()
{
  int minn= rtc.getMinute();
  int min1 = minn/10;
  int min2 = minn%10;
  numWrite(min2);
  numWrite(min1);    
}

void hour()
{
  int hor= rtc.getHour();
  int hor1 = hor/10;
  int hor2 = hor%10;
  numWrite(hor2);
  numWrite(hor1);    
}


void numIWrite(int alp)
{
int AL=alp;
switch(AL)
{
case 1:
//int b[]={9,31,1};
ledWrite(9);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(1);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 2:
ledWrite(23);
delayMicroseconds(delayVar);
ledWrite(21);
delayMicroseconds(delayVar);
ledWrite(29);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 3:
ledWrite(17);
delayMicroseconds(delayVar);
ledWrite(21);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 4:
ledWrite(28);
delayMicroseconds(delayVar);
ledWrite(4);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 5:
ledWrite(29);
delayMicroseconds(delayVar);
ledWrite(21);
delayMicroseconds(delayVar);
ledWrite(23);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 6:
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(21);
delayMicroseconds(delayVar);
ledWrite(23);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 7:
ledWrite(16);
delayMicroseconds(delayVar);
ledWrite(16);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 8:
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(21);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 9:
ledWrite(29);
delayMicroseconds(delayVar);
ledWrite(21);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 0:
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(17);
delayMicroseconds(delayVar);
ledWrite(31);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;

case 11:
ledWrite(4);
delayMicroseconds(delayVar);
ledWrite(4);
delayMicroseconds(delayVar);
ledWrite(0);
delayMicroseconds(delayVar);
break;


default:
ledWrite(0);
delayMicroseconds(delayVar);
break;

}}

void month()
{
  int k = rtc.getMonth();
  int k1=k/10;
  numIWrite(k1);
  k1 = k%10;
  numIWrite(k1);
}
void day()
{
  int k= rtc.getDay();
  int k1=k/10;
  numIWrite(k1);
  k1 = k%10;
  numIWrite(k1);
}

void year()
{
  numIWrite(2);
  numIWrite(0);
int k =rtc.getYear();
 k =k%2000;
int k1 = k/10;
numIWrite(k1);
k1= k%10;
numIWrite(k1);

}

Thanx bill. I have seen that site but it didint have code for analog clock. Thanx a lot for your help. I jst needed a reference. Thanx for your code.. :slight_smile:

Hey bill i wanted code for analog clock not digital

You just need a reference, be it analog or digital clock is about the same for POV.

#include <TimerOne.h>

/**
Analog Clock
Paul Cox Dec 2010
*/

#define    PI      3.141592653589793e-06;
byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};
byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};
byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
volatile byte screenRow = 0;
volatile byte screenCol = 0;
int iHour = 0;
int iMin = 0;
int iSec = 0;

void setup()
{

	Timer1.initialize(100);
	for (int i = 2; i <= 17; i++)
	{
		pinMode(i, OUTPUT);
	}

	Timer1.attachInterrupt(doubleBuffer);
	Serial.begin(9600);
	resetAnim();
}

void doubleBuffer()
{

	digitalWrite(translatePin(rows[screenRow]), LOW);
	digitalWrite(translatePin(cols[screenCol]), HIGH);
	screenCol++;

	if (screenCol >= 8)
	{

		screenCol = 0;
		screenRow++;

		if (screenRow >= 8)
		{
			screenRow = 0;
		}
	}

	if((screen[screenRow] >> screenCol) & B1 == B1)
	{

		digitalWrite(translatePin(rows[screenRow]), HIGH);
		digitalWrite(translatePin(cols[screenCol]), LOW);
	}
	else
	{
		digitalWrite(translatePin(rows[screenRow]), LOW);
		digitalWrite(translatePin(cols[screenCol]), HIGH);
	}
}

byte translatePin(byte original)
{
	return pins[original - 1];
}

void allOFF()
{

	for (int i = 0; i < 8; i++)
	{
		screen[i] = 0;
	}
}

void on(byte row, byte column)
{
	screen[column-1] |= (B1 << (row - 1));
}

void off(byte row, byte column)
{
	screen[column-1] &= ~(B1 << (row - 1));
}

void resetAnim()
{

	for (int i = 0; i < 8; i++)
	{
		screen[i] = B11111111;
		delay(25);
	}

	for (int i = 0; i < 8; i++)
	{
		screen[i] = B00000000;
		delay(25);
	}

}

void loop()
{

	drawClock();
	iSec++;
	if (iSec == 60)
	{
		iSec = 1;
		iMin++;
		if (iMin == 60)
		{
			iMin = 0;
			iHour++;
			if (iHour == 12)
			{
				iHour = 0;
			}
		}
	}
	delay(10);
}

void drawClock()
{

	allOFF();
	setHand(iHour,12,3);
	setHand(iMin,60,4);
	setHand(iSec,60,5);
}

// work out the pixel for a hand - val is out of a possible max val
// radius is distance from the centre

void setHand(int iVal, int iMax, int iRadius)
{

	double  dAngle = (iVal * 2 * PI) / iMax;
	double  dPosX = 4.5 + (iRadius * cos(dAngle));
	double  dPosY = 4.5 + (iRadius * sin(dAngle));
	drawLine(5,5,constrain(round(dPosX),1,8),constrain(round(dPosY),1,8));
}

void drawLine(int x0, int y0, int x1, int y1)
{

	int      iTemp;
	boolean  bSteep = abs(y1 - y0) > abs(x1 - x0);

	if (bSteep)
	{
		iTemp = x0; x0 = y0; y0 = iTemp;    // swap x0,y0
		iTemp = x1; x1 = y1; y1 = iTemp;    // swap x1,y1
	}

	if (x0 > x1)
	{

		iTemp = x0; x0 = x1; x1 = iTemp;    // swap x0,x1
		iTemp = y1; y1 = y0; y0 = iTemp;    // swap y0,y1
	}

	int deltax = x1 - x0;
	int deltay = abs(y1 - y0);
	int error = deltax / 2;
	int ystep = ((y0 < y1) ? 1 : -1);
	int y = y0;
	int x = x0;

	while(x <= x1)
	{
		if (bSteep)
		{
			on(y,x);
		}
		else
		{
			on(x,y);
		}
		error = error - deltay;
		if (error < 0)
		{
			y = y + ystep;
			error = error + deltax;
		}
		x++;
	}
}

HD_POV.pde (17.4 KB)