// LCD1602&NANO clock
#include <avr/wdt.h> // watchdog
#include <Wire.h>
#include <LiquidCrystal_I2C.h> /*include LCD I2C Library*/
#include <Keypad.h>
#include <EEPROM.h>
#include "RTClib.h"
#include <avr/sleep.h>
#define SQW_PIN 2
#define outsig 11
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x27, 16, 2);
/////keypad configuration
char customKey;
const String accessCode = "00";
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte rowPins[ROWS] = { 6, 5, 4, 3 }; // Connect to the row pinouts of the keypad
byte colPins[COLS] = { 12, A0, A1, A2 }; // Connect to the column pinouts of the keypad
byte wakePinCols[COLS] = { 12, A0, A1, A2 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int counter = 0;
byte pressed;
byte digit;
byte number;
char key;
byte numberBCD;
byte sec;
byte heur;
byte minut;
byte newsec;
byte newheur;
byte newminut;
byte minalarme;
byte eta;
byte hh;
byte min;
byte p;
byte light = 0;
byte rstsig = 0;
// -------------------times generation
unsigned long time0;
unsigned long time1;
unsigned long time11;
unsigned long time2;
unsigned long time3;
unsigned long tout = 30000;
int biptime = 10;
byte statualarm;
volatile bool timerflag = false;
//-------------------Alarmes programs:
byte prog1[3];
byte prog2[3];
byte prog3[3];
byte prog4[3];
byte prog5[3];
byte prog6[3];
byte prog7[3];
byte prog8[3];
byte prog9[3];
byte prog10[3];
byte prog11[3];
byte prog12[3];
byte prog13[3];
byte prog14[3];
byte prog15[3];
byte prog16[3];
byte prog17[3];
byte prog18[3];
byte prog19[3];
byte prog20[3];
byte prog21[3];
byte prog22[3];
byte prog23[3];
byte prog24[3];
byte prog25[3];
byte prog26[3];
byte prog27[3];
byte prog28[3];
byte prog29[3];
byte prog30[3];
byte preset[30][3]; //2D Arrays
// -------------------------Exceptions programs:
byte Ex1[6];
byte Ex2[6];
byte Ex3[6];
byte Ex4[6];
byte Ex5[6];
byte Ex6[6];
byte Ex7[6];
byte Ex8[6];
byte Ex9[6];
byte Ex10[6];
byte Ex11[6];
byte Ex12[6];
byte Ex[12][6];
byte except; //1=exception
//data exploited dor Exception programs
byte data1;
byte data2;
byte data3;
byte data4;
byte data5;
byte data6;
String menu[] = { "Regler le temps", "Regler la date", "Regler Prog N", "Regler Prog V", "Activer/Desactiver", "Exceptions" };
const int out = 9;
const int buzer = 7;
volatile bool sqwdetected = false;
byte k;
byte activation;
int line1;
int line2;
int dayOfWeek;
int jour;
int mois;
int annee;
byte screen;
void setup() {
ADCSRA &= ~(1 << ADEN); // Disable ADC
for (byte i = 0; i < 3; i++) { //////////////////ARRAY 2D
preset[0][i] = prog1[i];
preset[1][i] = prog2[i];
preset[2][i] = prog3[i];
preset[3][i] = prog4[i];
preset[4][i] = prog5[i];
preset[5][i] = prog6[i];
preset[6][i] = prog7[i];
preset[7][i] = prog8[i];
preset[8][i] = prog9[i];
preset[9][i] = prog10[i];
preset[10][i] = prog11[i];
preset[11][i] = prog12[i];
preset[12][i] = prog13[i];
preset[13][i] = prog14[i];
preset[14][i] = prog15[i];
preset[15][i] = prog16[i];
preset[16][i] = prog17[i];
preset[17][i] = prog18[i];
preset[18][i] = prog19[i];
preset[29][i] = prog20[i];
preset[20][i] = prog21[i];
preset[21][i] = prog22[i];
preset[22][i] = prog23[i];
preset[23][i] = prog24[i];
preset[24][i] = prog25[i];
preset[25][i] = prog26[i];
preset[26][i] = prog27[i];
preset[27][i] = prog28[i];
preset[28][i] = prog29[i];
preset[29][i] = prog30[i];
}
for (byte i = 0; i < 6; i++) {
Ex[0][i] = Ex1[i];
Ex[1][i] = Ex2[i];
Ex[2][i] = Ex3[i];
Ex[3][i] = Ex4[i];
Ex[4][i] = Ex5[i];
Ex[5][i] = Ex6[i];
Ex[6][i] = Ex7[i];
Ex[7][i] = Ex8[i];
Ex[8][i] = Ex9[i];
Ex[9][i] = Ex10[i];
Ex[10][i] = Ex11[i];
Ex[11][i] = Ex12[i];
}
except = 0;
//rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));
Wire.begin();
rtc.begin();
lcd.begin(16, 2);
lcd.backlight(); /*Turn ON LCD Backlight*/
light = 1;
EEPROM.begin();
delay(100);
lcd.clear();
lcd.setCursor(5, 0);
//lcd.print("GMT+1 TIME :");
lcd.print("OFPPT");
delay(100);
lcd.setCursor(3, 1);
lcd.print("ISTA ASSAKA");
delay(1800);
lcd.clear();
rtcread();
printhour();
printmin();
printsec();
printday();
readprog();
newminut = minut; //solution for backlight
delay(100);
sqwset(); //1H rtc setting
pressed = 0;
digit = 0;
number = 0;
screen = 1;
pinMode(SQW_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(SQW_PIN), signal, RISING);
pinMode(out, OUTPUT);
pinMode(outsig, OUTPUT);
//pinMode(out2, OUTPUT);
digitalWrite((buzer), 1);
//digitalWrite((out2), 0);
statualarm = 0;
//digitalWrite((out), 1);
delay(200);
digitalWrite((buzer), 0);
time0 = millis();
//timer2set();
pcintkey();
// RTC configuration----------------------------------------------
//char daysOfTheWeek[7][12] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
//wdt_enable(WDTO_8S); //setup wachdog to 8 seconds
}
void loop() { //------------------------------------------------------------------------------void loop------------------------------------------------
//wdt_reset();
/*time1 = millis();
time11 = time1 - time0;
if (time11 >= 1000) { */
if (sqwdetected) {
wdt_reset();
//time0 = time1;
rstsig++;
if (rstsig>12){digitalWrite(outsig,HIGH);delay(100); digitalWrite(outsig,LOW); rstsig=0;}
sec++;
if (sec >= 60) {
sec = 0;
minut++;
}
if (minut >= 60) {
minut = 0;
heur++;
}
if (heur >= 24) { heur = 0; }
if (sec == 40) {
rtcread();
comparer();
if ((except) == 1) {
lcd.setCursor(0, 1);
lcd.print("Exc");
} else {
lcd.setCursor(0, 1);
lcd.print(" ");
}
}
if (sec == 0) { cheekalarme(); }
timerflag=false;
sqwdetected=false;
goToSleep();
}
//char
key = keypad.getKey();
if (key) {
bip();
lcd.backlight();
light = 1;
}
if ((key) == 'B') {
digitalWrite(outsig,HIGH);
nextalarm();
bip();
} ////////////////////////////////////////////// to Next alarm
//dayOfWeek = now.dayOfTheWeek();
if ((key) == 'A') { //////////////////////////////////////////////////////////MENU
digitalWrite(outsig,HIGH);
screen = 0;
bip();
k = 0;
line1 = 0;
time2 = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(menu[k]);
line1 = k;
}
while ((screen) == 0) {
wdt_reset();
time3 = millis();
if ((time3 - time2) > tout) {
screen = 10;
timeout();
home();
}
if ((line1) != k) {
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(menu[k]);
line1 = k;
}
//delay(80);
//char
key = keypad.getKey();
if ((key)) {
time2 = millis();
bip();
}
switch (key) {
case 'C':
k++;
bip();
break;
case 'D':
bip();
k--;
break;
case '*':
bip();
screen = 1;
line1 = 10;
home();
break;
case '#':
bip();
if ((k) == 0) { settime(); }
if ((k) == 1) { setdate(); }
if ((k) == 2) { setprognormal(); }
if ((k) == 3) { setprogvendredi(); }
if ((k) == 4) { controle(); }
if ((k) == 5) { Exceptions(); }
break;
}
if ((k) > 10) { k = 0; }
if ((k) > 5) { k = 5; }
}
/////////////////////////////////////////////////////////////////////////////cheeck programs
if ((minut) != minalarme) { statualarm = 0; } //reset alarme occur
if (newsec != sec) { //update sec printing
newsec = sec;
printsec();
}
if (newminut != minut) { //update some printing
if (light == 1) {
lcd.noBacklight();
light = 0;
}
newminut = minut;
printmin();
printhour();
printday();
}
if (newheur != heur) {
newheur = heur;
printhour();
}
goToSleep();
//if ((sec)==10){comparer();} // cheek for exceptions every 1minut
//if ((newminut)==50){comparer();}
//if(newsec>=58){printday();} //reprint date
//sqwDetected=false;
//while(sqwDetected==false){};
}
void readnumber() { //red number from keypad
wdt_reset();
key = keypad.getKey();
if ((key)) {
time2 = millis();
bip();
}
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
} //timeout(); //home();}
if ((key) == '*') {
pressed = 6;
bip();
}
if (key >= '0' && key <= '9') {
//lcd.print("-------1");
pressed++;
switch (key) {
case '0':
digit = 0;
bip();
break;
case '1':
digit = 1;
bip();
break;
case '2':
digit = 2;
bip();
break;
case '3':
digit = 3;
bip();
break;
case '4':
digit = 4;
bip();
break;
case '5':
digit = 5;
bip();
break;
case '6':
digit = 6;
bip();
break;
case '7':
digit = 7;
bip();
break;
case '8':
digit = 8;
bip();
break;
case '9':
digit = 9;
bip();
break;
}
}
if (pressed == 1) {
number = digit;
}
if (pressed == 2) {
number = (number * 10) + digit;
}
if (pressed == 3) {
number = (number * 10) + digit;
}
if (pressed == 4) {
number = (number * 10) + digit;
}
}
// print hour-----------------------------------------------------
void printhour() {
//DateTime now = rtc.now();
lcd.setCursor(4, 1);
lcd.print(" ");
lcd.setCursor(4, 1);
if ((heur) < 10) {
lcd.print("0");
lcd.print(heur, DEC);
} else {
lcd.print(heur, DEC);
}
//lcd.print(now.hour(), DEC);
lcd.setCursor(6, 1);
lcd.print(":");
}
// print min------------------------------------------------------
void printmin() {
//DateTime now = rtc.now();
lcd.setCursor(7, 1);
lcd.print(" ");
lcd.setCursor(7, 1);
if (minut < 10) {
lcd.print("0");
lcd.print(minut, DEC);
} else {
lcd.print(minut, DEC);
}
//lcd.print(now.minute(), DEC);
lcd.setCursor(9, 1);
lcd.print(":");
}
// print second-----------------------------------------------------
void printsec() {
lcd.setCursor(10, 1);
lcd.print(" ");
lcd.setCursor(10, 1);
//lcd.print(now.second(), DEC);
if (sec < 10) {
lcd.print("0");
lcd.print(sec);
} else {
lcd.print(sec);
}
if ((activation) >= 1) {
lcd.setCursor(13, 1);
lcd.print("ON ");
}
if ((activation) == 0) {
lcd.setCursor(13, 1);
lcd.print("OFF");
}
}
void printday() {
DateTime now = rtc.now();
//daysOfTheWeek
//int dayOfWeek = now.dayOfTheWeek(); // Get the day of the week (1 = Sunday, 2 = Monday, ... 7 = Saturday)
String dayName;
switch (dayOfWeek) {
case 0:
dayName = "Dim";
break;
case 1:
dayName = "Lun";
break;
case 2:
dayName = "Mar";
break;
case 3:
dayName = "Mer";
break;
case 4:
dayName = "Jeu";
break;
case 5:
dayName = "Ven";
break;
case 6:
dayName = "Sam";
break;
default:
dayName = "Invalid Day";
}
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print(dayName);
lcd.print(" ");
if ((now.day()) < 10) {
lcd.print("0");
lcd.print(now.day(), DEC);
} else {
lcd.print(now.day(), DEC);
}
lcd.print("/");
if ((now.month()) < 10) {
lcd.print("0");
lcd.print(now.month(), DEC);
} else {
lcd.print(now.month(), DEC);
}
//lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
}
void home() { // print home screen
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("GMT+1 TIME :");
delay(1000);
rtcread();
comparer();
if ((except) == 1) {
lcd.setCursor(0, 1);
lcd.print("Exc");
} else {
lcd.setCursor(0, 1);
lcd.print(" ");
}
printhour();
printmin();
printsec();
printday();
digitalWrite(outsig,LOW);
}
void alarmeon() { //Alarm occur
lcd.backlight();
wdt_reset();
digitalWrite((out), 1);
delay(4500);
wdt_reset();
delay(4500);
lcd.backlight();
digitalWrite((out), 0);
statualarm = 1;
lcd.noBacklight();
rtcread();
}
void cheekalarme() {
for (byte i = 0; i < 15; i++) {
for (byte j = 0; j < 3; j++) { preset[i][j]; }
if ((preset[i][0]) == 1) {
if ((except) == 0 && (dayOfWeek) != 0 && (dayOfWeek) != 5
&& (preset[i][1]) == heur && (preset[i][2]) == minut
&& (statualarm) == 0 && (activation) != 0) {
//time0 = millis();
minalarme = minut;
alarmeon();
} else {
digitalWrite((out), 0);
}
}
}
for (byte i = 16; i < 30; i++) {
for (byte j = 0; j < 3; j++) { preset[i][j]; }
if ((preset[i][0]) == 1) {
if ((except) == 0 && (dayOfWeek) != 0 && (dayOfWeek) == 5 && (preset[i][1]) == heur && (preset[i][2]) == minut && (statualarm) == 0 && (activation) != 0) {
//time0 = millis();
minalarme = minut;
alarmeon();
} else {
digitalWrite((out), 0);
}
}
}
}
void bip() { // keypad bip
digitalWrite((buzer), 1);
delay(biptime);
digitalWrite((buzer), 0);
}
void settime() { //////////////////////////////////////////////////////////////////////VOID SETTIME
time2 = millis();
wdt_reset();
time3 = millis();
lcd.clear();
lcd.print("regler le temps");
delay(1000);
screen = 0;
pressed = 0;
while (screen == 0) {
wdt_reset();
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Entrer heur: "); // --------------set hour
while (pressed < 2) {
wdt_reset();
readnumber();
if ((pressed) == 1) {
lcd.setCursor(13, 0);
lcd.print(number);
}
if ((pressed) == 2) {
lcd.setCursor(13, 0);
lcd.print(number);
}
}
//lcd.setCursor(13, 0);
//lcd.print(number);
numberBCD = ((number / 10) << 4) | (number % 10);
//pressed=0;
delay(1000);
if (pressed != 6) {
Wire.beginTransmission(0x68); // DS3232 address (adjust if necessary)
Wire.write(0x02); // Address for Seconds register
Wire.write(numberBCD); // Set seconds to 00 (in BCD format)
Wire.endTransmission();
}
pressed = 0;
char key = keypad.getKey();
if ((key)) {
time2 = millis();
bip();
}
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
}
lcd.setCursor(1, 0); // -------------------set minutes
lcd.print("set minutes: ");
while (pressed < 2) {
wdt_reset();
readnumber();
if ((pressed) == 1) {
lcd.setCursor(13, 0);
lcd.print(number);
}
if ((pressed) == 2) {
lcd.setCursor(13, 0);
lcd.print(number);
}
}
//lcd.setCursor(13, 0);
//lcd.print(number);
numberBCD = ((number / 10) << 4) | (number % 10);
delay(1000);
if (pressed != 6) {
Wire.beginTransmission(0x68); // DS3232 address (adjust if necessary)
Wire.write(0x01); // Address for Seconds register
Wire.write(numberBCD); // Set seconds to 00 (in BCD format)
Wire.endTransmission();
}
pressed = 0;
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
}
lcd.setCursor(1, 0); // ---------------------set sec
lcd.print("set seconds: ");
while (pressed < 2) {
wdt_reset();
readnumber();
if ((pressed) == 1) {
lcd.setCursor(13, 0);
lcd.print(number);
}
if ((pressed) == 2) {
lcd.setCursor(13, 0);
lcd.print(number);
}
}
//lcd.setCursor(13, 0);
//lcd.print(number);
numberBCD = ((number / 10) << 4) | (number % 10);
//pressed=0;
delay(1000);
if (pressed != 6) {
Wire.beginTransmission(0x68); // DS3232 address (adjust if necessary)
Wire.write(0x00); // Address for Seconds register
Wire.write(numberBCD); // Set seconds to 00 (in BCD format)
Wire.endTransmission();
}
//pressed = 0;
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
break;
}
break;
}
line1 = k + 1;
comparer();
}
void setdate() { //////////////////////////////////////////////////////////////////////////void setdate
wdt_reset();
pressed = 0;
screen = 0;
time2 = millis();
lcd.setCursor(1, 0); // ---------------------set day
lcd.print("set day: ");
while (pressed < 2) {
wdt_reset();
readnumber();
if ((pressed) == 1) {
lcd.setCursor(13, 0);
lcd.print(number);
}
if ((pressed) == 2) {
lcd.setCursor(13, 0);
lcd.print(number);
}
}
//lcd.setCursor(13, 0);
//lcd.print(number);
numberBCD = ((number / 10) << 4) | (number % 10);
//pressed=0;
delay(1000);
if (pressed != 6) {
Wire.beginTransmission(0x68); // DS3232 address (adjust if necessary)
Wire.write(0x04); // Address for Seconds register
Wire.write(numberBCD); // Set seconds to 00 (in BCD format)
Wire.endTransmission();
}
pressed = 0;
lcd.setCursor(1, 0); // ---------------------set month
lcd.print("set month: ");
while (pressed < 2) {
wdt_reset();
readnumber();
if ((pressed) == 1) {
lcd.setCursor(13, 0);
lcd.print(number);
}
if ((pressed) == 2) {
lcd.setCursor(13, 0);
lcd.print(number);
}
}
//lcd.setCursor(13, 0);
//lcd.print(number);
numberBCD = ((number / 10) << 4) | (number % 10);
//pressed=0;
delay(1000);
if (pressed != 6) {
Wire.beginTransmission(0x68); // DS3232 address (adjust if necessary)
Wire.write(0x05); // Address for Seconds register
Wire.write(numberBCD); // Set seconds to 00 (in BCD format)
Wire.endTransmission();
}
pressed = 0;
lcd.setCursor(1, 0); // ---------------------set yaer
lcd.print("set year:20XX ");
while (pressed < 2) {
wdt_reset();
readnumber();
if ((pressed) == 1) {
lcd.setCursor(12, 0);
lcd.print(number);
}
if ((pressed) == 2) {
lcd.setCursor(12, 0);
lcd.print(number);
}
}
//lcd.setCursor(12, 0);
//lcd.print(2000+number);
numberBCD = ((number / 10) << 4) | (number % 10);
//pressed=0;
delay(1000);
if (pressed != 6) {
Wire.beginTransmission(0x68); // DS3232 address (adjust if necessary)
Wire.write(0x06); // Address for Seconds register
Wire.write(numberBCD); // Set seconds to 00 (in BCD format)
Wire.endTransmission();
}
pressed = 0;
line1 = k + 1;
comparer();
//screen = 1;
//home();
//break;
}
void setprognormal() { ////////////////////////////////////////////////////////ENTER SETTING
wdt_reset();
screen = 0;
p = 0;
lcd.clear();
time2 = millis();
while (screen == 0) {
wdt_reset();
key = keypad.getKey();
if ((key)) {
time2 = millis();
bip();
}
time3 = millis();
if ((key) == 'C') {
p++;
bip();
if ((p) > 15) { p = 0; }
if ((p) < 0) { p = 15; }
}
if ((key) == 'D') {
p--;
bip();
if ((p) < 0) { p = 15; }
if ((p) > 16) { p = 0; }
}
//delay(100);
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Program ");
//lcd.print(" ");
lcd.print(":");
lcd.print(p);
lcd.print(" ");
lcd.setCursor(2, 1);
//lcd.print(preset[p][0]);
//lcd.print(" ");
lcd.print(preset[p][1]);
lcd.print(":");
lcd.print(preset[p][2]);
lcd.print(" ");
if ((preset[p][0]) == 1) {
lcd.setCursor(13, 1);
lcd.print("ON ");
}
if ((preset[p][0]) == 0) {
lcd.setCursor(13, 1);
lcd.print("OFF");
}
//lcd.print(" ");
if ((time3 - time2) > tout) {
screen = 10;
timeout();
home();
}
if ((key) == '#') {
bip();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Program :");
//lcd.print(" ");
lcd.print(p);
lcd.setCursor(2, 1);
lcd.print("--:--");
//lcd.print(" ");
pressed = 0;
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
break;
}
while (pressed < 2) {
wdt_reset();
readnumber();
if (number >= 24) { number = 00; }
hh = number;
if ((pressed) > 0) {
lcd.setCursor(2, 1);
lcd.print(hh);
}
}
//lcd.print(":");
pressed = 0;
number = 0;
while (pressed < 2) {
wdt_reset();
readnumber();
min = number;
if (number >= 60) { number = 00; }
//byte min=number;
if ((pressed) > 0) {
lcd.setCursor(5, 1);
lcd.print(min);
}
}
pressed = 0;
counter = 0;
delay(100);
number = 0;
//lcd.clear();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
while (pressed < 1) {
wdt_reset();
if ((counter) == 0) {
lcd.clear();
//lcd.setCursor(0, 0);
//lcd.print("pr:");
//lcd.print(p);
//lcd.print("entrer:0 ou 1");
lcd.setCursor(1, 0);
lcd.print("1 ==> activer");
//delay(1500);
lcd.setCursor(1, 1);
lcd.print("0 ==> desactiver");
counter++;
//delay(1500);
}
readnumber();
if (number >= 2) { number = 1; }
eta = number;
//lcd.setCursor(8,1);
//lcd.print(eta);
if ((pressed) >= 1) {
lcd.clear();
lcd.print(" ");
if ((eta) == 0) {
lcd.print(" Desactiver");
delay(1000);
}
if ((eta) == 1) {
lcd.print(" Activer ");
delay(1000);
}
//if((pressed)>=1){delay(1000);}
//break;
}
}
//delay(100);
lcd.clear();
if ((pressed) != 6) {
//byte instprog[]={eta,hh,min};
//for(byte i=0; i<3; i++){
//preset[p][i]=instprog[i];
// }
byte dataeta = EEPROM.read(p * 3);
if ((dataeta) != eta) { EEPROM.write(p * 3, eta); }
byte datahh = EEPROM.read((p * 3) + 1);
if ((datahh) != hh) { EEPROM.write((p * 3) + 1, hh); }
byte datamin = EEPROM.read((p * 3) + 2);
if ((datamin) != min) { EEPROM.write((p * 3 + 2), min); }
readprog();
}
}
//setprog();
delay(10);
if ((key) == '*') {
bip();
screen = 1;
}
}
home();
}
void setprogvendredi() { ///////////////////////////////////////////////////////ENTER SETTING
wdt_reset();
lcd.clear();
screen = 0;
p = 16;
time2 = millis();
while (screen == 0) {
wdt_reset();
char key = keypad.getKey();
if ((key)) {
time2 = millis();
bip();
}
time3 = millis();
if ((key) == 'C') {
p++;
bip();
if ((p) >= 30) { p = 0; }
if ((p) < 16) { p = 16; }
}
if ((key) == 'D') {
p--;
bip();
if ((p) < 16) { p = 16; }
if ((p) >= 30) { p = 16; }
}
//delay(10);
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Program ");
//lcd.print(" ");
lcd.print(":");
lcd.print(p);
lcd.print(" ");
lcd.setCursor(2, 1);
//lcd.print(preset[p][0]);
//lcd.print(" ");
lcd.print(preset[p][1]);
lcd.print(":");
lcd.print(preset[p][2]);
lcd.print(" ");
if ((preset[p][0]) == 1) {
lcd.setCursor(13, 1);
lcd.print("ON ");
}
if ((preset[p][0]) == 0) {
lcd.setCursor(13, 1);
lcd.print("OFF");
}
//lcd.print(" ");
if ((time3 - time2) > tout) {
screen = 10;
timeout();
home();
}
if ((key) == '#') {
bip();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Program :");
//lcd.print(" ");
lcd.print(p);
lcd.setCursor(2, 1);
lcd.print("--:--");
//lcd.print(" ");
pressed = 0;
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
break;
}
while (pressed < 2) {
wdt_reset();
readnumber();
if (number >= 24) { number = 00; }
hh = number;
if ((pressed) > 0) {
lcd.setCursor(2, 1);
lcd.print(hh);
}
}
//lcd.print(":");
pressed = 0;
number = 0;
while (pressed < 2) {
wdt_reset();
readnumber();
min = number;
if (number >= 60) { number = 00; }
//byte min=number;
if ((pressed) > 0) {
lcd.setCursor(5, 1);
lcd.print(min);
}
}
pressed = 0;
counter = 0;
delay(100);
number = 0;
//lcd.clear();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
while (pressed < 1) {
wdt_reset();
if ((counter) == 0) {
lcd.clear();
//lcd.setCursor(0, 0);
//lcd.print("pr:");
//lcd.print(p);
//lcd.print("entrer:0 ou 1");
lcd.setCursor(1, 0);
lcd.print("1 ==> activer");
//delay(1500);
lcd.setCursor(1, 1);
lcd.print("0 ==> desactiver");
counter++;
//delay(1500);
}
readnumber();
if (number >= 2) { number = 1; }
eta = number;
//lcd.setCursor(8,1);
//lcd.print(eta);
if ((pressed) >= 1) {
lcd.clear();
lcd.print(" ");
if ((eta) == 0) {
lcd.print(" Desactiver");
delay(1000);
}
if ((eta) == 1) {
lcd.print(" Activer ");
delay(1000);
}
//if((pressed)>=1){delay(1000);}
//break;
}
}
//delay(1000);
lcd.clear();
if ((pressed) != 6) {
//byte instprog[]={eta,hh,min};
//for(byte i=0; i<3; i++){
//preset[p][i]=instprog[i];
// }
byte dataeta = EEPROM.read(p * 3);
if ((dataeta) != eta) { EEPROM.write(p * 3, eta); }
byte datahh = EEPROM.read((p * 3) + 1);
if ((datahh) != hh) { EEPROM.write((p * 3) + 1, hh); }
byte datamin = EEPROM.read((p * 3) + 2);
if ((datamin) != min) { EEPROM.write((p * 3 + 2), min); }
readprog();
}
}
//setprog();
delay(10);
if ((key) == '*') {
screen = 1;
bip();
}
}
home();
}
void timeout() { //time over to exit from menu
lcd.clear();
lcd.print(" Ecran ");
lcd.setCursor(0, 1);
lcd.print(" d'aceuil ");
delay(2000);
wdt_reset();
}
void readprog() { //Read eeprom
wdt_reset();
//Read all programs
for (int i = 0; i < 30; i++) {
preset[i][0] = EEPROM.read(i * 3);
if ((preset[i][0]) > 1) {
preset[i][0] = 1;
EEPROM.update((i * 3), 1);
}
preset[i][1] = EEPROM.read((i * 3) + 1);
if ((preset[i][1]) >= 24) {
preset[i][1] = 99;
EEPROM.update((i * 3) + 1, 99);
}
preset[i][2] = EEPROM.read((i * 3) + 2);
if ((preset[i][2]) >= 60) {
preset[i][2] = 99;
EEPROM.update((i * 3) + 2, 99);
}
}
for (byte i = 0; i < 12; i++) {
Ex[i][0] = EEPROM.read((i * 6) + 110);
if ((Ex[i][0]) > 31) { Ex[i][0] = 30; }
Ex[i][1] = EEPROM.read((i * 6) + 111);
if ((Ex[i][1]) > 12) { Ex[i][1] = 12; }
Ex[i][2] = EEPROM.read((i * 6) + 112);
if ((Ex[i][2]) > 99) { Ex[i][2] = 99; }
Ex[i][3] = EEPROM.read((i * 6) + 113);
if ((Ex[i][3]) > 31) { Ex[i][3] = 30; }
Ex[i][4] = EEPROM.read((i * 6) + 114);
if ((Ex[i][4]) > 12) { Ex[i][4] = 12; }
Ex[i][5] = EEPROM.read((i * 6) + 115);
if ((Ex[i][5]) > 99) { Ex[i][5] = 99; }
}
for (byte i = 0; i < 12; i++) {
EEPROM.update((i * 6) + 110, Ex[i][0]);
EEPROM.update((i * 6) + 111, Ex[i][1]);
EEPROM.update((i * 6) + 112, Ex[i][2]);
EEPROM.update((i * 6) + 113, Ex[i][3]);
EEPROM.update((i * 6) + 114, Ex[i][4]);
EEPROM.update((i * 6) + 115, Ex[i][5]);
}
activation = EEPROM.read(100);
if ((activation) > 1) { activation = 1; }
if ((activation) != EEPROM.read(100)) { EEPROM.write(100, activation); }
}
void nextalarm() { // scaninig for enabled alarms
wdt_reset();
//byte statrt=1;
lcd.clear();
lcd.print("Alarme suivant: ");
byte refhh = heur;
byte refmin = minut;
if ((except) == 0 && (dayOfWeek) != 0 && (dayOfWeek) != 5 && (activation) != 0) {
for (byte x = 0; x < 16; x++) {
for (byte i = 0; i < 16; i++) {
//for (byte x = 0; x < 16; x++) {
if ((x) == 0 && (preset[i][0]) == 1 && (preset[i][1]) == refhh && (preset[i][2]) >= refmin) {
lcd.setCursor(6, 1);
lcd.print(preset[i][1]);
lcd.print(":");
lcd.print(preset[i][2]);
delay(1000);
}
if ((x) != 0 && (preset[i][0]) == 1 && (preset[i][1]) == refhh + x) {
lcd.setCursor(6, 1);
lcd.print(preset[i][1]);
lcd.print(":");
lcd.print(preset[i][2]);
delay(1000);
}
if ((refhh + x) >= 24) {
i = 16;
x = 16;
}
}
}
}
if ((except) == 0 && (dayOfWeek) == 5 && (activation) != 0) {
for (byte x = 0; x < 16; x++) {
for (byte i = 16; i < 31; i++) {
//for (byte x = 0; x < 16; x++) {
if ((x) == 0 && (preset[i][0]) == 1 && (preset[i][1]) == refhh && (preset[i][2]) >= refmin) {
lcd.setCursor(6, 1);
lcd.print(preset[i][1]);
lcd.print(":");
lcd.print(preset[i][2]);
delay(1000);
}
if ((x) != 0 && (preset[i][0]) == 1 && (preset[i][1]) == refhh + x) {
lcd.setCursor(6, 1);
lcd.print(preset[i][1]);
lcd.print(":");
lcd.print(preset[i][2]);
delay(1000);
}
if ((refhh + x) >= 24) {
i = 31;
x = 31;
}
}
}
}
home();
}
void controle() { // Global Enable/disable
wdt_reset();
pressed = 0;
time2 = millis();
time3 = millis();
activation = EEPROM.read(100); //
lcd.clear();
byte screen1 = 0;
while ((screen1) == 0) {
wdt_reset();
if ((activation) >= 1) {
lcd.setCursor(0, 0);
lcd.print(" Alarme:ON ");
lcd.setCursor(0, 1);
lcd.print(" 0==> Desactiver");
pressed = 0;
while (pressed == 0) {
wdt_reset();
readnumber();
//char key = keypad.getKey();
if ((key) == '*') {
bip();
screen1 = 10;
screen = 10;
pressed = 10;
home();
} //exit
if ((pressed) == 1) {
activation = number;
}
}
}
if ((activation) != EEPROM.read(100)) {
EEPROM.write(100, activation);
lcd.setCursor(0, 0);
lcd.print(" updated ");
delay(1000);
}
if ((activation) == 0) {
lcd.setCursor(0, 0);
lcd.print(" Alarme:OFF ");
lcd.setCursor(0, 1);
lcd.print(" 1==> Activer ");
pressed = 0;
while (pressed == 0) {
wdt_reset();
readnumber();
if ((key) == '*') {
bip();
screen1 = 10;
screen = 10;
pressed = 10;
home();
} //exit
if ((pressed) >= 1) {
activation = number;
}
}
}
//key = keypad.getKey();
//if ((key)=='#'){screen1=10;screen = 10; home();}
if ((time3 - time2) > tout) {
pressed = 6;
screen1 = 10;
screen = 10;
timeout();
home();
}
//delay(2000);;
if ((activation) != EEPROM.read(100)) {
EEPROM.write(100, activation);
lcd.setCursor(0, 0);
lcd.print(" updated ");
delay(1000);
}
}
}
void Exceptions() { //setup exceptions
time3 = millis();
readprog();
data1 = 12; //initialisation
data2 = 12;
data3 = 23;
data4 = 12;
data5 = 12;
data5 = 23;
byte i = 0;
pressed = 0;
screen = 0;
lcd.clear();
while (screen == 0) {
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
wdt_reset();
lcd.setCursor(0, 0);
lcd.print("Exception ");
lcd.print(i + 1);
lcd.print(" ");
key = keypad.getKey();
if (key) { bip(); }
if ((key) == 'C') {
bip();
i++;
if ((i) > 11) { i = 11; }
}
if ((key) == 'D') {
bip();
i--;
if ((i) > 11) { i = 0; }
}
if ((key) == '*') {
bip();
lcd.clear();
k = 4;
break;
}
if ((key) == '#') {
bip();
lcd.clear();
screen = 1;
while ((screen) == 1) {
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
wdt_reset();
lcd.setCursor(0, 0);
lcd.print(Ex[i][0]);
lcd.print("/");
lcd.print(Ex[i][1]);
lcd.print("/");
lcd.print(Ex[i][2]);
lcd.setCursor(0, 1);
lcd.print(Ex[i][3]);
lcd.print("/");
lcd.print(Ex[i][4]);
lcd.print("/");
lcd.print(Ex[i][5]);
key = keypad.getKey();
if ((key) == '*') {
bip();
lcd.clear();
screen = 0;
}
if ((key) == '#') {
bip();
lcd.clear();
screen = 2;
while ((screen) == 2) {
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
wdt_reset();
lcd.setCursor(0, 0);
lcd.print(" De:");
lcd.print("--");
lcd.print("/");
lcd.print("--");
lcd.print("/");
lcd.print("20");
lcd.print("--");
lcd.setCursor(0, 1);
lcd.print(" A :--/--/20--");
//key = keypad.getKey();
//if ((key)=='#'){
pressed = 0;
while (pressed < 2 && screen == 2) {
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
wdt_reset();
readnumber();
if ((pressed) == 2) {
data1 = number;
lcd.setCursor(4, 0);
if ((data1) < 10) {
lcd.print("0");
lcd.print(data1);
} else {
lcd.print(data1);
}
}
if ((key) == '*') {
bip();
lcd.clear();
screen = 0;
break;
}
time3 = millis();
if ((time3 - time2) > tout) {
pressed = 6;
screen = 10;
timeout();
home();
}
}
pressed = 0;
while (pressed < 2 && screen == 2) {
wdt_reset();
readnumber();
if ((pressed) == 2) {
data2 = number;
lcd.setCursor(7, 0);
if ((data2) < 10) {
lcd.print("0");
lcd.print(data2);
} else {
lcd.print(data2);
}
}
}
pressed = 0;
while (pressed < 2 && screen == 2) {
wdt_reset();
readnumber();
if ((pressed) == 2) {
data3 = number;
lcd.setCursor(12, 0);
if ((data3) < 10) {
lcd.print("0");
lcd.print(data3);
} else {
lcd.print(data3);
}
}
}
pressed = 0;
while (pressed < 2 && screen == 2) {
wdt_reset();
readnumber();
if ((pressed) == 2) {
data4 = number;
lcd.setCursor(4, 1);
if ((data4) < 10) {
lcd.print("0");
lcd.print(data4);
} else {
lcd.print(data4);
}
}
}
pressed = 0;
while (pressed < 2 && screen == 2) {
wdt_reset();
readnumber();
if ((pressed) == 2) {
data5 = number;
lcd.setCursor(7, 1);
if ((data5) < 10) {
lcd.print("0");
lcd.print(data5);
} else {
lcd.print(data5);
}
}
}
pressed = 0;
while (pressed < 2 && screen == 2) {
wdt_reset();
readnumber();
if ((pressed) == 2) {
data6 = number;
lcd.setCursor(12, 1);
if ((data6) < 10) {
lcd.print("0");
lcd.print(data6);
} else {
lcd.print(data6);
screen = 3;
}
}
}
//delay(3000);
//}
while ((screen) == 3) {
wdt_reset();
key = keypad.getKey();
if ((key) == '*') {
bip();
lcd.clear();
screen = 0;
break;
}
if ((key) == '#') {
bip();
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Exeption");
lcd.print(i + 1);
lcd.setCursor(2, 1);
lcd.print("updating");
EEPROM.update((i * 6) + 110, data1);
EEPROM.update((i * 6) + 111, data2);
EEPROM.update((i * 6) + 112, data3);
EEPROM.update((i * 6) + 113, data4);
EEPROM.update((i * 6) + 114, data5);
EEPROM.update((i * 6) + 115, data6);
readprog();
comparer();
delay(1000);
screen = 0;
lcd.clear();
break;
}
}
//key = keypad.getKey();
if ((key) == '*') {
bip();
//if ((except)==1){lcd.setCursor(0,1);lcd.print("Exc");}else{lcd.setCursor(0,1);lcd.print(" ");}
lcd.clear();
break;
}
}
}
//key = keypad.getKey();
}
}
//ey = keypad.getKey();
}
}
void comparer() { //cheek if there is exception
readprog();
DateTime now = rtc.now();
jour = now.day();
mois = now.month();
annee = now.year() - 2000;
byte monthdays;
switch (mois) {
case 1:
monthdays = 31;
break;
case 2:
monthdays = 28;
break;
case 3:
monthdays = 31;
break;
case 4:
monthdays = 30;
break;
case 5:
monthdays = 31;
break;
case 6:
monthdays = 30;
break;
case 7:
monthdays = 31;
break;
case 8:
monthdays = 31;
break;
case 9:
monthdays = 30;
break;
case 10:
monthdays = 31;
break;
case 11:
monthdays = 30;
break;
case 12:
monthdays = 31;
break;
}
//////////fevrier 28 ou 29
if ((mois) == 2) {
for (byte i = 0; i < 20; i++) {
if ((annee) == 20 + (4 * i)) { monthdays = 29; }
}
}
byte result1 = 0;
for (byte i = 0; i < 12; i++) {
if ((annee >= Ex[i][2]) && (Ex[i][5] > Ex[i][2])) {
if (((annee == Ex[i][2]) && (mois > Ex[i][1]) && (mois <= 12)) || (annee == Ex[i][2]) && ((Ex[i][1] == mois) && (jour >= Ex[i][0]))) { result1 = 1; }
if (((annee == Ex[i][5]) && (mois == Ex[i][4]) && (jour <= Ex[i][3])) || ((annee == Ex[i][5]) && (mois < Ex[i][4]))) { result1 = 1; }
if ((result1) == 1) { i = 13; } // first exception >>> break
} else {
result1 = 0;
}
}
byte result2 = 0;
for (byte i = 0; i < 12; i++) {
if ((annee == Ex[i][2]) && (annee == Ex[i][5]) && (Ex[i][4] > Ex[i][1])) {
if (((mois == Ex[i][1]) && (jour >= Ex[i][0])) || ((mois == Ex[i][4]) && (jour <= Ex[i][3]))) {
result2 = 1;
} else {
result2 = 0;
}
//if((mois==Ex[i][1]) && (jour<=Ex[i][0])){result2=1;}else{result2=0;}
if ((result2) == 1) { i = 13; } // first exception >>> break
} else {
result2 = 0;
}
}
byte result3 = 0;
for (byte i = 0; i < 12; i++) {
if ((annee == Ex[i][2]) && (annee == Ex[i][5])) {
if ((mois == Ex[i][1]) && (mois == Ex[i][4])) {
if ((jour >= Ex[i][0]) && (jour <= Ex[i][3])) {
result3 = 1;
} else {
result3 = 0;
}
} else {
result3 = 0;
}
} else {
result3 = 0;
}
if ((result3) == 1) { i = 13; } // first exception >>> break
}
except = result1 + result2 + result3;
if ((except) > 1) { except = 1; }
}
void sqwset() {
Wire.beginTransmission(0x68);
Wire.write(0x07); // Control register for DS1307
Wire.write(0x10); // Set SQWE to 1 and RS1, RS0 to 00 for 1 Hz square wave
Wire.endTransmission();
}
void signal() {
sqwdetected = true;
}
void rtcread() {
DateTime now = rtc.now();
sec = now.second();
minut = now.minute();
heur = now.hour();
dayOfWeek = now.dayOfTheWeek();
}
void timer2set() {
noInterrupts(); // Disable interrupts
TCCR2A = 0; // Clear control register A
TCCR2B = 0; // Clear control register B
TCNT2 = 0; // Clear the timer counter
// Set CTC mode (WGM21 = 1)
TCCR2A |= (1 << WGM21);
// Set compare value to
OCR2A = 150;
// Set prescaler to 1024: CS22 = 1, CS21 = 0, CS20 = 1
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20);
// Enable Timer2 compare interrupt
TIMSK2 |= (1 << OCIE2A);
interrupts(); // Enable interrupts
}
ISR(TIMER2_COMPA_vect) {
static int overflowCount = 0;
overflowCount++;
// Check if we have reached 1 second (61 interrupts)
if (overflowCount >= 100) {
overflowCount = 0;
timerflag = true; // Set flag for 1-second event
}
}
void goToSleep() {
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set Power-down sleep mode
sleep_enable(); // Enable sleep mode
// Disable ADC to save more power
ADCSRA &= ~(1 << ADEN);
// Make sure interrupts are enabled
noInterrupts();
sleep_bod_disable(); // Disable Brown-out Detector (for extra power saving)
interrupts();
sleep_cpu(); // Put the MCU to sleep (enter Power-down mode)
//sleep_disable(); // Wake up here when an interrupt is triggered
}
void pcintkey(){
// Set up pin change interrupts on column pins
PCICR |= (1 << PCIE1); // Enable PCINT for A0-A5 (PCINT8-14)
PCICR |= (1 << PCIE0); // Enable PCINT for D8-D13 (PCINT0-7)
// Enable PCINT on each column pin
PCMSK0 |= (1 << PCINT4); // PCINT4 is for pin D12
PCMSK1 |= (1 << PCINT8); // PCINT8 is for A0
PCMSK1 |= (1 << PCINT9); // PCINT9 is for A1
PCMSK1 |= (1 << PCINT10); // PCINT10 is for A2
// Set column pins as inputs with pull-up resistors
for (int i = 0; i < COLS; i++) {
pinMode(wakePinCols[i], INPUT_PULLUP);
}
}
ISR(PCINT0_vect) {
// Wake up from column change on D12
}
ISR(PCINT1_vect) {
// Wake up from column change on A0, A1, or A2
}