#include "RTClib.h" //biblioteka do modułu czasu rzeczywistego
RTC_DS1307 rtc;
#include <LiquidCrystal_I2C.h> //biblioteka do wyświetlacza I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <Stepper.h> //biblioteka do silnika krokowego
Stepper mystepper(200, 8, 9, 10, 11);
#define pl 7 //przycisk lewy
#define ps 6 //przycisk środkowy
#define pp 5 //przycisk prawy
int h = 0; //godzina budzika
int m = 0; //minuta budzika
int block=0; //blokada rolety przed budzikiem
int currentPos = 0; //aktualna pozycja silnika
int wb = 10;
int alarm = 0; //zmianna do określenia czy alarm jest włączony czy nie
int targetval; //docelowa pozycja silnika
void setup()
{
Serial.begin(9600);
pinMode(pl, INPUT_PULLUP);
pinMode(ps, INPUT_PULLUP);
pinMode(pp, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(A0, INPUT);
digitalWrite(pl, 1); //nadanie przyciskom stanów wysokich
digitalWrite(ps, 1);
digitalWrite(pp, 1);
if (! rtc.begin()) {//formułka niezbędna do działania RTC
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
DateTime now = rtc.now(); //pobranie aktualnego czasu
lcd.init();
lcd.backlight();
mystepper.setSpeed(40); //ustawienie prędkości obrotowej silnika
}
void loop()
{
DateTime now = rtc.now();
wb = 10;
lcd.setCursor(0, 0);
if (now.hour() >= 10) //seria if-ów odpowiedzialna za wyświetlenie godziny
{
lcd.print(now.hour());
}
else if (now.hour() < 10)
{
lcd.print("0");
lcd.print(now.hour());
}
lcd.print(":");
if (now.minute() >= 10)
{
lcd.print(now.minute());
}
else if (now.minute() < 10)
{
lcd.print("0");
lcd.print(now.minute());
}
lcd.print(":");
if (now.second() >= 10)
{
lcd.print(now.second());
}
else if (now.second() < 10)
{
lcd.print("0");
lcd.print(now.second());
}
lcd.setCursor(0, 1); //przejście do drugiej lini i seria if-ów odpowiedzialna za wyświetlenie godziny zadzwonienia budzika
if (h >= 10)
{
lcd.print(h);
lcd.print(":");
}
else if (h <= 9)
{
lcd.print("0");
lcd.print(h);
lcd.print(":");
}
if (m >= 10)
{
lcd.print(m);
lcd.print(":00");
}
else if (m <= 9)
{
lcd.print("0");
lcd.print(m);
lcd.print(":00");
}
if (alarm == 0)
{
lcd.print(" [OFF]"); //pokazuje że budzik jest wyłączony
}
else if (alarm == 1)
{
lcd.print(" [ON] "); //pokazuje że budzik jest włączony
}
if ((alarm == 0) && (digitalRead(4) == 0)&&(block==0))//jeśli sterowanie automatyczne to podczas włączonego budzika rolety opadają a po wyłączeniu budzika podnoszą się
{
moveToPos(0);
}
else if ((alarm == 1) && (digitalRead(4) == 0)&&(block==0))
{
moveToPos(600);
}
else if (digitalRead(4) == 1)//jeśli sterowanie ręczne to rolety podnoszą się wg wskazań potencjometra
{
int potval = analogRead(A0);
targetval = map(potval, 0, 1023, 0, 600);//mapowanie potencjomatra na zakres silnika
moveToPos(targetval);
}
if((alarm==1)&&(h==now.hour())&&((m-1)==now.minute())&&(h!=0)&&(m!=0)&&(50==now.second())&&(currentPos!=0))//godzina typu XX:XX
{
block=1;
moveToPos(0);
}
else if((alarm==1)&&((h-1)==now.hour())&&((59)==now.minute())&&(h!=0)&&(m==0)&&(50==now.second())&&(currentPos!=0))//godzina typu XX:00
{
block=1;
moveToPos(0);
}
else if((alarm==1)&&((23)==now.hour())&&((59)==now.minute())&&(h==0)&&(m==0)&&(50==now.second())&&(currentPos!=0))//godzina typu 00:00
{
block=1;
moveToPos(0);
}
if ((alarm == 1) && (h == now.hour()) && (m == now.minute()) && (now.second() < 3))//mechanizm działania alarmu
{
alarm = 0;
block=0;
while ((digitalRead(pl) == 1) && (digitalRead(ps) == 1) && (digitalRead(pp) == 1))
{
tone(13, 150, 500);//dźwięk alarmu
delay(500);
tone(13, 400, 500);
delay(500);
}
while ((digitalRead(pl) == 0) || (digitalRead(ps) == 0) || (digitalRead(pp) == 0))
{
}
delay(100);
}
if (digitalRead(pp) == 0)//menu ustawienia budzika
{
while (digitalRead(pp) == 0)
{
}
delay(100);
lcd.clear();
while (wb != 0)
{
lcd.setCursor(0, 0);
lcd.print(" USTAW BUDZIK");
lcd.setCursor(0, 1);
if (h >= 10)
{
lcd.print(h);
lcd.print(":");
}
else if (h <= 9)
{
lcd.print("0");
lcd.print(h);
lcd.print(":");
}
if (m >= 10)
{
lcd.print(m);
lcd.print(":00");
}
else if (m <= 9)
{
lcd.print("0");
lcd.print(m);
lcd.print(":00");
}
if (digitalRead(pl) == 0)
{
while (digitalRead(pl) == 0)
{
}
h++;
if (h >= 24)
{
h = 0;
}
}
else if (digitalRead(ps) == 0)
{
while (digitalRead(ps) == 0)
{
}
m++;
if (m >= 60)
{
m = 0;
}
}
else if (digitalRead(pp) == 0)//wyjście z menu budzika
{
while (digitalRead(pp) == 0)
{
}
wb = 0;
lcd.clear();
}
delay(100);
}
}
else if (digitalRead(pl) == 0)//załączenie alarmu
{
while (digitalRead(pl) == 0)
{
}
delay(100);
alarm = 1;
}
else if (digitalRead(ps) == 0)//wyłączenie alarmu
{
while (digitalRead(ps) == 0)
{
}
delay(100);
alarm = 0;
}
}
void moveToPos(float targetPos)//funkcja odpowiadająca za dokładne ustawienie silnika wg zadanego parametru(potencjometra)
{
int stepsToMove = (targetPos - currentPos);
mystepper.step(stepsToMove);
currentPos = targetPos;
}