/*
Modified on Nov 24, 2020
Modified by MehranMaleki from Arduino Examples
Modified by Panagiotis Toumpaniaris on March 3,2024
*/
#include <EEPROM.h>
#include <Keypad.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <LiquidCrystal_I2C.h>
#include <TimeLib.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27, 16 column and 2 rows
const char *monthName[12] = {
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};
tmElements_t tm;
const int ROW_NUM = 4; // four rows
const int COLUMN_NUM = 4; // four columns
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
byte pin_rows[ROW_NUM] = {6, 5, 4, 3}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {10, 9, 8, 7};; //connect to the column pinouts of the keypad
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
int cursorColumn = 0;
int ResetPin = 12;
int hours = 0;
int minutes = 0;
int seconds = 0;
int h1;
int m1;
String hh;
String mm;
String hh0;
void setup() {
Serial.begin(9600);
pinMode(2,OUTPUT);
digitalWrite(2,LOW);
lcd.init(); // initialize the lcd
lcd.backlight(); // open the backlight
lcd.clear();
// lcd.setCursor(cursorColumn, 0); // move cursor to (cursorColumn, 0)
// lcd.print("ok");
// while (!Serial) ;
// wait for serial
delay(200);
}
void loop() {
// char key = keypad.getKey();
getTimeFromKeypad();
}
void loadprog(int hset,int minset) {
while (millis>=0) {
settimes(8,15);
// set time2
settimes(9,0);
settimes(9,5);
// set time3
settimes(9,50);
settimes(10,0);
// set time4
settimes(10,45);
settimes(10,55);
// set time 5
settimes(11,40);
settimes(11,50);
// set time 6
settimes(12,35);
settimes(12,40);
// set time 7
settimes(13,25);
settimes(13,30);
//set time 8
settimes(16,0);
// set this time for demostration
settimes(hset,minset);
// settimes(15,39);
if (RTC.read(tm)) {
Serial.print("Ok, Time = ");
print2digits(tm.Hour);
Serial.write(':');
print2digits(tm.Minute);
Serial.write(':');
print2digits(tm.Second);
Serial.print(", Date (D/M/Y) = ");
Serial.print(tm.Day);
Serial.write('/');
Serial.print(tm.Month);
Serial.write('/');
Serial.print(tmYearToCalendar(tm.Year));
Serial.println();
lcd.clear();
lcd.setCursor(0, 0); // start to print at the first row
print2digits1(tm.Hour);
lcd.print(':');
print2digits1(tm.Minute);
lcd.print(':');
print2digits1(tm.Second);
lcd.setCursor(0, 1); // start to print at the second row
lcd.print(tm.Day);
lcd.write('/');
lcd.print(tm.Month);
lcd.write('/');
lcd.print(tmYearToCalendar(tm.Year));
// delay(500);
} else {
if (RTC.chipPresent()) {
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
Serial.println();
} else {
Serial.println("DS1307 read error! Please check the circuitry.");
Serial.println();
}
delay(9000);
}
delay(1000);
}
}
void print2digits(int number) {
if (number >= 0 && number < 10) {
Serial.write('0');
}
Serial.print(number);
}
void print2digits1(int number) {
if (number >= 0 && number < 10) {
lcd.print('0');
}
lcd.print(number);
}
bool getTime(const char *str)
{
int Hour, Min, Sec;
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
tm.Hour = Hour;
tm.Minute = Min;
tm.Second = Sec;
return true;
}
bool getDate(const char *str)
{
char Month[12];
int Day, Year;
uint8_t monthIndex;
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
for (monthIndex = 0; monthIndex < 12; monthIndex++) {
if (strcmp(Month, monthName[monthIndex]) == 0) break;
}
if (monthIndex >= 12) return false;
tm.Day = Day;
tm.Month = monthIndex + 1;
tm.Year = CalendarYrToTm(Year);
return true;
}
void settimes(int h1,int m1) {
if(tm.Hour==h1 and tm.Minute==m1) {
if (tm.Second > 0 & tm.Second<5) {
digitalWrite(2,HIGH);
// delay(1000);
}
else if(tm.Second < 2 or tm.Second >4){
digitalWrite(2,LOW);
delay(100);
}
}
}
void getTimeFromKeypad() {
String timeStr = "";
char key = '\0';
while (key != '#') { // Wait until '#' is pressed to indicate end of input
key = keypad.getKey();
if (key) {
lcd.setCursor(timeStr.length(), 1);
lcd.print(key);
timeStr += key;
delay(200); // Debouncing delay
}
}
lcd.clear();
// Parse the time string (format: HHMM)
hours = (timeStr.substring(0, 2)).toInt();
minutes = (timeStr.substring(2, 4)).toInt();
loadprog(hours,minutes);
}
Σχόλια
Δημοσίευση σχολίου