Beste
Ik zou met Arduino een broedmachine willen maken.
Bedoeling is om gedurende 21-23 dagen temperatuur en vochtigheid aan te sturen.
Ik zou op een display willen laten verschijnen hoe lang de broedmachine al loopt (aantal dagen en uren).
Alleen zit in de knoei over hoe dit te doen. Ik heb al het een en ander gelezen, maar ik snap het niet.
Mijn idee was om millis() te laten lopen, na 3600 seconden wordt een uur bijgeteld bij de variabele, en als het uur groter is dan 24, dan wordt de dag 'verhoogt' met een en het uur terug op nul gezet.
Maar dan moet je in principe ook de teller 'millis()' op nul kunnen zetten. Ik lees echter dat je dat niet kan/mag.
Op zich geen probleem aangezien er pas na 49 (?) dagen een overflow is (indien unsigned long), en het maar 21 dagen moet lopen.
Ik ben in het verhaal niet mee hoe je dus een teller kan laten lopen die na 3600 seconden (of na 60s) gereset kan worden. Ik wil niet met delay's werken, want dan kan je in die periode niet sturen.
Of bestaat er naast micros() en millis() nog iets gelijkaadigs dat minuten of uren telt ?
Mvg
Diederik
a) zie blink without delay
b) google eens op arduino en timers
Stel je bakt een cake. Als deze in de oven gaat kijk je op de klok (millis()) en onthoudt de tijd (opslaan in een variabele). Vervolgens kijk je zo nu-en-dan op de klok (milis(), bv in het begin van loop()) en kijkt of de baktijd al is verlopen door de tijd dat de cake in de oven ging (die je hebt onthouden) af te trekken van de tijd dat je de laatste keer op de klok keek
Overflow is geen probleem zolang je aftrekt en niet optelt.
Ik ben er nog niet volledig aan uit, ook al heb ik er een nachtje over geslapen.
Stel, ik heb twee variabelen
vorigetijd en huidigetijd
ik begin met vorigetijd = 0
huidigetijd = millis()
als huidigetijd-vorigetijd > 3600
dan moet uur = uur + 1 en vorigetijd=huidige tijd.
Tot zover geen probleem en kan ik de redenering volgen.
Maar als millis() in overflow (?) gaat, dan begint die toch opnieuw van nul, en dan klopt bovenstaande loop toch niet meer, want dan zal de huidige tijd kleiner zijn dan vorigetijd ?
Het is dus voor mij niet duidelijk hoe alles in zijn werk gaat als men over de 'overflow' gaat.
De nauwkeurigheid van millis() zou wel eens kunnen tegenvallen voor het meten/aanduiden van lange periodes (in dit geval enkele weken).
Je kan in zo een geval beter gebruik maken van een real time clock (RTC), deze houdt datum/tijd bij en is veel nauwkeuriger dan de ingebouwde Arduino klok (millis()).
DS3231 + RTC bibliotheek zal het je gemakkelijker maken.
Het blijft natuurlijk belangrijk dat je met millis() kan werken omdat dit gewoon deel uitmaakt van de basiskennis om goed met Arduino te kunnen werken.
https://playground.arduino.cc/code/time
Succes!
Diedhert:
Het is dus voor mij niet duidelijk hoe alles in zijn werk gaat als men over de 'overflow' gaat.
Laten we het in het tientallig stelsel houden; uiteindelijk tellen de meeste mensen op die manier 
Teken een cirkel en verdeel de omtrek in 10 stappen.
Schrijf, met de klok mee, de nummers 0 tot 9 aan de binnenkant van de cirkel (0 op 12 uur positie).
Schrijf, met de klok mee, de nummers 0 tot 4 aan de buitenkant van de cirkel (0 op 12 uur positie).
Schrijf, tegen de klok in, de nummers 0 tot -5 aan de buitenkant van de cirkel (0 op 12 uur positie).

Als je gaat tellen zie je dat als je 10 bereikt je een overflow hebt.
Pak een positief nummer voor de laatste tijd; bv 7
Pak een positief nummer voor de huidige tijd dat kleiner is dan het vorige gekozen nummer; bv 3.
Trek van elkaar af (huidig - laatst), het resultaat (voor de mens) is -4.
Vindt -4 op de cirkel en kijk met welk positief getal dit overeenkomt. Dat is 6; is 6 groter (groter of gelijk) dan de tijd die je wilde wachten (bv 5)?
De reden dat dit werkt is that we met unsigned variabelen werken.