#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Rotary Encoder Module connections
#define PinSW 3 // Rotary Encoder Switch
#define PinDT 4 // DATA signal
#define PinCLK 2 // CLOCK signal
#define buzzerPin 7 //Buzzer
Servo kapakServo;
int pos = 0;
RTC_DS1307 rtc;
// Variables to debounce Rotary Encoder
long TimeOfLastDebounce = 0;
int DelayofDebounce = 0.01;
// Store previous Pins state
int PreviousCLK;
int PreviousDATA;
int displaycounter = 0; // Store current counter value
// İconlar
uint8_t saatChar[4][8] = { {0x0, 0x0, 0x6, 0x9, 0xA, 0x4, 0x8, 0x8}, {0x0, 0x0, 0x6, 0x19, 0x15, 0x12, 0x11, 0x11}, {0x8, 0x8, 0x4, 0x2, 0x5, 0x8, 0x0, 0x0}, {0x1F, 0x1, 0x2, 0x4, 0x1A, 0x1, 0x0, 0x0} };
uint8_t alarmChar[4][8] = { {0x0, 0x5, 0x9, 0x13, 0x17, 0x7, 0x7, 0xF}, {0x0, 0x14, 0x12, 0x19, 0x1D, 0x1C, 0x1C, 0x1E}, {0xF, 0x1F, 0x0, 0x7, 0x3, 0x0, 0x0, 0x0}, {0x1E, 0x1F, 0x0, 0x1C, 0x18, 0x0, 0x0, 0x0} };
// Değişkenler
bool sureyiBaslat = false;
DateTime baslamaZamani;
bool updateScreen = false;
bool menuAktif = false;
bool servoDurum = false;
bool ButtonPressed = false;
int menu = 0;
int altmenu = 0;
int lcdArkaIsik = 0;
int saat, dakika, saniye;
unsigned long son_saniye = millis();
long bir_saniye = 1;
int rotateMenuSayac = 6;
int RotateCounter = 0; //counts the rotation clicks
//aLARM AYAR
int alarmSaat = 0;
int alarmDakika = 0;
int alarmSure = 1, tempAlarmSure = 0;
//Melodi ayarlar
#define doo 1000// do komutu ile karismasin diye doo yazdim (kalin do)
#define re 1122
#define mi 1260
#define fa 1335
#define sol 1498
#define la 1681
#define si 1887
#define dom 200
int melodi[] = {re, mi, fa, sol, fa, sol, sol, sol, fa, sol, sol, sol, fa, mi, re, mi, fa, sol, fa, sol, sol, sol, fa, sol, sol, sol, fa, mi, re, mi, fa, sol, mi, fa, re, mi, doo, doo, fa, mi, re, re, re, mi, fa, sol, mi, fa, re, mi, doo, doo, fa, mi, re, re };
int notasuresi[] = {4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2}; // her notanin süresini array yaptim
int tempo = 1200;
void setup() {
Serial.begin(9600);
// Put current pins state in variables
PreviousCLK = digitalRead(PinCLK);
PreviousDATA = digitalRead(PinDT);
// Set the Switch pin to use Arduino PULLUP resistors
pinMode(PinSW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PinSW), buttonPressed, FALLING);
// Saat işlemleri
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
kapakServo.attach(5);
lcd.init();
lcd.begin(16, 2);
//lcd.backlight();
lcd.setBacklight(2);
}
void loop() {
// If enough time has passed check the rotary encoder
if ((millis() - TimeOfLastDebounce) > DelayofDebounce) {
check_rotary(); // Rotary Encoder check routine below
PreviousCLK = digitalRead(PinCLK);
PreviousDATA = digitalRead(PinDT);
TimeOfLastDebounce = millis(); // Set variable to current millis() timer
}
if ((millis() - son_saniye > bir_saniye) && menuAktif == false) {
saatiGuncelle();
son_saniye = millis() ;
}
ButtonChecker();
KapakServoKontrol();
SureyiKontrolEt();
}
void SureyiKontrolEt() {
if (sureyiBaslat)
{
int eklenecekSure = alarmSure; //dk cinsinden
int baslamaSaat = 0;
int bitisSaat = 0;
int baslamaDakika = 0;
int bitisDakika = 0;
int simdikiSaat = 0;
int simdikiDakika = 0;
DateTime simdikiZaman = rtc.now();
simdikiSaat = simdikiZaman.hour();
simdikiDakika = simdikiZaman.minute();
baslamaSaat = baslamaZamani.hour();
baslamaDakika = baslamaZamani.minute();
bitisSaat = (baslamaSaat + ((eklenecekSure - (eklenecekSure % 60)) / 60) % 24);
bitisDakika = baslamaDakika + (eklenecekSure % 60);
if (bitisDakika > 59) {
bitisSaat = (bitisSaat + 1) % 24;
bitisDakika = bitisDakika % 60;
}
Serial.print("baslamaSaat: "); Serial.print(String(baslamaSaat));
Serial.print("baslamaDakika: "); Serial.println(String(baslamaDakika));
Serial.print("bitisSaat: "); Serial.print(String(bitisSaat));
Serial.print("bitisDakika: "); Serial.println(String(bitisDakika));
if (bitisSaat == simdikiSaat && bitisDakika == simdikiDakika)
{
Serial.println("Süre bitti");
sesCal(4);
kapakAcKapat(1);
sureyiBaslat = false;
}
}
}
void sesCal(int tus) {
switch (tus) {
case 1: //yukari
tone(buzzerPin, 3000, 50);
break;
case 2: //asagi
tone(buzzerPin, 3000, 50);
break;
case 3: //ok buton
tone(buzzerPin, 2000, 50);
break;
case 4: //süre bitti
for (int Nota = 0; Nota < 10; Nota++)
{
int sure = tempo / notasuresi[Nota];
tone(buzzerPin, melodi[Nota], sure); // 8 numarali bacaktan notalarin frekanslarini nota uzunluklarina göre gönder
delay(sure * 1.2); // notalar arasinda biraz beklesin. Eger 1 ile çarparsaniz notalar birbirine bitisik olur
}
break;
}
}
void buttonPressed() {
ButtonPressed = true;
menuAktif = true;
}
void ButtonChecker() //this is basically the menu part. keep track of the buttonpressed and rotatecounter for navigation
{
lcd.setCursor(15, 1); // Defining positon to write from second row, first column .
lcd.print(menu);
if (ButtonPressed == true) {
if (menu == 0) {
menu++;
lcdTemizle();
}
else if (menu == 1) {
if (altmenu == 0 ) { //baslangic zamanı
altmenu++;
altmenu = altmenu % 5;
if (altmenu == 0)altmenu = 1;
lcdTemizle();
}
else if (altmenu == 1 || altmenu == 2) { //baslangic zamanı
altmenu++;
altmenu = altmenu % 5;
if (altmenu == 0)altmenu = 1;
lcdTemizle();
}
else if (altmenu == 3) {
lcd.clear();
lcd.print("Kaydedildi");
anaEkranaDon();
}
else if (altmenu == 4) {
lcd.clear();
lcd.print("Iptal Edildi");
alarmDakika = 0;
alarmSaat = 0;
anaEkranaDon();
}
}
else if (menu == 2) {
if (altmenu == 0 ) {
altmenu++;
}
else if (altmenu == 1 ) {
altmenu++;
}
else if (altmenu == 2) {
lcd.clear();
lcd.print("Kaydedildi");
anaEkranaDon();
}
else if (altmenu == 3) {
lcd.clear();
lcd.print("Iptal Edildi");
alarmSure = 0;
anaEkranaDon();
}
}
else if (menu == 3) {
lcd.clear();
servoDurum == true ? kapakAcKapat(0) : kapakAcKapat(1);
}
else if (menu == 4) {
lcd.clear();
lcd.print("*Baslatiliyor");
RotateCounter = 0;
baslamaZamani = rtc.now();
sureyiBaslat = true;
kapakAcKapat(0);
anaEkranaDon();
}
else if (menu == 5) {
lcdArkaIsik == 1 ? lcdArkaIsikAcKapat(0) : lcdArkaIsikAcKapat(1);
}
else if (menu == 6) {
if (altmenu == 0) {
anaEkranaDon();
}
}
updateMenu();
durumYazdir();
}
ButtonPressed = false; //reset this variable
}
void lcdArkaIsikAcKapat(int isikDurum) {
lcd.clear();
lcdArkaIsik = isikDurum;
lcdArkaIsik == 0 ? lcd.noBacklight() : lcd.backlight();
lcdArkaIsik == 1 ? lcd.print("> Isigi Kapat") : lcd.print("> Isigi Ac");
delay(1500);
anaEkranaDon();
}
void KapakServoKontrol()
{
servoDurum == true ? kapakServo.write(0) : kapakServo.write(270);
}
void kapakAcKapat(int kapakDurum) {
switch (kapakDurum)
{
case 0:
if (servoDurum == true) {
lcd.clear();
lcd.print("*Kapak Kapatiliyor");
servoDurum = !servoDurum;
} break;
case 1:
if (servoDurum == false) {
lcd.clear();
lcd.print("*Kapak Aciliyor");
servoDurum = !servoDurum;
} break;
}
delay(1500);
}
void durumYazdir() {
Serial.print(F("menuDurum:"));
Serial.print(menuAktif);
Serial.print(F("-menu:"));
Serial.print(menu);
Serial.print(F("-altmenu:"));
Serial.println(altmenu);
}
void Yukari() {
Serial.println("yukarı");
if (menu > 0 && altmenu == 0) {
menu++;
if (menu > rotateMenuSayac) {
menu = 1;
}
}
else if (menu == 1 && altmenu == 3 ) { //baslangic zamanı
altmenu++;
}
else if (menu == 1 && altmenu == 1 ) { //alarm saat
alarmSaat++;
alarmSaat %= 24;
}
else if (menu == 1 && altmenu == 2 ) { //alarm dakika
alarmDakika += 5;
alarmDakika %= 60;
}
else if (menu == 2 && altmenu == 1 ) { //alarm süre
alarmSure += 5;
}
else if (menu == 2 && altmenu == 2 ) { //baslangic zamanı
altmenu++;
}
updateScreen = true;
updateMenu();
durumYazdir();
}
void Asagi() {
Serial.println("yukarı");
if (menu > 0 && altmenu == 0) {
menu--;
if (menu < 1) {
menu = rotateMenuSayac;
}
}
else if (menu == 1 && altmenu == 4 ) { //baslangic zamanı
altmenu--;
}
else if (menu == 1 && altmenu == 1 ) { //alarm saat
alarmSaat--;
if (alarmSaat < 0)alarmSaat += 24;
alarmSaat %= 24;
}
else if (menu == 1 && altmenu == 2 ) { //alarm dakika
alarmDakika -= 5;
if (alarmDakika < 0)alarmDakika += 60;
alarmDakika %= 60;
}
else if (menu == 2 && altmenu == 1) { //alarm süre
alarmSure -= 5;
}
else if (menu == 2 && altmenu == 3 ) { //baslangic zamanı
altmenu--;
}
updateScreen = true;
updateMenu();
durumYazdir();
}
void updateMenu() {
if (altmenu == 0) { //Ana menü
switch (menu) {
case 0:
menu = 0;
menuAktif = false;
break;
case 1:
lcd.clear();
menuAktif = true;
lcd.print("> Aile Saati");
lcd.setCursor(0, 1);
lcd.print(" Sure");
break;
case 2:
lcd.clear();
menuAktif = true;
lcd.print(" Aile Saati");
lcd.setCursor(0, 1);
lcd.print("> Sure");
break;
case 3:
lcd.clear();
servoDurum == true ? lcd.print("> Kapagi Kapat") : lcd.print("> Kapagi Ac");
lcd.setCursor(0, 1);
lcd.print(" Baslat");
break;
case 4:
menuAktif = true;
lcd.clear();
servoDurum == true ? lcd.print(" Kapagi Kapat") : lcd.print(" Kapagi Ac");
lcd.setCursor(0, 1);
lcd.print("> Baslat");
break;
case 5:
menuAktif = true;
lcd.clear();
lcdArkaIsik == 1 ? lcd.print("> Isigi Kapat") : lcd.print("> Isigi Ac");
lcd.setCursor(0, 1);
lcd.print(" Saati Goster");
break;
case 6:
menuAktif = true;
lcd.clear();
lcdArkaIsik == 1 ? lcd.print(" Isigi Kapat") : lcd.print(" Isigi Ac");
lcd.setCursor(0, 1);
lcd.print("> Saati Goster");
break;
case 7:
menu = rotateMenuSayac;
break;
}
}
if (menu == 1) { // Aile Saati Menüsü
if (altmenu == 1 || altmenu == 2) {
lcd.clear();
lcd.print("Baslangic Zamani");
altmenu == 1 ? lcd.setCursor(0, 1) : lcd.setCursor(6, 1);
altmenu == 1 ? lcd.print(">") : lcd.print("<");
lcd.setCursor(1, 1);
String saat = String(alarmSaat).length() == 1 ? "0" + String(alarmSaat) : String(alarmSaat);
String dakika = String(alarmDakika).length() == 1 ? "0" + String(alarmDakika) : String(alarmDakika);
lcd.print(saat + ":" + dakika);
}
else if (altmenu == 3) {
menuAktif = true;
lcd.clear();
lcd.print("> Kaydet ve Cik");
lcd.setCursor(0, 1);
lcd.print(" Iptal");
}
else if (altmenu == 4) {
menuAktif = true;
lcd.clear();
lcd.print(" Kaydet ve Cik");
lcd.setCursor(0, 1);
lcd.print("> Iptal");
}
}
if (menu == 2) { // Süre Menüsü
if (altmenu == 1) {
lcd.clear();
lcd.print("Sure Ayari");
lcd.setCursor(0, 1);
lcd.print(">");
lcd.setCursor(1, 1);
lcd.print(String(alarmSure) + " Dakika");
}
else if (altmenu == 2) {
menuAktif = true;
lcd.clear();
lcd.print("> Kaydet ve Cik");
lcd.setCursor(0, 1);
lcd.print(" Iptal");
}
else if (altmenu == 3) {
menuAktif = true;
lcd.clear();
lcd.print(" Kaydet ve Cik");
lcd.setCursor(0, 1);
lcd.print("> Iptal");
}
}
}
void anaEkranaDon() {
delay(500);
altmenu = 0;
menuAktif = false;
menu = 0;
lcd.clear();
RotateCounter = 0;
}
void lcdGoster(int displaycounter) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("displaycounter :");
lcd.setCursor(0, 1);
lcd.print(displaycounter);
}
// Check if Rotary Encoder was moved
void check_rotary() {
if ((PreviousCLK == 0) && (PreviousDATA == 1)) {
if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 0)) {
Yukari();
}
if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 1)) {
Asagi() ;
}
}
if ((PreviousCLK == 1) && (PreviousDATA == 0)) {
if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 1)) {
Yukari();
}
if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 0)) {
Asagi() ;
}
}
if ((PreviousCLK == 1) && (PreviousDATA == 1)) {
if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 1)) {
Yukari();
}
if ((digitalRead(PinCLK) == 0) && (digitalRead(PinDT) == 0)) {
Asagi() ;
}
}
if ((PreviousCLK == 0) && (PreviousDATA == 0)) {
if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 0)) {
Yukari();
}
if ((digitalRead(PinCLK) == 1) && (digitalRead(PinDT) == 1)) {
Asagi() ;
}
}
}
void saatiGuncelle() {
DateTime time = rtc.now();
saatiEkranaYazdir(time);
saatIconGoster();
}
void lcdTemizle() {
lcd.clear();
}
void saatiEkranaYazdir(DateTime time) {
char tarih[12] = "DD/MM/YYYY";
char saat[12] = " hh:mm:ss";
time.toString(tarih);
time.toString(saat);
lcd.setCursor(3, 0);
lcd.print(tarih);
lcd.setCursor(3, 1);
lcd.print(saat);
}
void saatIconGoster() {
if (sureyiBaslat == false) {
lcd.createChar(0, saatChar[0]);
lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.createChar(1, saatChar[1]);
lcd.setCursor(1, 0);
lcd.write(byte(1));
lcd.createChar(2, saatChar[2]);
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.createChar(3, saatChar[3]);
lcd.setCursor(1, 1);
lcd.write(byte(3));
} else {
lcd.createChar(0, alarmChar[0]);
lcd.setCursor(0, 0);
lcd.write(byte(0));
lcd.createChar(1, alarmChar[1]);
lcd.setCursor(1, 0);
lcd.write(byte(1));
lcd.createChar(2, alarmChar[2]);
lcd.setCursor(0, 1);
lcd.write(byte(2));
lcd.createChar(3, alarmChar[3]);
lcd.setCursor(1, 1);
lcd.write(byte(3));
}
}