Zegar do sterowania tym programem to DS3231.
Wciągu doby lampka raz się zaświeca i gaśnie. Z reguły to godziny 10:00 (Czas automatycznego włączenia możliwy do zmiany w aplikacji) i 20:00 (Czas wyłączenia również możliwy do zmiany). Jeżeli chodzi o aplikację to wszystko działa dobrze. Problem mam tylko z tym manualnym włączeniem i wyłączeniem.
Program do obsługi samego zegara bez tych przycisków (fragmenty):
boolean ON = true, OFF = false;
long unsigned currentTimeSec;
int led = 3; // do ktorego pinu pwm podlaczona jest dioda
int jasnosc = 0; // wartosc poczatkowa jasnosci
int wypelnienie = 1; // co ile punktow zwieksza sie wypelnienie
#define t1Pin 3
// Godzina, minuta, sekunda włączenia obwodu 1 (Godzina/Minuta/Sekunda)
int t1HOn, t1MOn, t1SOn;
// Godzina, minuta, sekunda wyłączenia obwodu 1 (Godzina/Minuta/Sekunda)
int t1HOff, t1MOff, t1SOff;
DS3231 clock;
RTCDateTime dt;
// stan poczatkowy pinu timera
digitalWrite(t1Pin, OFF);
//kolejny fragment to juz petla loop
void loop() {
currentTimeSec = (long(dt.hour) * 3600) + (long(dt.minute) * 60) + long(dt.second);
//zmienna currentTimeSec pobiera z RTC aktualny czas i przelicza go na sekundy, bedzie to potrzebne do warunków funkcji timera
dt = clock.getDateTime();
//odczytywanie zapisanej w pamieci eeprom godzinie switu i zmierzchu
t1HOn = EEPROM.read(0);
t1MOn = EEPROM.read(1);
t1HOff = EEPROM.read(2);
t1MOff = EEPROM.read(3);
timer(t1Pin, t1HOn, t1MOn, t1SOn, t1HOff, t1MOff, t1SOff, 1); //TIMER NR 1
//tutaj juz poza petla loop
//FUNKCJA TIMER 1 - ten timer odpowiada za porównywanie aktualnego czasu z RTC do czasu ustawionego
boolean timer( int tPin, byte hOn, byte mOn, byte sOn, byte hOff, byte mOff, byte sOff, byte tStatus) //, long currentTimeSec)
{
if (tStatus == 0) {
digitalWrite(tPin, OFF);
return false;
};
boolean state = false;
long tOn = (long(hOn) * 3600) + (long(mOn) * 60) + long(sOn);
long tOff = (long(hOff) * 3600) + (long(mOff) * 60) + long(sOff);
//1 warunek porównujący aktualny czas z czasem ustawionym
if (tOn < tOff) {
if (currentTimeSec >= tOn && currentTimeSec < tOff) {
state = true;
}
}
//2 warunek porównujący aktualny czas z czasem ustawionym
if (tOn > tOff) {
if (currentTimeSec >= tOn && currentTimeSec <= 86399) {
state = true;
}
if (currentTimeSec >= 0 && currentTimeSec < tOff) {
state = true;
}
}
//jeżeli state == true to lampka się rozjaśnia
if (state) {
analogWrite(led, jasnosc); // wejscie pwm jest deklarowane na pin leda o okreslonej jasnosci rownej 0
jasnosc += wypelnienie;
if (jasnosc > 255) //jesli jest powyzej 255, to ustalamy spowrotem 255
jasnosc = 255;
return true;
}
//jeżeli state == false to lampka się ściemnia
else {
analogWrite(led, jasnosc); // wejscie pwm deklarowane na pin led o jasnosci rownej 0
jasnosc -= wypelnienie;
if (jasnosc < 0) //jesli spadlo nam ponizej zera, to wracamy na wartosc 0.
jasnosc = 0;
return false;
}
}
Wciągu doby lampka raz się zaświeca i gaśnie. Z reguły to godziny 10:00 (Czas automatycznego włączenia możliwy do zmiany w aplikacji) i 20:00 (Czas wyłączenia również możliwy do zmiany). Jeżeli chodzi o aplikację to wszystko działa dobrze. Problem mam tylko z tym manualnym włączeniem i wyłączeniem.
Program do obsługi samego zegara bez tych przycisków (fragmenty):
boolean ON = true, OFF = false;
long unsigned currentTimeSec;
int led = 3; // do ktorego pinu pwm podlaczona jest dioda
int jasnosc = 0; // wartosc poczatkowa jasnosci
int wypelnienie = 1; // co ile punktow zwieksza sie wypelnienie
#define t1Pin 3
// Godzina, minuta, sekunda włączenia obwodu 1 (Godzina/Minuta/Sekunda)
int t1HOn, t1MOn, t1SOn;
// Godzina, minuta, sekunda wyłączenia obwodu 1 (Godzina/Minuta/Sekunda)
int t1HOff, t1MOff, t1SOff;
DS3231 clock;
RTCDateTime dt;
// stan poczatkowy pinu timera
digitalWrite(t1Pin, OFF);
//kolejny fragment to juz petla loop
void loop() {
currentTimeSec = (long(dt.hour) * 3600) + (long(dt.minute) * 60) + long(dt.second);
//zmienna currentTimeSec pobiera z RTC aktualny czas i przelicza go na sekundy, bedzie to potrzebne do warunków funkcji timera
dt = clock.getDateTime();
//odczytywanie zapisanej w pamieci eeprom godzinie switu i zmierzchu
t1HOn = EEPROM.read(0);
t1MOn = EEPROM.read(1);
t1HOff = EEPROM.read(2);
t1MOff = EEPROM.read(3);
timer(t1Pin, t1HOn, t1MOn, t1SOn, t1HOff, t1MOff, t1SOff, 1); //TIMER NR 1
//tutaj juz poza petla loop
//FUNKCJA TIMER 1 - ten timer odpowiada za porównywanie aktualnego czasu z RTC do czasu ustawionego
boolean timer( int tPin, byte hOn, byte mOn, byte sOn, byte hOff, byte mOff, byte sOff, byte tStatus) //, long currentTimeSec)
{
if (tStatus == 0) {
digitalWrite(tPin, OFF);
return false;
};
boolean state = false;
long tOn = (long(hOn) * 3600) + (long(mOn) * 60) + long(sOn);
long tOff = (long(hOff) * 3600) + (long(mOff) * 60) + long(sOff);
//1 warunek porównujący aktualny czas z czasem ustawionym
if (tOn < tOff) {
if (currentTimeSec >= tOn && currentTimeSec < tOff) {
state = true;
}
}
//2 warunek porównujący aktualny czas z czasem ustawionym
if (tOn > tOff) {
if (currentTimeSec >= tOn && currentTimeSec <= 86399) {
state = true;
}
if (currentTimeSec >= 0 && currentTimeSec < tOff) {
state = true;
}
}
//jeżeli state == true to lampka się rozjaśnia
if (state) {
analogWrite(led, jasnosc); // wejscie pwm jest deklarowane na pin leda o okreslonej jasnosci rownej 0
jasnosc += wypelnienie;
if (jasnosc > 255) //jesli jest powyzej 255, to ustalamy spowrotem 255
jasnosc = 255;
return true;
}
//jeżeli state == false to lampka się ściemnia
else {
analogWrite(led, jasnosc); // wejscie pwm deklarowane na pin led o jasnosci rownej 0
jasnosc -= wypelnienie;
if (jasnosc < 0) //jesli spadlo nam ponizej zera, to wracamy na wartosc 0.
jasnosc = 0;
return false;
}
}