Jakékoliv měření času se dá provést přes funkci millis(). Spoustu pěkného povídání je zde. Celé povídání zdůrazňuje měření intervalu a ne jednotlivých časů. Potom je také možné díky modulární aritmetice pohodově překonat přetečení unsigned long typu, co nastava asi každých 47 dní. Pokud je potřeba čas prodloužit, článek doporučuje použít 64 bitů pro uložení času přes”

uint64_t millis64() {
    static uint32_t low32, high32;
    uint32_t new_low32 = millis();
    if (new_low32 < low32) high32++;
    low32 = new_low32;
    return (uint64_t) high32 << 32 | low32;
}

Pokud nepotřebujeme v uptime měřit sekundy, tak se pomocí zjednodušení na minuty dostaneme na nekolik tisíc let i pomoci unsigned long. Jenom je potreba pracovat s millis() jednou za minutu (to je 60 000 ticku). Kód pak může vypadat napriklad takhle”

unsigned long TT,upM=0,upH=0,upD=0;

if (millis()-TT >60000)
    {
      upM++;
      if (upM == 60) 
      {
        upM = 0;
        upH++;
      }
      if (upH == 24)
      {
        upH = 0;
        upD++;
      }
    TT = millis();
    }

3 comments

  1. Hezke, ale je tam spousta chyb. Kdyz nebudes millis nulovat, bude prvni podminka po minute splnena pri kazdem pruchodu …

  2. Mozna takhle?

    if (millis()-TT >60000) { //kdyz je cas behu – poznaceny cas vetsi nez 60s
    upM++; //navys minuty o jednu
    TT = millis(); //a poznamenej cas
    if (upM == 60) { //je li minut 60
    upM=0; //vynuluj minuty
    upH++; //navys hodinu o jednu
    }
    if (upH == 24) { //je-li hodin 24
    upH=0; //vynuluj hodiny
    upD++; //pricti jeden den
    }
    else { //jinak (kdyz neni cas behu – poznamenany cas vetsi nez 60s) to znamena po preteceni
    TT=0; //vynuluj poznamenany cas
    }

    1. Diky za komentář. Bylo to myšleno jako studijní příklad, přesto souhlasím, že tam něco chybí:-) To něco je:

      TT = millis();

      před poslední závorkou. Pokud by se to nulovalo, tak to nebude fungovat. Opravil jsem to i v kódu.

      Ještě jednou díky.

Leave a Reply

Your email address will not be published. Required fields are marked *