//copyright Piers Walter. Do not distribute without permission. #include //include LCD library #include LiquidCrystal lcd(2,3,4,5,6,8);//LCD pins, intialize char* day[7] = {"MON ","TUE ","WED ","THU ","FRI ","SAT ","SUN "}; //set char string, remember that to print monday would be lcd.print(day[0]) unsigned long oldmillisec; int setBtn = A2; int downBtn = A2; int upBtn = A2; int exitBtn = A2; int volume = 0; int volumeMapped = 0; const int slaveSelectPin = 7; int light =0; int screenlight =0; int scrLed =10; /*byte degree[8] = { B00110, B01001, B01001, B00110, B00000, B00000, B00000, };*/ long msecPerHour=0;//hourly increment long msecPerMinute=0;//minute inrement long msecPerDay=0;//daily increment long totalSecPerDay=300;//dependent on crystal int DAY, HOURS, MINS, SECS; unsigned int MILLISECS; unsigned int currentSECS,lastSECS; //int temp; //int temp_address = 72; int zero = 0; void setup() { lcd.begin(16,2);//LCD width by height lcd.print("Initialized"); oldmillisec=millis(); pinMode(setBtn,INPUT); pinMode(downBtn,INPUT); pinMode(upBtn,INPUT); pinMode(exitBtn,INPUT); pinMode(slaveSelectPin,OUTPUT); SPI.begin(); SPI.setDataMode(0); } void loop() { boolean hourState=false; boolean minuteState=false; boolean dayState=false; boolean msecminState=false; while(digitalRead(7)==HIGH){ hourState = true;} while(hourState){ lcd.setCursor(0,0); lcd.print("Set Hours "); lcd.setCursor(6,1); if(HOURS<10)lcd.print("0"); lcd.print(HOURS); if(digitalRead(upBtn)==HIGH){HOURS++;tone(6,2500,15);} if(digitalRead(downBtn)==HIGH){HOURS--;tone(6,2500,15);} if(HOURS>23) HOURS -= 24; if(HOURS<0) HOURS+=24; delay(200); if(digitalRead(exitBtn)==HIGH){hourState=false; clear();} if(digitalRead(setBtn)==HIGH){minuteState=true; hourState=false; delay(200);}} while(minuteState==true){ lcd.setCursor(0,0); lcd.print("Set Minutes "); lcd.setCursor(9,1); if(MINS<10)lcd.print("0"); lcd.print(MINS); if(digitalRead(upBtn)==HIGH)MINS++; if(digitalRead(downBtn)==HIGH)MINS--; if(MINS>59) MINS -= 60; if(MINS<0) MINS+=60; delay(100); if(digitalRead(exitBtn)==HIGH){minuteState=false; clear();} if(digitalRead(setBtn)==HIGH){dayState=true;break; delay(200);} } while(dayState){ lcd.setCursor(0,0); lcd.print("Set Days "); lcd.setCursor(2,1); lcd.print(day[DAY]); if(digitalRead(upBtn)==HIGH){DAY++;tone(6,2500,15);} if(digitalRead(downBtn)==HIGH){DAY--;tone(6,2500,15);} if(DAY>6) DAY -= 7; if(DAY<0) DAY += 7; delay(100); if(digitalRead(exitBtn)==HIGH){dayState=false; clear();} if(digitalRead(setBtn)==HIGH){msecminState=true;dayState=false;}} while(msecminState==true){ lcd.setCursor(0,0); lcd.print("secs/day add "); if(digitalRead(upBtn)==HIGH){totalSecPerDay = totalSecPerDay++;tone(6,2500,15);} if(digitalRead(downBtn)==HIGH){totalSecPerDay = totalSecPerDay--;tone(6,2500,15);} long totalMsecPerDay = totalSecPerDay * 1000; msecPerMinute = totalMsecPerDay/1440; totalMsecPerDay = totalMsecPerDay % 1440;//remainder needs to be distributed hourly msecPerHour=totalMsecPerDay/24; totalMsecPerDay=totalMsecPerDay%24;//remainder needs to be distributed daily. msecPerDay=totalMsecPerDay; lcd.setCursor(0,1); lcd.print(" "); delay(10); lcd.setCursor(0,1); lcd.print(totalSecPerDay); delay(50); if(digitalRead(setBtn)==HIGH){ clear(); } if(digitalRead(exitBtn)==HIGH){ msecminState=false; lcd.print(" "); lcd.print(day[DAY]); if(HOURS<10){ lcd.print("0");} lcd.print(HOURS); lcd.print(":"); if(MINS<10){lcd.print("0");} lcd.print(MINS); lcd.print(":"); if(SECS<10){lcd.print("0");} lcd.print(SECS);}} unsigned long msec = millis(); unsigned long elapsed = msec - oldmillisec; oldmillisec = msec;//remember where we are MILLISECS += elapsed; //increase millisecs by elapsed amount currentSECS=SECS; while(MILLISECS>=1000){ MILLISECS -= 1000; SECS +=1;} if(currentSECS!=SECS){digitalWrite(13,HIGH); delay(20); clear(); } if(digitalRead(exitBtn)==HIGH)SECS=0; while(SECS>=60){SECS -=60; MINS++; MILLISECS+=msecPerMinute;}//add msecminute correction to elapsed while(MINS>=60){MINS-=60; HOURS++; MILLISECS += msecPerHour;tone(6,2500,15);delay(120);tone(6,2500,15);} while(HOURS>=24){HOURS-=24; DAY++; MILLISECS += msecPerDay;} while(DAY>=7){DAY-=7;} if(digitalRead(A0)==HIGH){volume ++; delay(10);} if(digitalRead(A1)==HIGH){volume --; delay(10);} if(volume>100){volume=100;} if(volume<0){volume=0;} volumeMapped = map(volume,0,100,0,127); digitalWrite(slaveSelectPin,LOW); SPI.transfer(0); SPI.transfer(volumeMapped); digitalWrite(slaveSelectPin,HIGH); lcd.setCursor(0,0); lcd.print(" "); lcd.print("Volume"); lcd.print("="); lcd.print(volume); lcd.print("%"); lcd.setCursor(0,1); lcd.print(" "); lcd.print(day[DAY]); if(HOURS<10){ lcd.print("0");} lcd.print(HOURS); lcd.print(":"); if(MINS<10){lcd.print("0");} lcd.print(MINS); lcd.print(":"); if(SECS<10){lcd.print("0");} lcd.print(SECS); delay(100); } void clear(){lcd.setCursor(0,0); lcd.print(" "); lcd.setCursor(0,0); lcd.setCursor(0,1); lcd.print(" "); delay(10);} void digitalPotWrite(int value) { //take the SS pin low to select the chip: digitalWrite(slaveSelectPin, LOW); //send in the address and value via SPI: SPI.transfer(0); SPI.transfer(value); // take the SS pin high to de-select the chip: digitalWrite(slaveSelectPin, HIGH); }