Räkna ut tid i c

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Räkna ut tid i c

Inlägg av BJ »

I Arduino uno finns det en funktion som ger
tiden sedan sista (om)starten i millisekunder: millis().

Jag vill räkna ut hur många
år/månader/dagar, timmar/minuter/sekunder det motsvarar,
och det ska även klara av att millis():s värde räknar runt.
Det gör det efter 2^32 - 1 = 4 294 967 295 ms,
som är ungefär 49,71 dagar.

Jag har programmerat och provkört:

Kod: Markera allt

  unsigned long tid_sekunder    = (tid_tusendelar / 1000);
  unsigned long tid_minuter     = (tid_sekunder / 60);
  unsigned long tid_timmar      = (tid_minuter / 60);
  unsigned long tid_dagar       = (tid_timmar / 24);
  unsigned long tid_maanader    = (tid_dagar / 30);
  unsigned long tid_aar         = (tid_maanader / 365);
Det fungerar nästan. Sekunderna fortsätter att räkna efter 59,
och blir alltså inte 00 igen.

Någon som kan ge mig lite hjälp med matten?
Jag har läst att man kan få resten från en delning
med %, men jag har ändå kört fast lite.
Senast redigerad av BJ 9 november 2017, 13:15:33, redigerad totalt 1 gång.
Användarvisningsbild
AndLi
Inlägg: 17049
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Räkna ut tid i c

Inlägg av AndLi »

Jag förstår inte hur du tänker att din kod ska funka efter omslag...

divisioner är för övrigt dyrt klockcykelmässigt, jag skulle sannolikt byggt upp det med if satser istället.

Kod: Markera allt

void ms_event(uint32_t ms_clock)
tid_ms++;
if(tid_ms>=1000)
{
tid_sekunder ++;
tid_ms = 0;
}
if(tid_sekunder >= 60)
{
tid_minuter++;
tid_sekunder = 0;
}
if(tid_minuter >= 60)
{
tid_timmar++

osv...
Sen måste du ju fundera på din definition av månader, de är ju mellan 28-31 dagar.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Räkna ut tid i c

Inlägg av ffredrik »

unsigned long tid_dagar = (tid_timmar / 60);

Du bör dela med 24 här istället.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Ja, så kan man ju göra. Tack.

Jag märkte att det tar väldigt lång tid
att räkna delat med.

Månader vet jag inte, kanske sätta alla till
30 dagar eller något.

Räknat runt: Man jämför om nya ms-värdet
är mindre än det gamla. I så fall räknar man upp
variabler med sparad tid att lägga på
på den vanliga uträknade tiden.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Sant, jag skrev fel.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Tack för hjälpen, det fungerar. :tumupp:
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Räkna ut tid i c

Inlägg av Icecap »

Om det är en "riktig" omvandling (tid i sekunder sedan ett visst datum till datum & tid) man ska göra är det inte helt enkelt - men dock möjligt.

Det "kräver" dock att man har en RTC inkopplat om man inte är väldigt glad för att knappa in datum & tid för varje uppstart.

Men är det en "loggningsräknare" anser jag att det ska stanna vid dagar. De kan ju räknas vidare med AndLi's exempel, även om räknaren rullar runt.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Det blir ingen realtidsklocka här,
utan bara en loggnings-räknare.

Egentligen kanske det räcker med dagar,
men det är ju kul om den klarar mer.

(Just nu klarar den 2^32 - 1 = 4 294 967 295 år. ;))
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Räkna ut tid i c

Inlägg av sodjan »

Ett alternativ är att skita i kalendern i Arduinon och enbart
logga sekunder löpande. Sedan kan man göra konverteringen
till riktiga kalender tider någon annanstans. Det är sällan som
det behövs presentation på den nivån i just den utrustningen
där själva loggningen sker.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Tack för tipset, men här är det tänkt att
tiden ska visas på en lcd-skärm. :)
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: Räkna ut tid i c

Inlägg av arvidb »

Det låter som att du behöver bestämma dig för exakt hur systemet ska fungera. Vill du lägga till en realtidsklocka och visa riktig kalendertid, eller räcker det med tid sedan senaste omstart? Vill du räkna bara dagar, eller vill du göra en "ful-lösning" där varje månad är 30 dagar (och där således visade antal månader och år blir lite inkorrekt)? O.s.v.

Detta tycker jag ofta är det svåraste med programvaruutveckling: att bestämma sig för exakt i detalj vad som faktiskt ska göras.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Det räcker med tiden sedan sista (om)starten.
Det här är bara en hobby-grej som ska påminna
om Linuxs upptids-visare.
Just nu blir det en "ful-lösning" där varje månad
är 30 dagar.
Det går väl att rätta till lite genom att lägga på
en dag för varannan månad, men så noga är
det inte.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43149
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Räkna ut tid i c

Inlägg av sodjan »

Kanske bara räkna hela dagar (och tid)? Enklare och stämmer ju alltid...

Kod: Markera allt

$
$ sh sys /noproc
OpenVMS V8.4-2L2  on node xxxx    9-NOV-2017 17:00:14.22   Uptime  118 18:06:30
$
$
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Ja, det är ju också ett sätt.

Tillägg:
Ändrade programmet till dagar och tid,
eftersom det stämmer bättre.
BJ
Inlägg: 8185
Blev medlem: 11 april 2007, 08:14:53
Ort: En_stad

Re: Räkna ut tid i c

Inlägg av BJ »

Med 4 siffror för dagarna får man plats med
dagar upp till 9999, som ger ungefär 27 år.

20 tecken:

Kod: Markera allt

___0 dagar, 00:01:28
Skriv svar