logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega - Jak obliczyć unixtime na 9 rano następnego dnia?

m.biruta 23 Paź 2012 21:32 1926 13
REKLAMA
  • #1 11443547
    m.biruta
    Poziom 16  
    Witam,
    Na podstawie tutoriala http://www.ladyada.net/learn/breakoutplus/ds1307rtc.html pobieram aktualną datę w formacie "ludzkim" tj. 19:17:31 oraz unixtime. Potrzebuję teraz na tej podstawie ustalić unixtime następnego dnia na godz. np. 9 rano. Wymyśliłem, coś takiego:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pytanie czy to będzie działać i co się stanie jak od 60 odejmę 04 (format 4-tej sekundy), czy to da wynik 56? Nie mam niestety jak teraz tego przetestować :-/
  • REKLAMA
  • Pomocny post
    #2 11444063
    krru
    Poziom 33  
    Unix time daje czas w s od północy jakiegoś tam dnia. Jak podzielisz taki czas przez 86400 (liczba sekund w dobie) dostaniesz liczbę dni od początku czasu unixa. Dzielenie oczywiście całkowite. Potem mnożysz wynik przez 86400 i masz północ bieżącego dnia. Dodajesz 24+9 godzin (po 3600 sekund) i masz 9 rano następnego dnia.
  • #3 11444125
    stanleysts
    Poziom 27  
    dzielisz a potem znów mnożysz przez to samo...
  • REKLAMA
  • #4 11444425
    m.biruta
    Poziom 16  
    Faktycznie :-) Dzieki!
  • #5 11444438
    krru
    Poziom 33  
    stanleysts napisał:
    dzielisz a potem znów mnożysz przez to samo...


    5 / 2 = 2
    2 * 2 = 4

    Dla dzielenia na liczbach całkowitych nie wychodzi to samo.
  • #6 11444522
    m.biruta
    Poziom 16  
    Czyli powinno to wyglądać tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Si?
  • #7 11444542
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Ja tylko podpowiem, że "north" to północ, ale jako kierunek, a nie czas. No i lepiej najpierw dodać jeden i potem mnożyć przez duże liczby niż najpierw mnożyć przez duże liczby a potem dodać dużą liczbę.

    4\/3!!
  • REKLAMA
  • #8 11445815
    m.biruta
    Poziom 16  
    Freddie Chopin napisał:
    No i lepiej najpierw dodać jeden i potem mnożyć przez duże liczby niż najpierw mnożyć przez duże liczby a potem dodać dużą liczbę.

    4\/3!!

    Ok, dzięki za podpowiedź odnośnie działań. Nie rozumiem tylko o co chodzi z 4V3...
  • REKLAMA
  • Pomocny post
    #10 11454677
    uzi18
    Poziom 24  
    5V-0,7V = 4V3 High state ;)

    Tak chyba jest czytelniej i prosciej:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    wtedy:
    today9h.unixtime()+86400L - to raczej Twoj czas ;)
    lub
    today9h.unixtime()+SECONDS_PER_DAY

    Niestety biblioteka ktora wybrales nie ma mozliwosci ustawienia konkretnej godziny w dacie.
    Mozna za to prosto taka funkcjonalnosc dopisac.

    Podpowiem jeszcze ze z tym moze byc problem:
    int timeCurrent = timeNow.unixtime();

    timeNow.unixtime(); nie jest typu int a uint32_t
  • #11 11461377
    m.biruta
    Poziom 16  
    Potrzebuje obliczac godzine x dni do przodu wiec zaproponowana wczesniej metoda jest chyba ok. Jak proponujesz rozwiazac problem z innym typem zmiennej (nie widzialem takiej w dokumentacji arduino)?
  • #12 11462691
    uzi18
    Poziom 24  
    No wiec masz gotowca praktycznie
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W bibliotece RTC, z ktorej korzystasz ta zmienna jest takiego typu, int ma za maly zakres.
    Dokumentacja Arduino ukrywa przed userem pewne rzeczy aby poczatkujacy nie byli zarzuceni zbyt duza iloscia informacji.
    Po to aby user mogl szybko zaczac przygode.
    Ten kod powyzszy wklejasz i powinno sie skompilowac.

    Swoja droga moglbys napisac co tworzysz i pokazac calosc kodu moze cos sie jeszcze podpowie.
  • #13 11465652
    m.biruta
    Poziom 16  
    uzi18 napisał:
    W bibliotece RTC, z ktorej korzystasz ta zmienna jest takiego typu, int ma za maly zakres.

    Wydawało mi się, że 10-cio cyfrowa liczba zmieści się w int :)

    uzi18 napisał:
    Ten kod powyzszy wklejasz i powinno sie skompilowac.

    Jutro postaram się stworzyć prototyp i wrzucić program do arduino.

    uzi18 napisał:
    Swoja droga moglbys napisac co tworzysz i pokazac calosc kodu moze cos sie jeszcze podpowie.

    Buduję stację automatycznego dozowania chemii basenowej oraz filtracji, czyli pilnowanie aby co x dni były dozowane chemikalia z automatycznym przeliczeniem na pojemność basenu oraz cykliczna filtracja oraz obieg podgrzewania wody w zależności od temperatury. Jak już będzie wszystko działać to planuję dostęp poprzez BT. Pokażę kawałki kodu (ponieważ nie mam jeszcze całości).

    Funkcja odpowiedzialna za załączanie i rozłączanie przekaźników 230V za pomocą układu PCF8574. Co sekundę wykonywana jest funkcja sprawdzająca, czy przekaźńiki powinny być załączone czy wyłączone i tak je ustawia (za każdym razem, ale ustawiamy stan na układzie tylko wtedy gdy ma nastąpić zmiana).
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kawałek kodu funkcji daemona uruchamiającego usługi jeśli zostaną spełnione odpowiednie warunki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 11491773
    uzi18
    Poziom 24  
    int typowo (16bit) ma zakres -32,768 do 32,767
    unsigned int nie ma znaku wiec ma zakres od 0 do 65535

    zapis uin32_t oznacza ze jest to unsigned int 32bitowy czyli od 0 do 4294967295L

    http://arduino.cc/en/Reference/Int
    http://arduino.cc/en/Reference/UnsignedInt

    Jest biblioteka dla Arduino, ktora pozwala Ci generowac dzialania co okreslony czas.
    Tzn. podajesz funkcje i okres co jaki ma sie uruchamiac i chyba jeszcze mozna podac ilosc wywolan.
REKLAMA