Go Down

Topic: Datum en tijd [ OPGELOST ] (Read 4078 times) previous topic - next topic

84538

Jun 17, 2017, 12:28 pm Last Edit: Jun 18, 2017, 01:31 pm by 84538
Hallo allemaal,

Zelf wilde ik een project beginnen met datum en tijd opslaan zonder het gebruik van RTC. Het zou mogelijk moeten zijn, maar heb zelf hierbij nog geen goede library gevonden. Heeft iemand tips welke library ik kan gebruiken?


PieterP

#1
Jun 17, 2017, 12:46 pm Last Edit: Jun 17, 2017, 03:41 pm by PieterP
Het probleem is dat de oscillator van de meeste Arduino's niet echt nauwkeurig is, dus lange tijd de juiste tijd bijhouden is niet zo evident. Als het niet aankomt op een paar minuten is het natuurlijk doenbaar (afhankelijk van hoe lang je het programma wil laten lopen).

Een library is niet echt nodig. Je kan gewoon gebruik maken van de millis() functie om het aantal milliseconden sinds opstarten op te vragen. Zorg dat je unsigned long als datatype gebruikt.
Omzetten van milliseconden naar hh:mm:ss is erg eenvoudig:
Code: [Select]
ss = (millis()/1000 + startseconds)%60;
mm = (millis()/60000UL + startminutes)%60;
hh = (millis()/3600000UL + starthours)%24;

Analoog voor dagen en maanden. (startseconds, startminutes en starthours is de ingestelde tijd bij het opstarten.)

Dit werkt tot millis() overflowt. (Dat gebeurt na zo'n 49,7 dagen.)

Als ik echt de juiste tijd nodig heb gebruik ik soms een ESP8266 om de tijd op te vragen van het internet. Dit is relatief eenvoudig, even goedkoop als een RTC module (zo'n $3 uit China), en je hoeft het nooit in te stellen. (Je hebt natuurlijk wel een netwerkconnectie nodig.)

Pieter

84538

Het komt niet op een paar minuten aan, dus ik ga dit zeker uitproberen! Dankje!

84538

Beste Pieter,

Ik heb het programma in arduino gezet en het loopt opzich prima. Ik zag alleen dat het bij 14:59:59 het programma verder gaat bij 60 minuten en niet naar 15:00:00

Heb je hier misschien nog tips voor? Heb zelf al een beetje uitgetest met de formule maar kom er niet helemaal uit.

Alvast bedankt!

PieterP

Sorry, had mijn haakjes verkeerd gezet. Ik heb de code hierboven aangepast, en nu zou het beter moeten werken.

Pieter

84538

Hoi Pieter,

Ik denk dat het gelukt is, bedankt voor het helpen!

PieterP

#6
Jun 17, 2017, 04:26 pm Last Edit: Jun 17, 2017, 04:28 pm by PieterP
Mijn excuses, ik zat helemaal fout, met die offset werkt het niet, besef ik nu. Het probleem is dat je een floordeling doet zonder het aantal minuten en seconden in rekening te brengen. Daardoor telt het uur pas één op wanneer hij 60 minuten lang loopt, en niet wanneer de minuten 60 bereiken.
Code: [Select]
tijd = millis()/1000; // tijd in seconden
ss = (tijd + startseconds)%60; // blijft hetzelfde
mm = (tijd + startseconds)/60)%60;
hh = (tijd + startseconds+60*startminutes)/3600)%24;


Pieter

84538

In de seconden en minuten klopt het wel. Maar de uren kloppen niet helemaal. Als ik 17 uur in milliseconde invul krijg ik -2 uur uit.

nicoverduin

Hoe heb je je variabelen gedefinieerd?
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

PieterP

Zorg dat je unsigned long als datatype gebruikt.
Pieter

84538

Kijk dit is het programma :

unsigned long time;

int startseconds = 0;
int startminutes = 2220;
int starthours = 61200000;

int ss = 0;
int mm = 2220;
int hh = 61200000;

int tijd;

void setup() {
 
Serial.begin(9600);
}

void loop() {
  tijd = millis()/1000; // tijd in seconden
  ss = (tijd + startseconds)%60; // blijft hetzelfde
  mm = ((tijd + startseconds)/60)%60;
  hh = ((tijd + startseconds+60*startminutes)/3600)%24;

Serial.println("Tijd :");
  Serial.println(ss);
  Serial.println(mm);
  Serial.println(hh);
  Serial.println();


delay (5000);
}

PieterP

int starthours = 61200000;
Hint: 216-1-1 = 32767

Pieter

84538

Hint: 216-1-1 = 32767

Pieter
Die hint snap ik niet, heb je iets meer toelichting voor mij?

PieterP

Een int is 16 bits breed, dus je kan in totaal 216 getallen voorstellen, negatief en positief. Het grootste positieve getal dat je kan voorstellen is 216-1-1. Als je bij dat getal 1 optelt, wordt het een negatief getal. De variabele overflowt als je een groter getal probeert op te slaan in een int van 16 bits.

Een unsigned long is 32 bits breed, en enkel positief (unsigned). Het grootste getal dat je kan voorstellen is dus 232-1.

Pieter

84538

Een int is 16 bits breed, dus je kan in totaal 216 getallen voorstellen, negatief en positief. Het grootste positieve getal dat je kan voorstellen is 216-1-1. Als je bij dat getal 1 optelt, wordt het een negatief getal. De variabele overflowt als je een groter getal probeert op te slaan in een int van 16 bits.

Een unsigned long is 32 bits breed, en enkel positief (unsigned). Het grootste getal dat je kan voorstellen is dus 232-1.

Pieter
Oké, dus als ik het goed begrijp ( ben redelijk leek in arduino) mag ik niet meer dan zoveel getallen schrijven?

Go Up