Sida 1 av 2

Räkna ut tid i c

Postat: 9 november 2017, 13:02:15
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 13:10:46
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 13:13:56
av ffredrik
unsigned long tid_dagar = (tid_timmar / 60);

Du bör dela med 24 här istället.

Re: Räkna ut tid i c

Postat: 9 november 2017, 13:14:32
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 13:15:02
av BJ
Sant, jag skrev fel.

Re: Räkna ut tid i c

Postat: 9 november 2017, 13:44:29
av BJ
Tack för hjälpen, det fungerar. :tumupp:

Re: Räkna ut tid i c

Postat: 9 november 2017, 13:47:00
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 14:37:34
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. ;))

Re: Räkna ut tid i c

Postat: 9 november 2017, 15:57:04
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 16:18:50
av BJ
Tack för tipset, men här är det tänkt att
tiden ska visas på en lcd-skärm. :)

Re: Räkna ut tid i c

Postat: 9 november 2017, 16:26:37
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 16:49:44
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.

Re: Räkna ut tid i c

Postat: 9 november 2017, 17:02:39
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
$
$

Re: Räkna ut tid i c

Postat: 9 november 2017, 17:05:29
av BJ
Ja, det är ju också ett sätt.

Tillägg:
Ändrade programmet till dagar och tid,
eftersom det stämmer bättre.

Re: Räkna ut tid i c

Postat: 9 november 2017, 17:35:33
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