tijd vergelijken probleempje

Arduino specifieke Software
Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

tijd vergelijken probleempje

Berichtdoor PeterZ » 03 Mei 2017, 11:25

Beste allemaal,

Mijn naam is Peter en wat erg nieuw met Arduino.
Visualbasic een redelijke goede kennis van, ook van elektronica analoog/digitaal hf.
C++ is dus even wat lastiger, maar kan redelijk uit de voeten met voorbeelden.

Probleempje.
Omdat we nu een xp pc hebben draaien met VB programma(8 jaar geleden gemaakt) en die alles in de gaten houd, wil ik dit terug brengen naar een Arduino (in dit geval een Mega2560).

Waar ik mee zit.
Ik kom er niet uit om een vergelijking te maken tussen 2 tijden waarin iets moet gebeuren.

Doelstelling is:
Er word om 21:10uur een output hoog gemaakt en deze gaat omlaag om 03:15uur (tijden zijn variabele).
(Soms is het ook om 10:00uur aan en om 13:00uur weer uit)
Omdat er wel eens wat uitvalt moet er eerst gekeken worden of de output hoog of laag moet zijn.
Dit doen ik in VB redelijk simpel met de Datetimepicker.. maar in Arduino taal is het even anders.

Dillema is dat ik dag & nacht blijkbaar niet simpel kan afhandelen.

Dus, de Aduino valt uit en bij aanzetten moet er eerst gekeken worden naar de tijd waarin de Output laag of hoog moet zijn.

De code waar ik vast loop is de 2 if statements.
cpp code
if (hour() == e_uur && minute() >= e_minuut || hour() > e_uur && hour() <= e_uur2 ){
Serial.println("Output High");
}
if (hour() == e_uur2 && minute() >= e_minuut2 || hour() > e_uur2 && hour() < e_uur){
Serial.println("Output LOW");
}


Sketch is van TimeAlarmExample waar ik mee aan het stoeien ben.

Heb even geen idee hoe ik dat moet aanpakken om die tijd vergelijking te maken vanwege dag en nacht :oops:

cpp code
#include <TimeLib.h>
#include <TimeAlarms.h>

AlarmId id;

// variable start/stop time
int e_uur, e_uur2, e_minuut, e_minuut2;


void setup() {
Serial.begin(9600);
while (!Serial) ; // wait for Arduino Serial Monitor

// Change time
setTime(23,29,50,5,3,17); // set time to Wednesday 23:29:50 Mei 3 2017

// create timers, to trigger relative to when they're created
id = Alarm.timerRepeat(2, Repeats2); // timer for every 2 seconds

// Temp varable for testing
e_uur = 21;
e_minuut = 15;
e_uur2 = 23;
e_minuut2 = 30;
}

void loop() {
digitalClockDisplay();
Alarm.delay(1000); // wait one second between clock display
}

// functions to be called when an alarm triggers:

// For test. look for time between given time
void Repeats2() {
Serial.println("2 second timer");
if (hour() >= 0 && hour() <= 6){
Serial.println("Midnight");
}
if (hour() == e_uur && minute() >= e_minuut || hour() > e_uur && hour() <= e_uur2 ){
Serial.println("Output High");
}
if (hour() == e_uur2 && minute() >= e_minuut2 || hour() > e_uur2 && hour() < e_uur){
Serial.println("Output LOW");
}
}


void digitalClockDisplay() {
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}

void printDigits(int digits) {
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijd vergelijken probleempje

Berichtdoor Koepel » 03 Mei 2017, 12:27

Hallo,
Wanneer je al kunt programmeren, dan lukt het wel. De 'c++' objecten en wat je daar allemaal mee kunt uithalen, dat is niet meteen nodig om te weten.

Ik loop het stapsgewijs door:

Een Arduino Mega 2560 ? Dat is intussen een beetje oud. Het hangt er van af wat je allemaal er mee wilt gaan doen. De Arduino Due met Ethernet Shield 2 is een goede combinatie. Een Arduino Zero (of andere M0+ processor) is ook een prima keus. Volgens mij hebben de Due en de M0+ processors al een RTC clock ingebouwd (dat weet ik niet zeker). Als je al een Arduino Mega 2560 hebt, koop dan zo snel mogelijk een I2C level shifter om 3.3V sensors aan te kunnen sluiten.
Een Arduino is goed om sensors aan te sluiten, een Raspberry Pi is goed om internet dingen mee te doen.

Een Arduino Uno is altijd handig om dingen uit te proberen. Prijs: 2.70 € : https://www.aliexpress.com/item/Free-sh ... 25607.html

Heb je de originele TimeLib en TimeAlarms ? Ze staan volgens mij in de Library Manager in de Arduino IDE. Dit is de pagina er over: https://www.pjrc.com/teensy/td_libs_Time.html.

De naam "TimeAlarms" is misschien misleidend, het is een bibliotheek om op bepaalde tijden iets doen. Een instelbare tijdklok dus.

De TimeLib werkt met een RTC clock. De TimeLib draait op de nauwkeurigheid van het 16MHz X-tal op het Arduino board, en af en toe wordt de tijd weer goed gezet met iets dat de juiste tijd geeft. Dat is meestal een RTC chip, maar kan ook een internet NTP call zijn. De functie 'setSyncProvider' is er om de tijd weer goed te zetten.

Loopt jouw tijd gewoon los, op het 16MHz X-tal ?
Dan kun je de tijd van de compiler (het moment dat je sketch is gecompileerd) gebruiken om de tijd van TimeLib goed te zetten. Dus bij het uploaden heeft de Arduino dan meteen de juiste tijd.

De TimeAlarms roept op bepaalde tijden een functie aan. Als er een lamp aan gaan om 9 uur en uit om 12 uur, en je zet de Arduino aan om 10 uur, dan heb je pech. Dan zul je zelf moeten uitzoeken of die lamp aangezet moet worden.
Doe dat in setup(), het hoort niet in de loop().
Dus eenmalig tijdens het opstarten in setup() kijken hoe laat het is, en alles goed zetten. Kijken hoe laat het is gaat inderdaad met hour() en minute() en if-statements.
Alle vaste alarm-tijden eenmalig in setup() instellen.
Daarna de callback functies gebruiken om de aktie te doen. De 'callback' functies zijn jouw functies die door de TimeAlarms op die bepaalde tijd wordt aangeroepen.

De combinatie van TimeLib en TimeAlarms is om te voorkomen dat je iedere twee seconden zou moeten kijken hoe laat het is. Dat heb jij wel, maar ik weet niet precies waarom.

Wil je een alarm dat bijvoorbeeld een toeter twee seconden aan zet, en dan twee seconden uit en dat herhalend? Dat is meer iets voor millis().

Een software timer in je sketch kan ook met millis(). Iets dat typisch is voor het gebruik van millis() is bijvoorbeeld: drie keer per seconde een LCD scherm updaten, iedere twee seconden een sensor lezen, ieder uur iets wegschrijven naar een SD kaartje, enzovoorts.

Nou, genoeg om even op te kauwen dacht ik zo ;)

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 03 Mei 2017, 14:06

Hallo Koepel,

bedankt, dat is weer een mooie uitleg.

Ja, de Mega2560 heb ik er nog 10 van liggen, ooit eens willen beginnen maar het kwam er niet echt van, hiernaast even druk bezig geweest met de ESP82xx dev modules(dat lukt aardig.. en als er maar geen Tijd vergelijking in moet dan :D ).
Ben me bewust van de 3.3volt en 5volt.. torretje en paar weerstanden gebruik ik ervoor om levelshifter te maken wanneer ik de pcb moet maken.
Jaren terug de pcb's zelf gemaakt, maar tegenwoordig is laten maken sneller en goedkoper en vooral schoner.

Maar om even terug te komen, TimeLib en TimeAlarms, deze zijn origineel.
Paar weken terug alles opnieuw geinstalleerd vanwege ook de vernieuwde Arduino versie(had wel een hele oude nog erop staan).

ja de tijd loopt nu nog los, en heb de RTC ic al liggen (DS1302 als ik het goed heb.. ook een oudje).
Netwerk heb ik niet daar, wel gsm, maar dat is latere zorg om die te koppelen voor tijd sync.
Mijn punt is hoe ik die if statement moet opbouwen, dit omdat ik en met Uur en met Minuten zit wat juist wel of juist niet in hetzelfde dag gebeurt.

De trigger (om de 2 seconden) gebruik ik om te zien wat er gebeurt als de tijd op de gegeven stoptijd komt en dat de Output laag moet worden.
Is alleen maar om te testen en zien wat er gebeurt.

In de 2seconde loop heb ik het nu idd staan(anders moet ik telkens op reset knopje drukken), dit zal straks als het werkt in eenmalige aanroep komen wanneer de Arduino opgestart wordt.


heb ook al zitten denken om de huidige toestand naar eeprom weg te schrijven, maar als de Arduino pas na een half uur wordt aangezet en storing trad op om 3:15uur, dan staat de output hoog tot de volgende tijd passeert dat hij werkelijk hoog moet zijn.. lastig dus.

kwartje wil bij mij blijkbaar niet vallen.. loop echt vast.. misschien nog paar kopjes koffie halen en de sterkte wat hoger zetten

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijd vergelijken probleempje

Berichtdoor Koepel » 03 Mei 2017, 14:26

Mijn frank/euro/kwartje is ook nog niet gevallen, ik begrijp nog steeds niet waarom je iedere twee seconden gaat testen. Daarom zie ik het nog niet, en weet ik dus ook niet hoe het op te lossen is :(
Heeft het te maken dat de 'zet aan' en 'zet uit' tijd variëren ? Kun je vertellen waarom die variëren ?
Op welk moment weet je wat de juiste tijden zijn ?
Je kunt in de loop() naar een knop kijken.
Is die twee seconden timer alleen maar voor de status naar de seriele monitor te sturen ? Maar de melding dat de pin hoog of laag is, dat staat los van de rest van de code wanneer de pin echt hoog of laag wordt. Wil je dat bijhouden, bewaar dan de de status in een variabele.

Een (rare) oplossing zou kunnen zijn om twee vaste TimeAlarms te zetten, en als die tijd verschuift, om dan de verschuiving met millis() te doen.

De TimeAlarms werkt zo: Je zet een alarm op 9 uur om een lamp aan te zetten, en je zet een tweede alarm om de lamp om 12 uur uit te zetten. Dan zijn er dus twee callback functies. Er is daarvoor geen code in de loop() nodig en het is niet nodig om steeds naar de tijd te kijken.

Ugh! alsjeblieft geen DS1302 of DS1307. De DS1302 is een ramp en de DS1307 is achterhaald.
Koop maar een DS3231, die is veel nauwkeuriger en heeft het X-tal ingebouwd. Dan zijn er ook geen problemen dat het X-tal stuk is of dat de klok niet wil lopen.

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 03 Mei 2017, 15:57

haha, dank Koepel,

Paar dagen staat de tijd ingesteld als volgt:
Start tijd: 21:10uur
Stop tijd: 3:15uur

(dit kan veranderen en gebeurt via de seriële interface gekoppeld aan de machine die we handmatig instellen op tijden (daar zit een bordje in met een 80c552 erop, die heb ik met machine code ooit geprogrammeerd in mijn wilde jaren).

Nu moet ik een vergelijking maken of de Output wel hoog of juist laag moet zijn na spanningsuitval, want als het aan moest gaan om 21:10uur en de machine met arduino start pas om 22:00uur dan is de trigger al voorbij en de machine blijft uit.
(gaat in dit geval om een drainagepomp)

Code wat ik hier heb is alleen de test op time, de loop is alleen om te zien wat er gebeurt via de seriële uitgang en wat ik dan op afstand kan benaderen.


Denk dat ik eerst onderscheid moet maken in welke dagdeel de stop tijd zit, dit om te bepalen of ik verder moet kijken...

Dit heb ik dan zo bedacht
Code: Alles selecteren
 if (e_uur2 >= 0 && e_uur2 < e_uur){
  U2Time = 1;                           // Stop Time is next day
   Serial.println("After or on Night stop time");
 } else {
  U2Time = 0;                           // Stop time is Today
     Serial.println("Day stop time");
 }


nu nog de rest.. stiekem ook aan het zoeken of er geen soort van vbbasic is voor Arduino (vond wel een Template voor Mikrobasic.. maar met de PIC's loop ik niet zo snel mee weg omdat ze beetje gevoelig zijn voor spikes)


edit:
ja weet het van de DS types.. maar een tijdverschil van meer dan 10 minuten per week zal de Arduino met de oude RTC chip niet doen, i hope.. anders moet ik opschieten met de gsm koppeling:)

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijd vergelijken probleempje

Berichtdoor Koepel » 03 Mei 2017, 17:49

Als je maar niet met de DS1302 aan de slag gaat, zoals ik al zei: "De DS1302 is een ramp".

Intussen weet ik waar de verwarring onder andere vandaan kwam. Je schreef bij je eerste vraag dat bij het opstarten naar de tijd gekeken wordt, en je liet code zien die je niet in setup() maar in de loop() uitvoerde.
Toch zie ik het nog niet voor me hoe het er uit zal gaan zien.

Met apart de uren, minuten en seconden uitwerken, dat kan wel.
Wanneer echter de stop-tijd soms voor en soms na 24:00 zit, dan wordt het omslachtig.
Een tijd vergelijken wordt vaak met seconden gedaan. Dat is dan het aantal seconden sinds 1970.

Kijk eens naar "TimeLib.h" zelf: https://github.com/PaulStoffregen/Time/blob/master/TimeLib.h
Je kunt de seconden vanaf 24:00 opvragen: elapsedSecsToday().
Op die manier zou het mogelijk moeten zijn, om met de seconden te rekenen en vergelijken.

Ik heb nog heel wat vragen. Wanneer de Arduino de start-tijd en stop-tijd binnen krijgt, worden die dan opgeslagen in EEPROM ? Zodat de Arduino bij het opnieuw aanzetten de tijden nog weet. Of gaat de Arduino het zelf opvragen bij 80C552 ? En wat als de 80C552 even uit valt.
Is het onderliggende probleem misschien een synchronisatie probleem ? Mijn gevoel zegt dat er nog ergens een denkfout zit met de TimeAlarms, het opstarten, en de tijden.

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 03 Mei 2017, 19:05

Koepel schreef:Als je maar niet met de DS1302 aan de slag gaat, zoals ik al zei: "De DS1302 is een ramp".

Oke, heb die nu wel aan de gang en batt erbij geplakt met kristalletje :oops:
maar loop daar al met time sync probleem, die gaat voorlopig dan even in de koelkast(

Koepel schreef:Intussen weet ik waar de verwarring onder andere vandaan kwam. Je schreef bij je eerste vraag dat bij het opstarten naar de tijd gekeken wordt, en je liet code zien die je niet in setup() maar in de loop() uitvoerde.
Toch zie ik het nog niet voor me hoe het er uit zal gaan zien.

oh, ja ben zelf met teveel bezig, had het er even duidelijker neer moeten zetten dat het alleen om wat test code gaat en voornamelijk tijdverschil.

Koepel schreef:Met apart de uren, minuten en seconden uitwerken, dat kan wel.
Wanneer echter de stop-tijd soms voor en soms na 24:00 zit, dan wordt het omslachtig.
Een tijd vergelijken wordt vaak met seconden gedaan. Dat is dan het aantal seconden sinds 1970.

ja klopt, dezelfde dag met start en stop tijd is het nog te behappen, maar zit met de volgende dag dat hij moet starten/stoppen wanneer uitval is geweest.

Koepel schreef:Kijk eens naar "TimeLib.h" zelf: https://github.com/PaulStoffregen/Time/blob/master/TimeLib.h
Je kunt de seconden vanaf 24:00 opvragen: elapsedSecsToday().
Op die manier zou het mogelijk moeten zijn, om met de seconden te rekenen en vergelijken.

Ben die ook aan het doornemen, maar brengt me nog niet verder met de "if tijd nu en kijk of de aan tijd nog actueel is"

Koepel schreef:Ik heb nog heel wat vragen. Wanneer de Arduino de start-tijd en stop-tijd binnen krijgt, worden die dan opgeslagen in EEPROM ? Zodat de Arduino bij het opnieuw aanzetten de tijden nog weet. Of gaat de Arduino het zelf opvragen bij 80C552 ? En wat als de 80C552 even uit valt.
Is het onderliggende probleem misschien een synchronisatie probleem ? Mijn gevoel zegt dat er nog ergens een denkfout zit met de TimeAlarms, het opstarten, en de tijden.

Ja, de start en stop tijd worden opgeslagen in EEPROM.
Oude bordje met de c552 heeft nog geen hickups vertoont ondanks vele uitval van de aggregaat die alles voed, heeft me wel veel reparaties aan een ALL-07 programmer gekost toen, dat staat me wel bij..

Alles kan werken(heb dan nog niet alles af) maar die opstart en dan kijken of de output laag/hoog moet zijn binnen het tijdsblok lukt me dus niet.
De trigger dat de Output hoog moet zijn op ingestelde tijd zit erin, de trigger dat de Output laag moet zijn op ingestelde tijd zit er ook in, dus kan wel verder met de rest, maar wil me behoeden op het ongemak dat de machine uit of aan was.
Ding moet x aantal liters afvoeren en doet hij in een x bepaalde tijd met een marge van 1,5uur (lijkt lang maar valt mee, meting is ook een schatting en zit marges op).

Maar hoe kijk je nu het beste naar die 2 tijden dat de Output laag of hoog moet zijn?

(Brengt me wel weer verder om te kijken om het in 2 blokken op te delen (dag1 en dag2), dus eerst kijken of het dezelfde dag is waar de stop tijd zit, en zo niet, dan zit de stop tijd in de 2de dag.)

Lastig dingetje dus :oops:

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: tijd vergelijken probleempje

Berichtdoor nicoverduin » 03 Mei 2017, 19:54

Of je gaat gebruik maken van de unix tijd. Dat is een getal afgeleid van de dtum-tijd vanaf 1-1-1970. Dan maakt het niet meer uit of je een overgang hebt om middernacht
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 19
Geregistreerd: 03 Mei 2017, 09:18
Woonplaats: Almere

Re: tijd vergelijken probleempje

Berichtdoor PeterZ » 03 Mei 2017, 21:03

nicoverduin schreef:Of je gaat gebruik maken van de unix tijd. Dat is een getal afgeleid van de dtum-tijd vanaf 1-1-1970. Dan maakt het niet meer uit of je een overgang hebt om middernacht

Hallo Nico,

Dat kwam ik al eerder tegen en Koepel had het er ook over..

Dus kijken wat de unix tijd is van starttijd (Start uur en start minuut) en dat getal onthouden en het zelfde voor de Stoptijd en dan tot slot kijken of ik tussen start en stop tijd zit met huidige unix Arduino tijd..
klinkt logisch.

vraag me alleen af hoe ik dan die startuur en startminuten en de conversie moet doen met Aduino time.. gaan me nu wel een dummy voelen

Je zou haast verwachten dat meerdere zoiets gemaakt hebben, je wil als je lampje aangaat om een bepaalde tijd dat lampje ook weer aangaat als er een stroomstoring is geweest(komt niet vaak voor natuurlijk, maar toch :D ).

Misschien dat ik beter kan kiezen voor een soort van UPS voor de Mega, dacht het wel even op te lossen met software..
Kan zijn dat ik te oud begin te worden voor die nieuwe dingen :D

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: tijd vergelijken probleempje

Berichtdoor Koepel » 04 Mei 2017, 05:53

Het is wel degelijk even op te lossen in software, en meerdere mensen hebben ook zoiets gemaakt.

Het probleem is dat ik je project moeilijk kon voorstellen. Alsof je vraagt hoe je een gerecht moet maken, terwijl de ingrediënten in een doos zitten en ik van een paar meter afstand mag ruiken wat de ingrediënten zijn :lol:

Ik zou bijvoorbeeld ook graag willen weten hoe vaak en in welk formaat de tijden binnen komen.
Doordat de tijd vóór en ná de 24:00 kan liggen, kom je automatisch uit bij de basis van de tijd, en dat is het aantal seconden sinds 1970.

De unix tijd of 'epoch' of aantal seconden sinds 1970 is nu juist niet het uur en de minuut zoals je schrijft. Het is het aantal seconden sinds 1970.

Nico is duidelijk en vergelijken met de unix tijd is eenvoudig zoals jij schrijft. Dus met die twee dingen zie ik uit de dichte mist de contouren van iets verschijnen. Dit is wat ik zie:

Wanneer de tijden binnen komen, dan de tijden omzetten naar seconden sinds 1970. Dat gaat met makeTime(). Het vullen van de structure zie je in setTime() https://github.com/PaulStoffregen/Time/blob/master/Time.cpp. De 'Wday' mag je overslaan, die wordt niet gebruikt. Dan krijg je dus twee 'time_t' variabelen (dat is gewoon een 32-bit unsigned long).
Dan twee singleshot AlarmOnce TimeAlarms zetten (dat kan met 'time_t' of met losse variabelen voor de uren, minuten, enzovoorts).
Die beide 'time_t' tijden ook opslaan in EEPROM. Bij voorkeur met een checksum, want de Arduino zou kunnen uitvallen tijdens het schrijven naar EEPROM.

Wanneer de Arduino wordt aangezet, dan de huidige tijd omzetten naar het aantal seconden sinds 1970 en de twee opgeslagen tijden ophalen uit de EEPROM. Dan kun je die eenvoudig vergelijken. Ondanks dat het 'time_t' variabelen zijn, zijn het gewoon 32-bit getallen die je kunt vergelijken.

Afhankelijk van het formaat van de tijd die binnenkomt van de 80C552, zou ik een functie maken die als parameters de tijden als losse getallen heeft en die ze omzet naar 'time_t'. Vervolgens zou ik diezelfde functie gebruiken bij het aanzetten van de Arduino.

Het grote voordeel is dat de Arduino nu ook meer dan een dag kan uit staan, want je weet tot op de seconde precies de datum en tijd van de verschillende tijden.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 20 gasten