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.. ![]()
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)