void loop()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
if (digitalRead(8)==HIGH)
// has the user pressed the button? If so, display the menu
{
delay(500); // for debounce
// Serial.print(" pressed ");
lcd.clear();
lcd.setCursor(0,2);
lcd.print("button pressed");
delay(1000);
displaymenu();
}
if (alarmon==1)
{
checkalarm(); // should the alarm activate?
}
getDateDs1307comp();
printTemperatures();
checkTemp();
delay(500);
}
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock
Wire.send(decToBcd(minute));
Wire.send(decToBcd(hour));
Wire.send(decToBcd(dayOfWeek));
Wire.send(decToBcd(dayOfMonth));
Wire.send(decToBcd(month));
Wire.send(decToBcd(year));
Wire.send(0x10); // sends 0x10 (hex) 00010000 (binary) to control register - turns on square wave
Wire.endTransmission();
}
// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}
int readdial(int rangemax, int dialpin)
{
int kv=0;
int kr=0;
int kb=0;
float a=0;
float rd=0;
rd=1023/rangemax;
kb=analogRead(dialpin); // read potentiometer connected to analog pin 1
a=kb/rd;
kr=int(a);
if (kr>rangemax)
{
kr=rangemax;
}
return kr;
}
void displaymenu()
// display the menu options, selectable by using the knob
{
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Turn knob slowly");
lcd.setCursor(0,1);
lcd.print("to select option");
while (digitalRead(8)==LOW)
{
if (readdial(12,1)==0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set hours ");
}
else if (readdial(12,1)==1) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set minutes ");
}
else if (readdial(12,1)==2) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" 12 or 24h time?");
}
else if (readdial(12,1)==3) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set day of month");
}
else if (readdial(12,1)==4) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set month ");
}
else if (readdial(12,1)==5) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set year ");
}
else if (readdial(12,1)==6) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set Mon~Sun ");
}
else if (readdial(12,1)==7) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Alarm on/off ");
}
else if (readdial(12,1)==8) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set alarm hour");
}
else if (readdial(12,1)==9) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set alarm min. ");
}
else if (readdial(12,1)==10) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set Max Temp ");
}
else if (readdial(12,1)==11) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" exit menu ");
}
delay(100); // stop screen flicker
}
switch(readdial(12,1))
{
case 0:
msethours();
break;
case 1:
msetminutes();
break;
case 2:
mset1224();
break;
case 3:
msetday();
break;
case 4:
msetmonth();
break;
case 5:
msetyear();
break;
case 6:
msetdow();
break;
case 7:
alarmonoff();
break;
case 8:
msetalarmh();
break;
case 9:
msetalarmm();
break;
case 10:
settemp();
break;
}
// if the knob is 7, that is for return to clock display. function will end and return to clock by default
}
void mset1224()
// allows user to select between displaying 12 and 24 hour time
{
//Serial.write(" mset1224 ");
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Turn knob slowly");
lcd.setCursor(0,1);
lcd.print("to select option");
while (digitalRead(8)==LOW)
{
if (readdial(2,1)==0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" 12-hour time ");
}
else if (readdial(2,1)==1) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" 24-hour time ");
}
delay(100); // stop screen flicker
}
switch(readdial(2,1))
{
case 0:
t1224=0;
break;
case 1:
t1224=1;
break;
}
displaymenu();
}
void msethours()
// allows user to select hour value
{
//Serial.write(" msethours ");
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Select hour:0~23");
while (digitalRead(8)==LOW)
{
lcd.setCursor(8,1);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(readdial(24,1));
delay(100);
}
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
hour=readdial(24,1);
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
displaymenu();
}
void msetminutes()
// allows user to select minute value
{
//Serial.write(" msetminutes ");
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Set minute:0~59");
while (digitalRead(8)==LOW)
{
lcd.setCursor(8,1);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(readdial(60,1));
delay(100);
}
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
minute=readdial(60,1);
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
displaymenu();
}
void msetday()
// allows user to select day of the month
{
//Serial.write(" msetday ");
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set day: 1~31 ");
while (digitalRead(8)==LOW)
{
lcd.setCursor(8,1);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(readdial(31,1));
delay(100);
}
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
dayOfMonth=readdial(31,1);
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
displaymenu();
}
void msetmonth()
// allows user to select day of the month
{
//Serial.write(" msetmonth ");
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set month: 1~12");
while (digitalRead(8)==LOW)
{
lcd.setCursor(8,1);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(readdial(12,1));
delay(100);
}
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
month=readdial(12,1);
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
displaymenu();
}
void msetyear()
// allows user to select year
{
// Serial.write(" msetyear ");
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
delay(300); // for debounce
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Set year:00~99 ");
while (digitalRead(8)==LOW)
{
lcd.setCursor(8,1);
lcd.print(" ");
lcd.setCursor(8,1);
lcd.print(readdial(100,1));
delay(100);
}
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
year=readdial(100,1);
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
displaymenu();
}