driving servo motors with a clock

i am workin on a clock drived by many servos, i will need 9 for the hours, 14 for the minuts ( 5 for the decimal digits and 9 for the others ) , and they will be 2 marks on every servo ( one at the 0 degree and one on the 45 degree ), so lets say the time is
"6:45" then 6 of the 9 servos ( for the hours ) will be on 45 Dg, while the others on 0 , and 4 of the 5 will be active ( for decimals ) and then 5 out of 9.

``````// include libraries

#include "Wire.h"
#include "Servo.h"

Servo  hour_servo1
Servo  hour_servo2
Servo  hour_servo3
Servo  hour_servo4
Servo  hour_servo5
Servo  hour_servo6
Servo  hour_servo7
Servo  hour_servo8
Servo  hour_servo9
Servo  hour_servo10

// defining variables

int realhour = 0;
int hours = 0;
int minutes = 0;

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,byte minute,byte hour,byte dayOfWeek,byte dayOfMonth,byte month,byte year)
{
Wire.send(0);
Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour));
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.send(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
Wire.endTransmission();
}

void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month,byte *year)
{
// Reset the register pointer
Wire.send(0);
Wire.endTransmission();
}

// Function to Set time
/////
/////
////
/////

void setup() {

hour_servo1.attach(1);
hour_servo1.attach(2);
hour_servo1.attach(3);
hour_servo1.attach(4);
hour_servo1.attach(5);
hour_servo1.attach(6);
hour_servo1.attach(7);
hour_servo1.attach(8);
hour_servo1.attach(9);
hour_servo1.attach(10);

second = 0;
dayOfWeek = 1;
dayOfMonth = 24;
month = 5;
year = 10;

// Set up the time using the buttons then ->

setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);

}

void loop() {

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
realhour = int(hour);

if (realhour==0) // if it is 0000h, that should be 1200h in 12 hour time
{
realhour=12;
}

if (hour>=13)
{
realhour=realhour-12; // convert 24h hours to 12h hours
}

hours=realhour*14;
minutes=minute*3;

switch(hours) {
case '1':
hour_servo1.write(45); // if active set position to 45 degree
hour_servo2.write(0); // if inactive set position to 0 degree
hour_servo3.write(0);
hour_servo4.write(0);
hour_servo5.write(0);
hour_servo6.write(0);
hour_servo7.write(0);
hour_servo8.write(0);
hour_servo9.write(0);
hour_servo10.write(0);
break;
case '2':
.
.
.
.

case '12':
.

break;
}

delay(100);     // servos need time to move

switch(minutes) {
case '1':
.

break;
case '2':
.
.
.
.

case '60':
.

break;
}
delay(100);

}
``````

1 ) - i have problems setting time with buttons ... i cant figure out how to do it ?
2 ) - As you can see the case method will be quite long, is there another way to do it ? i was reading about arrays, but can anyone show me an example, because i am not sure how to do it neither.

Time to learn about arrays of objet pointers. Something like this will do the whole hours case statement:

``````Servo *hourServos[] = {hour_servo1,  hour_servo2,  hour_servo3,  hour_servo4,  hour_servo5,  hour_servo6,  hour_servo7,  hour_servo8,  hour_servo9,  hour_servo10};

for (i=0; i<10; i++)
{
if (i < hours)
hourServos[i].write(45);
else
hourServos[i].write(0);
}
``````

The tens of minutes and minutes can be done similarly:

minutes / 10 for the ten's digit
minutes % 10 for the one's digit

Thank for you help .. reading your answer, i should know that it is beginner stuff ... but okay, i suits my level