#include // for I2C communication #include // for LCD #include #include // for RTC // create LCD with I2C address 0x27, 16 characters per line, 2 lines RTC_DS3231 rtc; #define SETpin 4 #define Up 3 #define Down 2 #define FW A0 #define BW A1 #define Feed A2 #define FCFW 13 #define FCBW 12 int timz = 0, k=0, key = 1, err=0, retour=0; int hr1 [4][6] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0} }; int mn1 [4][6] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0} }; int se1 [4][6] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0} }; int Dhr1 [4][6] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0} }; int Dmn1 [4][6] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0} }; int Dse1 [4][6] = { {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0}, {0,0,0,0,0,0} }; int SET=0 ,i=0,j=0,SET1=0,SET2=0,SET3=0,hr=0,mn=0,se=0, item1 = 0,item2 = 0, reg = 0,ref1 , ref2 ; const int rs = 5, en = 10, d4 = 6, d5 = 7, d6 = 8, d7 = 9; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); // create rtc for the DS3231 RTC module, address is fixed at 0x68 /* function to update RTC time using user input */ void updateRTC() { lcd.clear(); // clear LCD display lcd.setCursor(0, 0); lcd.print("Edit Mode..."); // ask user to enter new date and time const char txt[6][15] = { "year [4-digit]", "month [1~12]", "day [1~31]", "hours [0~23]", "minutes [0~59]", "seconds [0~59]"}; String str = ""; long newDate[6]; while (Serial.available()) { Serial.read(); // clear serial buffer } for (int i = 0; i < 6; i++) { Serial.print("Enter "); Serial.print(txt[i]); Serial.print(": "); while (!Serial.available()) { ; // wait for user input } str = Serial.readString(); // read user input newDate[i] = str.toInt(); // convert user input to number and save to array Serial.println(newDate[i]); // show user input } // update RTC rtc.adjust(DateTime(newDate[0], newDate[1], newDate[2], newDate[3], newDate[4], newDate[5])); Serial.println("RTC Updated!"); } /* function to update LCD text */ void updateLCD() { /* create array to convert digit days to words: 0 = Sunday | 4 = Thursday 1 = Monday | 5 = Friday 2 = Tuesday | 6 = Saturday 3 = Wednesday | */ const char dayInWords[7][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; /* create array to convert digit months to words: 0 = [no use] | 1 = January | 6 = June 2 = February | 7 = July 3 = March | 8 = August 4 = April | 9 = September 5 = May | 10 = October 6 = June | 11 = November 7 = July | 12 = December */ const char monthInWords[13][4] = {" ", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; // get time and date from RTC and save in variables DateTime rtcTime = rtc.now(); int ss = rtcTime.second(); int mm = rtcTime.minute(); int hh = rtcTime.hour(); int DD = rtcTime.dayOfTheWeek(); int dd = rtcTime.day(); int MM = rtcTime.month(); int yyyy = rtcTime.year(); // move LCD cursor to upper-left position lcd.setCursor(0, 0); // print date in dd-MMM-yyyy format and day of week if (dd < 10) lcd.print("0"); // add preceeding '0' if number is less than 10 lcd.print(dd); lcd.print("-"); lcd.print(monthInWords[MM]); lcd.print("-"); lcd.print(yyyy); lcd.print(" "); lcd.print(dayInWords[DD]); // move LCD cursor to lower-left position lcd.setCursor(0, 1); // print time in 12H format if (hh < 10) lcd.print("0"); lcd.print(hh); lcd.print(':'); if (mm < 10) lcd.print("0"); lcd.print(mm); lcd.print(':'); if (ss < 10) lcd.print("0"); lcd.print(ss); if (rtcTime.isPM()) lcd.print(" PM"); // print AM/PM indication else lcd.print(" AM"); } //////////////////////////////////////////////////////////////////// void setup() { Serial.begin(9600); // initialize serial lcd.begin(16,2); // switch-on lcd backlight rtc.begin(); // initialize rtc pinMode(SETpin,INPUT_PULLUP); pinMode(Up,INPUT_PULLUP); pinMode(Down,INPUT_PULLUP); pinMode(FW,OUTPUT); pinMode(BW,OUTPUT); pinMode(A2,OUTPUT); pinMode(A3,OUTPUT); pinMode(Feed,OUTPUT); //wdt_enable(WDTO_120MS); // attachInterrupt(digitalPinToInterrupt(2), UP, FALLING); // attachInterrupt(digitalPinToInterrupt(3), DOWN, FALLING); } void loop() { updateLCD(); // update LCD text if (Serial.available()) { char input = Serial.read(); if (input == 'u') updateRTC(); // update RTC time } for(int i=0 ; i<6; i++){ DateTime rtcTime = rtc.now(); if(hr1[0][i] == rtcTime.hour() && mn1[0][i] == rtcTime.minute() && se1[0][i] == rtcTime.second()){ digitalWrite(A0,HIGH); } if(hr1[1][i] == rtcTime.hour() && mn1[1][i] == rtcTime.minute() && se1[1][i] == rtcTime.second()){ digitalWrite(A1,HIGH); } if(hr1[2][i] == rtcTime.hour() && mn1[2][i] == rtcTime.minute() && se1[2][i] == rtcTime.second()){ digitalWrite(A2,HIGH); } if(hr1[3][i] == rtcTime.hour() && mn1[3][i] == rtcTime.minute() && se1[3][i] == rtcTime.second()){ digitalWrite(A3,HIGH); } ////// if(Dhr1[0][i] == rtcTime.hour() && Dmn1[0][i] == rtcTime.minute() && Dse1[0][i] == rtcTime.second()){ digitalWrite(A0,LOW); } if(Dhr1[1][i] == rtcTime.hour() && Dmn1[1][i] == rtcTime.minute() && Dse1[1][i] == rtcTime.second()){ digitalWrite(A1,LOW); } if(Dhr1[2][i] == rtcTime.hour() && Dmn1[2][i] == rtcTime.minute() && Dse1[2][i] == rtcTime.second()){ digitalWrite(A2,LOW); } if(hr1[3][i] == rtcTime.hour() && Dmn1[3][i] == rtcTime.minute() && Dse1[3][i] == rtcTime.second()){ digitalWrite(A3,LOW); } } if(digitalRead(SETpin) == 0){delay(100); if(digitalRead(SETpin) == 0){ lcd.clear() ; SET=1; item1=0; item2=0; }} while(SET == 1 || SET == 2){ while(SET==1){ for(int j = 0; j<2 ; j++){ if(item1 == j && SET == 1 ){ lcd.setCursor(4, 0); lcd.print("TIMER"); lcd.print(" :"); lcd.setCursor(4, 1); lcd.print("PUMP "); lcd.print(item1+1); } } if(digitalRead(Down) == 0){delay(100); lcd.clear() ; item1 --; } if(digitalRead(Up) == 0){ delay(100); lcd.clear() ;item1 ++; } if(item1 == -1 && SET == 1 ){lcd.clear() ; item1 = 3; } if(item1 == 4 && SET == 1 ){lcd.clear() ; item1 = 0; } if(digitalRead(SETpin) == 0){delay(100); if(digitalRead(SETpin) == 0){ lcd.clear() ; SET++; ref1 = item1; item1=0; delay(100); if(SET == 3){ SET = 0;} }}} while(SET==2){ for(int i = 0; i<2; i++){ if(item2 == i && i<2 && SET == 2 ){ lcd.setCursor(0, 0); lcd.print("T"); lcd.print(item2+1); lcd.print(" :"); lcd.setCursor(7, 0); lcd.print("h"); lcd.setCursor(11, 0); lcd.print("m"); lcd.setCursor(15, 0); lcd.print("s"); lcd.setCursor(0, 1); lcd.print("D"); lcd.print(item2+1); lcd.print(" :"); lcd.setCursor(7, 1); lcd.print("h"); lcd.setCursor(11, 1); lcd.print("m"); lcd.setCursor(15, 1); lcd.print("s"); } if(item2<2 && digitalRead(SETpin) == 0) { ref2 = item2; item2=0; reg++; delay(200); } if(reg==1){ lcd.setCursor(4,0); lcd.print(">"); } while(reg==1){ if(digitalRead(Down) == 0){delay(100); hr --; } if(digitalRead(Up) == 0){ delay(100); hr ++; } if(hr>24){ hr = 0; } if(hr==-1){ hr = 24; } if(hr < 10 ){ lcd.setCursor(5,0); lcd.print("0"); lcd.print(hr); } if(hr >= 10 ){ lcd.setCursor(5,0); lcd.print(hr); } if(digitalRead(SETpin) == 0){ delay(200); if(digitalRead(SETpin) == 0){ reg++; hr1[ref1][ref2] = hr; delay(200); } } } if(reg==2){lcd.setCursor(4,0); lcd.print(" "); lcd.setCursor(8,0); lcd.print(">"); } while(reg==2){ if(digitalRead(Down) == 0){delay(100); mn --; } if(digitalRead(Up) == 0){ delay(100); mn ++; } if(mn>59){ mn = 0; } if(mn==-1){ mn = 59; } if(mn < 10 ){ lcd.setCursor(9,0); lcd.print("0"); lcd.print(mn); } if(mn >= 10 ){ lcd.setCursor(9,0); lcd.print(mn); } if(digitalRead(SETpin) == 0){ delay(200); if(digitalRead(SETpin) == 0){ reg++; mn1[ref1][ref2] = mn; delay(200); } } } if(reg==3){lcd.setCursor(8,0); lcd.print(" "); lcd.setCursor(12,0); lcd.print(">"); } while(reg==3){ if(digitalRead(Down) == 0){delay(100); se --; } if(digitalRead(Up) == 0){ delay(100); se ++; } if(se>59){ se = 0; } if(se==-1){ se = 59; } if(se < 10 ){ lcd.setCursor(13,0); lcd.print("0"); lcd.print(se); } if(se >= 10 ){ lcd.setCursor(13,0); lcd.print(se); } if(digitalRead(SETpin) == 0){ delay(200); if(digitalRead(SETpin) == 0){ reg++; se1[ref1][ref2] = se; delay(200); } } } if(reg==4){lcd.setCursor(12,0); lcd.print(" "); lcd.setCursor(4,1); lcd.print(">"); } while(reg==4){ if(digitalRead(Down) == 0){delay(100); hr --; } if(digitalRead(Up) == 0){ delay(100); hr ++; } if(hr>24){ hr = 0; } if(hr==-1){ hr = 24; } if(hr < 10 ){ lcd.setCursor(5,1); lcd.print("0"); lcd.print(hr); } if(hr >= 10 ){ lcd.setCursor(5,1); ; lcd.print(hr); } if(digitalRead(SETpin) == 0){ delay(200); if(digitalRead(SETpin) == 0){ reg++; Dhr1[ref1][ref2] = hr; delay(200); } } } if(reg==5){lcd.setCursor(4,1); lcd.print(" "); lcd.setCursor(8,1); lcd.print(">"); } while(reg==5){ if(digitalRead(Down) == 0){delay(100); mn --; } if(digitalRead(Up) == 0){ delay(100); mn ++; } if(mn>59){ mn = 0; } if(mn==-1){ mn = 59; } if(mn < 10 ){ lcd.setCursor(9,1); lcd.print("0"); lcd.print(mn); } if(mn >= 10 ){ lcd.setCursor(9,1); lcd.print(mn); } if(digitalRead(SETpin) == 0){ delay(200); if(digitalRead(SETpin) == 0){ reg++; Dmn1[ref1][ref2] = mn; delay(200); } } } if(reg==6){lcd.setCursor(8,1); lcd.print(" "); lcd.setCursor(12,1); lcd.print(">"); } while(reg==6){ if(digitalRead(Down) == 0){delay(100); se --; } if(digitalRead(Up) == 0){ delay(100); se ++; } if(se>59){ se = 0; } if(se==-1){ se = 59; } if(se < 10 ){ lcd.setCursor(13,1); lcd.print("0"); lcd.print(se); } if(se >= 10 ){ lcd.setCursor(13,1); lcd.print(se); } if(digitalRead(SETpin) == 0){ delay(200); if(digitalRead(SETpin) == 0){ reg++; reg=0; Dse1[ref1][ref2] = se; delay(200); } } } if(item2 == 6){ lcd.setCursor(4, 0); lcd.print(" "); lcd.setCursor(3, 1); lcd.print(">>menu<< "); } } if(digitalRead(SETpin) == 0 && item2==6){ SET = 0; item1=0; item2=0; lcd.clear(); delay(100); } if(digitalRead(Down) == 0 || digitalRead(Up) == 0){ if(digitalRead(Down) == 0){delay(100); lcd.clear() ; item2 --; } if(digitalRead(Up) == 0){ delay(100); lcd.clear() ;item2 ++; } if(item2 == -1 && SET == 2 ){lcd.clear() ; item2 = 6; } if(item2 == 7 && SET == 2 ){lcd.clear() ; item2 = 0; } lcd.setCursor(5,0); lcd.print(hr1[ref1][item2]); lcd.setCursor(9,0); lcd.print(mn1[ref1][item2]); lcd.setCursor(13,0); lcd.print(se1[ref1][item2]); lcd.setCursor(5,1); lcd.print(Dhr1[ref1][item2]); lcd.setCursor(9,1); lcd.print(Dmn1[ref1][item2]); lcd.setCursor(13,1); lcd.print(Dse1[ref1][item2]); } } } }