#include <Encoder.h> // from http://www.pjrc.com/teensy/td_libs_Encoder.html
Encoder knob(3, 2); //encoder connected to pins 2 and 3 (and ground)
#define buton 4
#include "TM1637.h" // https://github.com/tehniq3/TM1637-display
#define CLK 9 // Pins for TM1637
#define DIO 8
TM1637 tm1637(CLK, DIO);
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
int hh, mm;
int buttonstate = 0;
int pushlengthset = 2500;
int pushlength = pushlengthset;
int pushstart = 0;
int pushstop = 0;
int knobval;
boolean buttonflag = false;
int sethourstemp;
int setminstemp;
#define goarna 7 // buzzer
void setup() {
tm1637.init();
tm1637.set(5); // BRIGHT_TYPICAL
rtc.begin();
pinMode(buton, INPUT);
digitalWrite(buton, HIGH); // Pull at 1 high
pinMode(goarna, OUTPUT);
digitalWrite(goarna, LOW); // set in 0 logical level
tone(goarna, 500, 10);
}
void loop() {
DateTime now = rtc.now();
hh = now.hour() % 12;
if (hh == 0) {
hh = 12;
}
mm = now.minute();
tm1637.point(POINT_ON);
if ((hh / 10) == 0) tm1637.display(0, 17);
else tm1637.display(0, hh / 10); // hour
tm1637.display(1, hh % 10);
tm1637.display(2, mm / 10); // minutes
tm1637.display(3, mm % 10);
delay(500);
pushlength = pushlengthset;
pushlength = getpushlength ();
delay (10);
if (pushlength > pushlengthset) {
tone(goarna, 200, 50);
}
if (pushlength < pushlengthset) {
tone(goarna, 100, 50);
sethourstemp = hh;
setminstemp = mm;
setclock();
pushlength = pushlengthset;
}
tm1637.point(POINT_OFF);
if ((hh / 10) == 0) tm1637.display(0, 17);
else tm1637.display(0, hh / 10); // hour
tm1637.display(1, hh % 10);
tm1637.display(2, mm / 10); // minutes
tm1637.display(3, mm % 10);
delay(500);
}
int getpushlength () {
buttonstate = digitalRead(buton);
if (buttonstate == LOW && buttonflag == false) {
pushstart = millis();
buttonflag = true;
}
if (buttonstate == HIGH && buttonflag == true) {
pushstop = millis ();
pushlength = pushstop - pushstart;
buttonflag = false;
}
return pushlength;
}
int sethours () {
if ((sethourstemp / 10) == 0) tm1637.display(0, 17);
else tm1637.display(0, sethourstemp / 10); // hour
tm1637.display(1, sethourstemp % 10);
tm1637.display(2, 16); // minutes
tm1637.display(3, 16);
pushlength = pushlengthset;
pushlength = getpushlength ();
if (pushlength != pushlengthset) {
return sethourstemp;
}
knob.write(0);
delay(50);
knobval = knob.read();
if (knobval < -1) knobval = -1;
if (knobval > 1) knobval = 1;
sethourstemp = sethourstemp + knobval;
if (sethourstemp < 1) sethourstemp = 12;
if (sethourstemp > 12) sethourstemp = 1;
sethours();
}
int setmins () {
tm1637.display(0, 16); // hour
tm1637.display(1, 16);
tm1637.display(2, setminstemp / 10); // minutes
tm1637.display(3, setminstemp % 10);
pushlength = pushlengthset;
pushlength = getpushlength ();
if (pushlength != pushlengthset) {
return setminstemp;
}
knob.write(0);
delay(50);
knobval = knob.read();
if (knobval < -1) knobval = -1;
if (knobval > 1) knobval = 1;
setminstemp = setminstemp + knobval;
if (setminstemp < 0) setminstemp = 59;
if (setminstemp > 59) setminstemp = 0;
setmins();
}
void setclock () {
sethours();
delay(500);
setmins();
delay(500);
rtc.adjust(DateTime(2017, 4, 1, sethourstemp, setminstemp, 0));
delay(500);
hh = sethourstemp;
mm = setminstemp;
}