• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zmiana stanów logicznych oświetlenia
#10
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;
  }
}
 
Odpowiedź
  


Wiadomości w tym wątku
RE: Zmiana stanów logicznych oświetlenia - przez Krzaczek - 25-11-2019, 12:06

Skocz do:


Przeglądający: 1 gości