//copyright Piers Walter. Do not distribute without permission.
#include <SPI.h>
//include LCD library
#include <LiquidCrystal.h>
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);
}