diff --git a/LaserClock/LaserClock.ino b/LaserClock/LaserClock.ino index f1748e9..b7a1189 100644 --- a/LaserClock/LaserClock.ino +++ b/LaserClock/LaserClock.ino @@ -11,7 +11,6 @@ DS3231 clock; -#define pressed digitalRead(12) == LOW #define lightsens 1 #if lightsens #define lightsensorpin A0 @@ -39,134 +38,147 @@ bool brightmode = true; bool houtremp; +inline bool pressed() { + return digitalRead(12) == LOW; +} + void set(const unsigned char pin, bool on) { - if(on) { - if(brightmode) { - digitalWrite(pin, HIGH); - } else { - analogWrite(pin, ontime_lb); - } - } else { - analogWrite(pin, brightmode ? offtime : offtime_lb); - } + if(on) { + if(brightmode) { + digitalWrite(pin, HIGH); + } else { + analogWrite(pin, ontime_lb); + } + } else { + analogWrite(pin, brightmode ? offtime : offtime_lb); + } } //prints the data to the lasers, write(0,0)-> all off, write()-> all on void write(unsigned char m = 255, unsigned char h = 255) { - //write minutes - for(unsigned char i = 0; i < 6; i++) { - set(M[i], m & (1 << i)); -// analogWrite(M[i], (m & (1 << i)) ? 255 : offtime); - } - //write hour - for(unsigned char i = 0; i < 4; i++) { - set(H[i], h & (1 << i)); -// analogWrite(H[i], (h & (1 << i)) ? 255 : offtime); - } + //write minutes + for(unsigned char i = 0; i < 6; i++) { + set(M[i], m & (1 << i)); + } + //write hour + for(unsigned char i = 0; i < 4; i++) { + set(H[i], h & (1 << i)); + } } inline void writeTime() { - write(clock.getMinute(), clock.getHour(houtremp, houtremp)); + write(clock.getMinute(), clock.getHour(houtremp, houtremp)); } void setup() { - pinMode(13, OUTPUT); + pinMode(13, OUTPUT); // Pin 13 LED - //setup clock modul - Wire.begin(); - clock.setClockMode(true); //set 12h format - clock.turnOffAlarm(1);//disable Arlam - clock.turnOffAlarm(2); - - //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(); + //setup clock modul + Wire.begin(); + clock.setClockMode(true); //set 12h format + clock.turnOffAlarm(1);//disable Arlam + clock.turnOffAlarm(2); + + //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); // button - //setup messure array - int brightness = analogRead(lightsensorpin); - //memset(messure, brightness, messure_size); //does only work for integers! - for(int i = 0; i < messure_size; i++) { - messure[i] = brightness; - } - messure_add = brightness * messure_size; - - while(!pressed) delay(5);//wait for press + //setup messure array + int brightness = analogRead(lightsensorpin); + for(int i = 0; i < messure_size; i++) { + messure[i] = brightness; + } + messure_add = brightness * messure_size; +} - //setup time - char mode = 0;//mode = 0-> set hour, mode = 1 -> set min, mode = 2 -> exit setup - bool pres = true;//was button pressed - unsigned long timeout = millis(); - writeTime(); - while(mode < 2) { - if(pressed) {//button is pressed - if(!pres) {//button was not pressed before - timeout = millis();//reset timeout - pres = true; - if(mode == 0) {//count hour - byte hour = clock.getHour(houtremp, houtremp)+1; - clock.setHour(hour == 13 ? 1 : hour); - } else {//count min - byte minute = clock.getMinute()+1; - clock.setMinute(minute == 60 ? 0 : minute); - } - writeTime(); - } - } else { - pres = false; - } - if(millis() - timeout > 10000) {//timed out - //blink 6 times - for(int i = 0; i < 6; i++) { - write(0,0); - delay(300); - write(); - delay(300); - } - writeTime(); - ++mode;//next mode - //reset timeout - timeout = millis(); - } - delay(50); - } +void blink() { + for(int i = 0; i < 6; i++) { + write(0, 0); // full off + delay(300); + write(); // full on + delay(300); + } +} + +void setTime() { + while(pressed()) delay(5); // wait for not pressed anymore + + write(); // full on + + while(!pressed()) delay(5); //wait for press + + //setup time + char mode = 0;//mode = 0-> set hour, mode = 1 -> set min, mode = 2 -> exit setup + bool pres = true;//was button pressed + unsigned long timeout = millis(); + writeTime(); + while(mode < 2) { + if(pressed()) { //button is pressed + if(!pres) { //button was not pressed before + timeout = millis(); //reset timeout + pres = true; + if(mode == 0) {//count hour + byte hour = clock.getHour(houtremp, houtremp)+1; + clock.setHour(hour == 13 ? 1 : hour); + } else {//count min + byte minute = clock.getMinute()+1; + clock.setMinute(minute == 60 ? 0 : minute); + } + writeTime(); + } + } else { + pres = false; + } + if(millis() - timeout > 10000) { //timed out (button not pressed for 10s) + blink(); + writeTime(); + ++mode;//next mode + //reset timeout + timeout = millis(); + } + delay(50); + } } void loop() { - //update min - byte hour = clock.getHour(houtremp, houtremp); - if(hour > 12) - hour -=12; - clock.setHour(hour); - write(clock.getMinute(), hour); - - //let the led blink - digitalWrite(13, millis()/1000 % 2 == 0); - - delay(500); - - //update lighting values - #if lightsens - unsigned short brightness = analogRead(lightsensorpin);//messure + //update min + byte hour = clock.getHour(houtremp, houtremp); + if(hour > 12) + hour -=12; + clock.setHour(hour); + write(clock.getMinute(), hour); + + //let the led blink + digitalWrite(13, millis()/1000 % 2 == 0); + + delay(500); - messure_add -= messure[messure_pos]; //remove old value from avg - messure[messure_pos] = brightness; //add to array - messure_add += brightness; //add to avg - - if((++messure_pos) == messure_size)//increment pos, check range - messure_pos = 0; //reset - - unsigned short bavg = messure_add / messure_size; - - if(bavg < lighton) { - brightmode = true; - } else if(bavg > lightoff) { - brightmode = false; - } - #endif + if(pressed()) { + setTime(); + } + + //update lighting values +#if lightsens + unsigned short brightness = analogRead(lightsensorpin);//messure + + messure_add -= messure[messure_pos]; //remove old value from avg + messure[messure_pos] = brightness; //add to array + messure_add += brightness; //add to avg + + if((++messure_pos) == messure_size)//increment pos, check range + messure_pos = 0; //reset + + unsigned short bavg = messure_add / messure_size; + + if(bavg < lighton) { + brightmode = true; + } else if(bavg > lightoff) { + brightmode = false; + } +#endif }