Arduino/LaserClock/LaserClock.ino

116 lines
2.1 KiB
C++

#define pressed digitalRead(12) == LOW
const unsigned char H[] = {8,9,10,11};
const unsigned char M[] = {2,3,4,5,6,7};
//const unsigned int mindelay = 60000;
const unsigned int mindelay = 59500;
unsigned char min = 0;
unsigned char hour = 0;
unsigned long lastmin;
#define nolog
void write(unsigned char m = 255, unsigned char h = 255) {
//write minutes
for(unsigned char i = 0; i < 6; i++) {
analogWrite(M[i], (m & (1 << i)) ? 255 : 1);
}
for(unsigned char i = 0; i < 4; i++) {
analogWrite(H[i], (h & (1 << i)) ? 255 : 4);
}
#ifndef nolog
Serial.print(hour);
Serial.print(":");
Serial.println(min);
#endif
}
void countTime() {
if(60 == ++min) {
min = 0;
if(13 == ++hour) {
hour = 0;
}
}
}
void setup() {
pinMode(13, OUTPUT);
#ifndef nolog
Serial.begin(9600);
#endif
//Setup pins
for(unsigned char m = 0; m < 6; m++) {
pinMode(M[m], OUTPUT);
}
for(unsigned char h = 0; h < 4; h++) {
pinMode(H[h], OUTPUT);
}
pinMode(12, INPUT_PULLUP);
write();
while(!pressed) delay(5);
//setup time
char mode = 0;
bool pres = false;
unsigned long timeout = millis();
while(mode < 2) {
if(pressed) {//button is pressed
if(!pres) {//button was not pressed before
timeout = millis();
pres = true;
if(mode == 0) {
hour ++;
if(hour == 13)
hour = 1;
} else {
min ++;
if(min == 60)
min = 0;
}
write(min, hour);
}
} else {
pres = false;
}
if(millis() - timeout > 10000) {
for(int i = 0; i < 6; i++) {
write(0,0);
delay(300);
write();
delay(300);
}
write(min, hour);
++mode;
timeout = millis();
}
delay(50);
}
lastmin = millis();
}
void loop() {
if((millis() - lastmin) >= mindelay) {
//update min
countTime();
write(min, hour);
lastmin += mindelay;
} else {
#ifndef nolog
Serial.print(millis()-lastmin);
Serial.print(" ");
Serial.println(millis()-lastmin >= mindelay);
#endif
}
if(millis()/1000 % 2 == 0) {
digitalWrite(13, HIGH);
} else
digitalWrite(13, LOW);
delay(50);
}