Planowanie uruchomienia od godziny do godziny.

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Planowanie uruchomienia od godziny do godziny.

Post autor: razorxx100 » 3 lut 2016, 23:11

Witam, znowu mam maly problem ktorego nie moge rozwiazac.
Chodzi mi o planowanie od ktorej do ktorej godziny ma byc zalaczony np przekaznik.
Czas pobieram za pomoca modulu RTC.
Na poczatku myslalem ze zrobie to jak;

Kod: Zaznacz cały

  if(minute >= godzina6 && hour >= godzina5 && minute <= godzina8 && hour <= godzina7 )
  {
   Serial.println("Test");
  }
Ale szybko sie domyslilem ze to by zadzialalo tylko wtedy gdyby caly czas byl w jednej zmiennej.
Nie mam pomyslu jak to zrobic zeby np zalaczy od 12:20 do 12:40.
Wszystkie zmienne sa jako int.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: razorxx100 » 4 lut 2016, 00:40

Noo ale co jezeli w miedzyczasie zostanie np na chwile wylaczony i nastepnie na nowo wlaczony? Albo w czasie kiedy ma wlaczyc przekaznik urzadzenie bedzie wylaczone??
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: arduino-lab » 4 lut 2016, 01:46

Kod: Zaznacz cały


...

  if (RTC.read(tm)) {
    lcd.setCursor(12,3);
    print2digits(tm.Hour);
    godzina = tm.Hour;
    lcd.print(":");
    print2digits(tm.Minute);
    minuta = tm.Minute;
    lcd.print(":");
    print2digits(tm.Second);

    lcd.setCursor(0,3);
    lcd.print(tm.Day);
    lcd.print("/");
    lcd.print(tm.Month);
    lcd.print("/");
    lcd.print(tmYearToCalendar(tm.Year));

...

void wlacznik(){  
  // tutaj ustalamy sobie ramy czasowe tj. od 12:31 do 12:32
  if (godzina >= 12 && minuta >= 31 && godzina < 12 && minuta < 32)
  {
    digitalWrite(wlacznik_1, LOW);
    lcd.setCursor(0,2);
    lcd.print("on ");   
  }
  else {
    digitalWrite(wlacznik_1, HIGH);
    lcd.setCursor(0,2);
    lcd.print("off");
  }
}
Tylko nie bardzo rozumiem Twoich pytań.
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: razorxx100 » 4 lut 2016, 02:24

Nooo to ustaw sobie czas od 12:31 do 13:11.
Wtedy z miejsca nie spelni ci sie drugi warunek czyli minuta >= 31 jak bedzie np 13:00, wtedy minute masz mniejsza od 31 i przekaznik sie wylaczy.
Dodatkowo masz blad w kodzie ktory podales ( oraz na swojej stronie). Warunek 3 nigdy nie bedzie prawdziwy bo jak 12 moze byc mniejsze od 12 ;)

Taki kod ma prawo istanienia tylko do 1h. czyli np od 13:01 do 13:59.
crobe
Majsterkowicz
Posty: 114
Rejestracja: 14 gru 2015, 17:56
Lokalizacja: Brzozów
Kontakt:

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: crobe » 4 lut 2016, 08:41

Też myślałem nad tym problemem jak pytałem na elektrodzie nikt konkretnie nie odpisał polecili tylko zasilanie awaryjne, z kolei jeden gość zna się na programowaniu napisał mi kod ,przechowuje stan przekaźnika w EPROM ale kość wykończyła by się po 2 miesiącach.
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 4 lut 2016, 13:58

Można zrobić tak jak napisał razorxx100, zrobić z tych czasów pojedyncze zmienne mnożąc liczbę godzin razy 100.

Kod: Zaznacz cały

  int start, stop, czas;
 
 
 
  start = godzina_start * 100 + minuta_start;  //12:31 -> 1231
  stop = godzina_stop * 100 + minuta_stop;  //13:11 -> 1311
  czas = godzina * 100 + minuta;  //np. 13:00 -> 1300
  
  
  if(czas >= start && czas < stop)
  {
  
  }
  else
  {
  
  }
I ten warunek zadziała teraz nawet po zaniku zasilania. Do eeproma nie trzeba robić niepotrzebnych zapisów, wystarczy tylko w momencie zmiany tych czasów. Ale nie będzie to działać jakby chciało się ustawić włączenie na przykład od 22:00 do 6:00, ale można napisać warunek tak, żeby wtedy też zadziałał prawidłowo.

Kod: Zaznacz cały

  if( (stop < start && (czas < stop || czas > start)) || (stop > start && czas >= start && czas < stop) )
Nie testowałem tego, ale powinno działać.
razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: razorxx100 » 4 lut 2016, 14:36

A w przywpadku kiedy bedzie od 13:30 do 4:10?
if(start > stop && czas > start){
stop += 2400 ;
}
Cos takiego powinno zalatwic sprawe? W domu bede dopiero o 16 i nie mam jak sprawdzic kodu.

@Edit
Sorry, nie widzialem tego drugiego kodu.
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 4 lut 2016, 17:04

Krapi chodzi po prostu o zanik zasilania. W Twoim kodzie włączenie i wyłączenie jest tylko w momencie dokładnej godziny, więc jeśli akurat w tym momencie to urządzenie, o którym pisze razorxx100, czyli arduino, będzie bez zasilania, to jak zasilanie powróci, to nie zadziała już wcale wyłączenie/włączenie. Pewnie można go ratować dodatkowymi warunkami i zapisem dodatkowych informacji do eepromu, ale będą to niepotrzebne zapisy (właściwie to nie wiem czy by było potrzebne zapisywanie stanów przekaźników, crobe pisze o takim sposobie). Kod arduino-lab nie ma tej wady, ale ma nową, będzie działał tylko w "danej godzinie", czyli to o czym pisał razorxx100
razorxx100 pisze:Nooo to ustaw sobie czas od 12:31 do 13:11.
Wtedy z miejsca nie spelni ci sie drugi warunek czyli minuta >= 31 jak bedzie np 13:00, wtedy minute masz mniejsza od 31 i przekaznik sie wylaczy.
Dodatkowo masz blad w kodzie ktory podales ( oraz na swojej stronie). Warunek 3 nigdy nie bedzie prawdziwy bo jak 12 moze byc mniejsze od 12 ;)

Taki kod ma prawo istanienia tylko do 1h. czyli np od 13:01 do 13:59.
Krapi pisze:ale ja pytam: po co? skoro z poziomu samego RTC są wyselekcjonowane osobno minuty i godziny w piękny sposób?
nie rozumiem po co utrudniać sobie życie zbędnymi operacjami...
No to pokaż jak napisać taki warunek, żeby po powrocie zasilania zadziałał z opóźnieniem i zrobił to co powinno być zrobione gdyby nie było zaniku zasilania. Pewnie się da, ale byłoby to bardziej skomplikowane, niż te zbędne operacje. A może nie byłoby dużo bardziej skomplikowane, ale każdy może wymyślić inny sposób rozwiązania danego problemu, akurat to mi przyszło do głowy, bo razorxx100 pisał o czasie w jednej zmiennej.

EDIT
Oczywiście czas włączenia i wyłączenia i tak i tak musi być zapisany do eepromu i w momencie uruchamiania odczytane do zmiennych. Różnica jest w tym, że warunek zadziała tak jak trzeba po ewentualnym zaniku zasilania.
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 4 lut 2016, 17:48

Krapi pisze:

Kod: Zaznacz cały

1. po włączeniu arduino odczytac zawartosc EEPROMu
2. sprawdzić czy odczytana godzina uruchomienia jest mniejsza od aktualnej
 - jeśli tak: sprawdzić czy godzina wyłączenia jest wieksza od aktualnej
    - jeśli tak: włącz przekaźnik
coś takiego powinno być ok ;)
A do normalnej pracy zwykłe dwa powyższe warunki jakie podałem
No właśnie to jest oczywiste, ale jak to rzeczywiście zapisać jako warunek kiedy godzina i minuta jest osobno? To jest własnie ten problem, że to się tak wprost nie da. arduino-lab zapisał taki warunek, ale jednak nie spełnia swojego zadania. To musiałby być bardziej skomplikowany warunek żeby działał i ja na przykład nie jestem w stanie go zapisać.
Awatar użytkownika
arduino-lab
Młodszy majsterkowicz
Posty: 30
Rejestracja: 2 gru 2015, 14:41
Kontakt:

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: arduino-lab » 4 lut 2016, 21:25

Faktycznie, warunek który podałem w tym wypadku nie spełnia swojego zadania. Przepraszam.

Wydaje mi się, że jedyne dobre rozwiązanie podał @stiven. Tutaj jedynie tm.Hour * 100 + tm.Minute daje nam format zapisu:
od 12:31 do 13:11, 1231 będzie zawsze mniejsze niż 1311,
od 13:30 do 4:10, 1330 będzie zawsze większe niż 410.

Robimy wtedy zapis a'la uniksowy, który co 24 godziny się będzie zerował. Wtedy jest możliwość zapisu schematu, który podał @Krapi. Tak naprawdę rozwiązujemy też mój warunek.

Gdybyśmy chcieli oddzielnie. Dla godziny od 12:31 i do godziny 13:11 wyłącz. Musielibyśmy najpierw porównywać godziny, kiedy będą miały różne wartości. Kiedy będą miały takie same wartości przejdziemy do porównywania minut. Czyli...
12 będzie mniejsza od 13 - wyłącz.
13 będzie równa 13 wtedy sprawdź minuty. 1 będzie mniejsze od 11 - wyłącz. 12 będzie większe od 11 - włącz.

Dla godziny od 12:11 i 13:31.
Godziny tak samo.
11 będzie mniejsza od 31 - wyłącz. 32 będzie większa od 11 - włącz.

Dla godziny od 13:30 do 4:10 wyłącz to tak naprawdę od 4:10 do 13:30 włącz.
4 będzie mniejsza od 13 - wyłącz. 14 będzie większa od 13 - włącz.

I jeszcze kilka równań. Inaczej się nie da. Jarzebski pl zmodyfikował bibliotekę, przez co można korzystać z formatu znanego z php. To będzie rozwiązanie, gdzie wyciągniesz sobie od razu tylko godzinę w formacie hh:mm:ss do zmiennej.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1257
Rejestracja: 18 lis 2011, 02:18

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: Marhef » 5 lut 2016, 10:13

Hmm, ale w ostatnim wpisie Krapi dobrze napisał. Rozbijasz warunek na dwa warunki i w kodzie kolegi Arduino-lab zamiast:

Kod: Zaznacz cały

if (godzina >= 12 && minuta >= 31 && godzina < 12 && minuta < 32)
będzie:

Kod: Zaznacz cały

if (godzina >= 12 && minuta >= 31)
  if (godzina <= 12 && minuta <= 32)
i dalej załączenie przekaźnika. Oczywiście zamiast konkretnych wartości można wstawić zmienne.
Aha, i to nie zadziała przy przejściu przez godzinę 00:00
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 5 lut 2016, 11:45

Marhef ale co to zmienia? W czym te 2 ify są lepsze od tego jednego? Zawsze jak masz tak ify jeden za drugim, to możesz warunki połączyć iloczynem logicznym, czyli && i zrobić jeden if. Ty zrobiłeś odwrotnie, ale to jest dalej to samo i to będzie działać tylko jak włączenie i wyłączenie będzie w tej samej godzinie. Żeby to działało przy różnych godzinach, to by trzeba było ten warunek rozbudować, arduino-lab napisał jak by to można próbować zrobić. razorxx100 pisał wcześniej dlaczego ten warunek nie działa w takiej postaci:
razorxx100 pisze:Nooo to ustaw sobie czas od 12:31 do 13:11.
Wtedy z miejsca nie spelni ci sie drugi warunek czyli minuta >= 31 jak bedzie np 13:00, wtedy minute masz mniejsza od 31 i przekaznik sie wylaczy.
Dodatkowo masz blad w kodzie ktory podales ( oraz na swojej stronie). Warunek 3 nigdy nie bedzie prawdziwy bo jak 12 moze byc mniejsze od 12 ;)

Taki kod ma prawo istanienia tylko do 1h. czyli np od 13:01 do 13:59.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1257
Rejestracja: 18 lis 2011, 02:18

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: Marhef » 5 lut 2016, 12:56

Można na jednym. Ale w ten sposób:

Kod: Zaznacz cały

if ((godzina >= 12 && minuta >= 31) && (godzina <= 12 && minuta <= 32))
Wtedy sprawdza najpierw warunek początku odliczania (godziny i minuty), a następnie wyłączania (również godziny i minuty). Nie będzie działał tylko przy przejściu przez godzinę 00:00.
A w czym dwa były lepsze od poprzedniego jednego? W poprzednim sprawdzał wszystkie cztery warunki. Więc minuty musiały być jednocześnie większe od początku i mniejsze od końca, i tak samo z godzinami. Rozbijając na dwa ify, sprawdzanie jest inne.

EDIT:
Chociaż, obydwa sposoby nie zadziałają. Poprawnie powinno być:

Kod: Zaznacz cały

if (godzina >= 12 || (godzina == 12 && minuta >= 31) && (godzina < 12 || (godzina == 12 && minuta <= 32))
Oczywiście dla podanych wartości nie ma to sensu, tam trzeba by wstawić zmienne przechowujące czas rozpoczęcia i zakończenia. I trzeba jeszcze dodać warunek na przejściu przez 0
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 5 lut 2016, 13:37

Przecież tam masz same &&, więc nawiasy niczego nie zmieniają w tym przypadku. Masz takie same operacje logiczne tam, to tak samo jak byś miał takie same operacje matematyczne, na przykład ((5*6) * (7*8)) czy (5*6*7*8) da wynik taki sam. I czy to będzie 1 if (z nawiasami czy bez), czy 2 ify, to przecież i tak wszystkie 4 warunki muszą być spełnione.
Marhef pisze: EDIT:
Chociaż, obydwa sposoby nie zadziałają.
No właśnie. Te 3 warianty, to jest cały czas to samo.


A ten nowy warunek, który napisałeś, to nie wiem do końca jak analizować, bo nawiasów masz za mało, ale jeśli miał tak wyglądać

Kod: Zaznacz cały

  if ( (godzina >= 12 || (godzina == 12 && minuta >= 31)) && (godzina < 12 || (godzina == 12 && minuta <= 32)) )
to niestety jest bez sensu. Jak się poprawi "godzina < 12" na "godzina <= 12", to ten cały warunek będzie spełniony od 12:00 do 12:59.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1257
Rejestracja: 18 lis 2011, 02:18

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: Marhef » 5 lut 2016, 14:06

Podstaw sobie inne godziny niż 12:31 i 12:32. Na zmiennych to będzie:

Kod: Zaznacz cały

if ( (godzina > godzinaRozpoczecia || (godzina == godzinaRozpoczecia && minuta >= minutaRozpoczecia)) && (godzina < godzinaZakonczenia || (godzina == godzinaZakonczenia && minuta <= minutaZakonczenia)) )
I działa to w ten sposób, że:
jeżeli godzina jest większa od godziny rozpoczęcia lub godzina jest równa godzinie rozpoczęcia i minuta jest większa lub równa minucie rozpoczęcia
i jednocześnie godzina jest mniejsza od godziny zakończenia lub godzina jest równa godzinie zakończenia i minuta jest mniejsza lub równa minucie zakończenia
to należy włączyć przekaźnik.
Podkolorowałem warunki, żeby było jasne, które są sprawdzane razem. I nie pomyliłem się w warunkach.
stiven pisze:Przecież tam masz same &&, więc nawiasy niczego nie zmieniają w tym przypadku. Masz takie same operacje logiczne tam, to tak samo jak byś miał takie same operacje matematyczne, na przykład ((5*6) * (7*8)) czy (5*6*7*8) da wynik taki sam. I czy to będzie 1 if, czy 2, to przecież i tak wszystkie 4 warunki muszą być spełnione.
Nie do końca to jest tak. Znasz DOBRZE algebrę boole'a?
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 5 lut 2016, 15:33

Tak, wygląda na to, że teraz już jest dobrze ten warunek.

Dobrze algebry boole'a nie znam, ale tak patrząc logicznie, jeśli mają się wydarzyć te 2 rzeczy i jednocześnie te 2 rzeczy, to tak naprawdę muszą się wydarzyć jednocześnie wszystkie 4 rzeczy. Wydaje mi się, że to jest właśnie zgodne z prawem łączności koniunkcji z algebry boole'a i logiki matematycznej.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1257
Rejestracja: 18 lis 2011, 02:18

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: Marhef » 5 lut 2016, 16:34

Nie do końca. Sprawdzasz osobno dwa pierwsze warunki i osobno dwa ostatnie warunki. W tym przypadku to nie miało prawa działać (bo uwzględniało by tylko godziny pomiędzy zadanymi i minuty pomiędzy zadanymi), ale są takie warunki, że wg Twojego rozumowania będzie sprzecznie, a to będzie działać.
stiven
Złota rączka
Posty: 1641
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Planowanie uruchomienia od godziny do godziny.

Post autor: stiven » 5 lut 2016, 17:49

Marhef pisze:bo uwzględniało by tylko godziny pomiędzy zadanymi i minuty pomiędzy zadanymi
Jak byłyby nawiasy, czy jak by nie było? Przecież nie ważne czy by były, właśnie tak samo by było, bo w rzeczywistości i tak każdy warunek jest osobnym warunkiem a nawias pozornie łączy ze sobą 2 warunki. I własnie to prawo łączności pokazuje, że jeśli w równaniu jest tylko suma logiczna, albo tylko iloczyn logiczny, to nawiasy nie mają znaczenia, nie powodują połączenia ze sobą dwóch warunków.

Nie mogę znaleźć definicji prawa łączności w logice, ale definicja prawa łączności z matematyki powinna rozjaśnić sytuację:
Prawo łączności mnożenia mówi nam, że jeśli mamy pomnożyć wiele liczb (czynników) to iloczyn (wynik mnożenia) nie zmieni się bez względu na kolejność mnożenia tych liczb.
( a x b ) x c = a x ( b x c )
Prawo łączności dodawania mówi nam, że jeśli mamy dodać wiele liczb (składników) to suma (wynik dodawania) nie zmieni się bez względu na kolejność dodawania tych liczb.
( a + b ) + c = a + ( b + c )

O i udało mi się znaleźć na stronie uniwersytetu coś o równaniach logicznych
https://www.math.uni.wroc.pl/~newelski/ ... node3.html

i jest tu takie zdanie:
Dzięki łączności w wyrażeniach tego typu w algebrze możemy opuszczać nawiasy. Podobnie w rachunku zdań możemy opuszczać nawiasy w wielokrotnych koniunkcjach i alternatywach.
ODPOWIEDZ

Strony partnerskie: