Hi,
this is my first real application with arduino, but it's still not working, now I've reached a point where I can't go on.
/* Arduino binary clock by Paco
*
* uses an external 1 hz source provided by a cheap quartz clock
* http://www.josepino.com/circuits/?one_second_timebase.jpc
*
* code under GPL License
*/
byte ledpin[] = {2,3,4,5,6,7,8,9,10,11,12,13,14};
byte num_pins = 13;
byte clocksrc = 19; // external clock
byte setbtn = 18; // set button
byte hourbtn = 17; // hour++ button
byte minbtn = 16; // minutes++ button
byte hour[] = {0,0}; // for ease I've tried hour[0]hour[1]:minutes[0]minutes[1]
byte minutes[] = {0,0};
byte seconds = 0;
void setTime(byte h[], byte m[]){ // adjusts the time with aid from the three pushbuttons
while(digitalRead(setbtn)) {
if(!digitalRead(hourbtn)) { // hour adjustment
if(h[0]==2 && h[1]==3) { // if hour=23 netx will be 00
h[0]=0;
h[1]=0;
} else if(h[1]==9) {
h[1]=0;
h[0]++;
} else
h[1]++;
printTime(hour, minutes);
}
delay(100);
if(!digitalRead(minbtn)) { // minute adjustment
if(m[0]==5 && m[1]==9) {
m[0]=0;
m[1]=0;
} else if(m[1]==9) {
m[1]=0;
m[0]++;
} else
m[1]++;
printTime(hour, minutes);
}
delay(100);
}
}
void printTime(byte h[], byte m[]) { // outputs the time to the leds in binary, n00b way ;)
switch(h[0]) {
case 0:
digitalWrite(ledpin[0],LOW);
digitalWrite(ledpin[1],LOW);
break;
case 1:
digitalWrite(ledpin[0],HIGH);
digitalWrite(ledpin[1],LOW);
break;
case 2:
digitalWrite(ledpin[0],LOW);
digitalWrite(ledpin[1],HIGH);
break;
}
switch(h[1]) {
case 0:
digitalWrite(ledpin[2],LOW);
digitalWrite(ledpin[3],LOW);
digitalWrite(ledpin[4],LOW);
digitalWrite(ledpin[5],LOW);
break;
case 1:
digitalWrite(ledpin[2],HIGH);
digitalWrite(ledpin[3],LOW);
digitalWrite(ledpin[4],LOW);
digitalWrite(ledpin[5],LOW);
break;
case 2:
digitalWrite(ledpin[2],LOW);
digitalWrite(ledpin[3],HIGH);
digitalWrite(ledpin[4],LOW);
digitalWrite(ledpin[5],LOW);
break;
case 3:
digitalWrite(ledpin[2],HIGH);
digitalWrite(ledpin[3],HIGH);
digitalWrite(ledpin[4],LOW);
digitalWrite(ledpin[5],LOW);
break;
case 4:
digitalWrite(ledpin[2],LOW);
digitalWrite(ledpin[3],LOW);
digitalWrite(ledpin[4],HIGH);
digitalWrite(ledpin[5],LOW);
break;
case 5:
digitalWrite(ledpin[2],HIGH);
digitalWrite(ledpin[3],LOW);
digitalWrite(ledpin[4],HIGH);
digitalWrite(ledpin[5],LOW);
break;
case 6:
digitalWrite(ledpin[2],LOW);
digitalWrite(ledpin[3],HIGH);
digitalWrite(ledpin[4],HIGH);
digitalWrite(ledpin[5],LOW);
break;
case 7:
digitalWrite(ledpin[2],HIGH);
digitalWrite(ledpin[3],HIGH);
digitalWrite(ledpin[4],HIGH);
digitalWrite(ledpin[5],LOW);
break;
case 8:
digitalWrite(ledpin[2],LOW);
digitalWrite(ledpin[3],LOW);
digitalWrite(ledpin[4],LOW);
digitalWrite(ledpin[5],HIGH);
break;
case 9:
digitalWrite(ledpin[2],HIGH);
digitalWrite(ledpin[3],LOW);
digitalWrite(ledpin[4],LOW);
digitalWrite(ledpin[5],HIGH);
break;
}
switch(m[0]) {
case 0:
digitalWrite(ledpin[6],LOW);
digitalWrite(ledpin[7],LOW);
digitalWrite(ledpin[8],LOW);
break;
case 1:
digitalWrite(ledpin[6],HIGH);
digitalWrite(ledpin[7],LOW);
digitalWrite(ledpin[8],LOW);
break;
case 2:
digitalWrite(ledpin[6],LOW);
digitalWrite(ledpin[7],HIGH);
digitalWrite(ledpin[8],LOW);
break;
case 3:
digitalWrite(ledpin[6],HIGH);
digitalWrite(ledpin[7],HIGH);
digitalWrite(ledpin[8],LOW);
break;
case 4:
digitalWrite(ledpin[6],LOW);
digitalWrite(ledpin[7],LOW);
digitalWrite(ledpin[8],HIGH);
break;
case 5:
digitalWrite(ledpin[6],HIGH);
digitalWrite(ledpin[7],LOW);
digitalWrite(ledpin[8],HIGH);
break;
}
switch(m[1]) {
case 0:
digitalWrite(ledpin[9],LOW);
digitalWrite(ledpin[10],LOW);
digitalWrite(ledpin[11],LOW);
digitalWrite(ledpin[12],LOW);
break;
case 1:
digitalWrite(ledpin[9],HIGH);
digitalWrite(ledpin[10],LOW);
digitalWrite(ledpin[11],LOW);
digitalWrite(ledpin[12],LOW);
break;
case 2:
digitalWrite(ledpin[9],LOW);
digitalWrite(ledpin[10],HIGH);
digitalWrite(ledpin[11],LOW);
digitalWrite(ledpin[12],LOW);
break;
case 3:
digitalWrite(ledpin[9],HIGH);
digitalWrite(ledpin[10],HIGH);
digitalWrite(ledpin[11],LOW);
digitalWrite(ledpin[12],LOW);
break;
case 4:
digitalWrite(ledpin[9],LOW);
digitalWrite(ledpin[10],LOW);
digitalWrite(ledpin[11],HIGH);
digitalWrite(ledpin[12],LOW);
break;
case 5:
digitalWrite(ledpin[9],HIGH);
digitalWrite(ledpin[10],LOW);
digitalWrite(ledpin[11],HIGH);
digitalWrite(ledpin[12],LOW);
break;
case 6:
digitalWrite(ledpin[9],LOW);
digitalWrite(ledpin[10],HIGH);
digitalWrite(ledpin[11],HIGH);
digitalWrite(ledpin[12],LOW);
break;
case 7:
digitalWrite(ledpin[9],HIGH);
digitalWrite(ledpin[10],HIGH);
digitalWrite(ledpin[11],HIGH);
digitalWrite(ledpin[12],LOW);
break;
case 8:
digitalWrite(ledpin[9],LOW);
digitalWrite(ledpin[10],LOW);
digitalWrite(ledpin[11],LOW);
digitalWrite(ledpin[12],HIGH);
break;
case 9:
digitalWrite(ledpin[9],HIGH);
digitalWrite(ledpin[10],LOW);
digitalWrite(ledpin[11],LOW);
digitalWrite(ledpin[12],HIGH);
break;
}
}
void setNewTime(byte h[], byte m[]) { // adjusts new time every minute
if(m[0]==5 && m[1]==9) {
m[0]=0;
m[1]=0;
h[1]++;
} else if(m[1]==9) {
m[1]=0;
m[0]++;
} else
m[1]++;
if(h[0]==2 && h[1]==4) {
h[0]=0;
h[1]=0;
} else if(h[1]==9) {
h[1]=0;
h[0]++;
}
}
void setup(){
/* debug */
Serial.begin(9600);
/* set leds as OUTPUT */
for(int i=0; i<num_pins; i++) {
pinMode(ledpin[i], OUTPUT);
}
/* set internal pullup resistors for pushbuttons and also for the clock source */
digitalWrite(setbtn, HIGH);
digitalWrite(hourbtn, HIGH);
digitalWrite(minbtn, HIGH);
digitalWrite(clocksrc, HIGH);
setTime(hour, minutes); // first thing we have to do is adjust time
}
void loop(){
if(digitalRead(clocksrc)) { // desperately needs a fix
/* debug */
Serial.println("tick");
seconds++;
/* debug */
Serial.println(seconds, DEC);
if(seconds==60) {
seconds=0;
setNewTime(hour, minutes);
/* debug */
Serial.println("set new time");
printTime(hour, minutes);
}
delay(100); // this is a workaround for preventing the clock from ticking more than once per second
} // probably the shit that makes the clock don't work properly
}
I think I know where the problem resides but I don't know how to solve it. So please help me with this. Also any corrections on code optimization or even coding style will be helpful for me to continue learning.
Thank you very much.
Paco
PS. Sorry for my english.
Forget to say that the clock works great for a few minutes then goes crazy.
