#include "RTClib.h"
#include <U8g2lib.h>
#include <Bounce2.h>
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
byte button_pins[] = {9, 5, 6}; // button pins, 4,5 = up/down, 6 = select
#define NUMBUTTONS sizeof(button_pins)
Bounce * buttons = new Bounce[NUMBUTTONS];
U8X8_SSD1306_128X64_NONAME_HW_I2C display(U8X8_PIN_NONE);
#define MENU_SIZE 3
char *menu[MENU_SIZE] = { "Set Alarm Time", "Alarm On", "Alarm Off" };
int prev_cursor=0;
int cursor=0;
int state=0;
int prev_setter=0;
int setter=0;
int number_cur;
int menu_case=0;
bool relayState=false;
bool alarm_on=false;
#define ALARM_SIZE 2
int alarm1[ALARM_SIZE] = {22,58};
void setup () {
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
// Make input & enable pull-up resistors on switch pins
for (int i=0; i<NUMBUTTONS; i++) {
buttons[i].attach( button_pins[i], INPUT_PULLUP); // setup the bounce instance for the current button
buttons[i].interval(25); // interval in ms
}
display.begin();
display.setPowerSave(0);
display.setFont(u8x8_font_pxplusibmcgathin_f);
display.clearDisplay();
}
void loop (){
//DateTime now = rtc.now();
if (state==0){
showTime();
if (alarm_on){
display.setCursor(0,7);
display.print("Aktiv: ");
display.print(menu[cursor]);
}
for (int i = 0; i<NUMBUTTONS; i++) {
buttons[i].update(); // Update the Bounce instance
if ( (buttons[i].fell())){
state++;
showMenu();
}
}
}
else if (state ==1) {
// process button press:
for (int i = 0; i<NUMBUTTONS; i++) {
buttons[i].update(); // Update the Bounce instance
//Serial.println(buttons[i].read());
if ((buttons[i].fell())) { // If it fell
if (i==2) { // select
Serial.println(cursor);
display.clearDisplay();
//write down selection
display.setCursor(0,7);
display.print(menu[cursor]);
executeChoice(cursor);
//wait some time and clear display
delay(1000);
display.clearDisplay();
if (cursor==0){
setAlarm();
}
else if (cursor==1){
alarm_on=true;
state=0;
}
else if (cursor==2){
alarm_on=false;
state=0;
}
}
else {
// erase previous cursor:
display.setCursor(0,cursor);
display.print(' ');
if (i==0) { // up
cursor++;
if (cursor>(MENU_SIZE-1)) cursor=0;
}
else { // down
cursor--;
if (cursor<0) cursor=(MENU_SIZE-1);
}
// show cursor at new line:
display.setCursor(0,cursor);
display.print('>');
}
} // end if button fell...
} // end for-loop of button check
}
}
int alterNumber(int number_cur, int number_max){
for (int i = 0; i<NUMBUTTONS; i++) {
if ( (buttons[i].fell())) { // If it fell
if(i==0){
number_cur++;
if (number_cur>number_max-1) number_cur=0;
}
else if(i==1){
number_cur--;
if (number_cur<0) number_cur=number_max;
}
}
}
}
bool alterCursor(int cursor_max){
for (int i = 0; i<NUMBUTTONS; i++) {
if ( (buttons[i].fell())) { // If it fell
prev_cursor = cursor;
if (i==0) { // up
cursor++;
if (cursor>(cursor_max-1)) cursor=0;
}
else if(i==1){ // down
cursor--;
if (cursor<0) cursor=(cursor_max-1);
}
else if (i==2) { // select
Serial.println("selected");
return true;
}
}
}
}
void buttonStateChange(){
for (int i = 0; i<NUMBUTTONS; i++) {
buttons[i].update(); // Update the Bounce instance
if (buttons[i].fell()){
state++;
}
}
}
void setCursorPosition(int i_prev, int i){
// erase previous cursor:
display.setCursor(i_prev,3);
display.print(' ');
// show cursor at new line:
display.setCursor(i,3);
display.print('>');
}
void setAlarm(){
char hour[5];
char minute[5];
sprintf(hour, "%d", alarm1[0]);
sprintf(minute, "%d", alarm1[1]);
display.drawString(1,0, "hour");
display.drawString(1,1, hour);
display.drawString(1,2, "minute");
display.drawString(1,3, minute);
//buttonPushed();
if(alterCursor(0)){
if (cursor==1){
Serial.println("hour");
}
else if(cursor==2){
Serial.println("minute");
}
}
//alarm1[setter]=cursor;
//setCursorPosition(sizeof(buffer)-2*prev_setter,sizeof(buffer)-2*setter);
}
/**
* Clear display and show the menu.
*/
void showMenu() {
cursor=0;
display.clearDisplay();
// show menu items:
for (int i = 0; i<MENU_SIZE; i++) {
display.drawString(2,i,menu[i]);
}
display.setCursor(0,0);
display.print('>');
}
void showTime(){
char buffer[50];
DateTime now = rtc.now();
//display.clearDisplay();
display.drawString(0,1,daysOfTheWeek[now.dayOfTheWeek()]);
sprintf(buffer, "%d:%d:%d", now.hour(), now.minute(), now.second());
display.drawString(0,2, buffer);
}
void serialPrintTime(){
DateTime now = rtc.now();
Serial.print("Current time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
}
/**
* Execute the task which matches the chosen menu item.
*/
void executeChoice(int choice) {
switch(choice) {
case 0 :
Serial.print("Execute choice "); Serial.print(choice); Serial.print(" - "); Serial.println(menu[choice]);
break;
case 1 :
Serial.print("Execute choice "); Serial.print(choice); Serial.print(" - "); Serial.println(menu[choice]);
break;
case 2 :
Serial.print("Execute choice "); Serial.print(choice); Serial.print(" - "); Serial.println(menu[choice]);
break;
case 3 :
Serial.print("Execute choice "); Serial.print(choice); Serial.print(" - "); Serial.println(menu[choice]);
break;
case 4 :
Serial.print("Execute choice "); Serial.print(choice); Serial.print(" - "); Serial.println(menu[choice]);
break;
default :
Serial.print("Execute choice "); Serial.print(choice); Serial.print(" - "); Serial.println(menu[choice]);
break;
}
}