Van zomertijd naar de wintertijd.
12 berichten
• Pagina 1 van 2 • 1, 2
Van zomertijd naar de wintertijd.
Hallo allemaal,
In mijn, overigens goedwerkende programma, waarmee ik vloeistoffen doseer probeer ik de wintertijd in te voeren. Dat lukt niet. D.w.z. de tijd invoeren lukt maar na 5 minuten komt de zomertijd terug. Dit zou kloppen wanneer ik in de door mij gebruikte library kijk naar een example. (Overigens gebruik ik de Streaming.h libray niet) Dat example zal ik afdrukken en ook de tijd delen uit mijn programma. Deze library is gekozen omdat die samenwerkt met Timealarms.
In mijn setup staat dit:
In mijn loop dit:
De klok synchroniseert met de externe(?) RTC elke 5 minuten, wordt aangegeven in de library. Gaat daar mogelijk iets fout?
In mijn, overigens goedwerkende programma, waarmee ik vloeistoffen doseer probeer ik de wintertijd in te voeren. Dat lukt niet. D.w.z. de tijd invoeren lukt maar na 5 minuten komt de zomertijd terug. Dit zou kloppen wanneer ik in de door mij gebruikte library kijk naar een example. (Overigens gebruik ik de Streaming.h libray niet) Dat example zal ik afdrukken en ook de tijd delen uit mijn programma. Deze library is gekozen omdat die samenwerkt met Timealarms.
- Code: Alles selecteren
[code]
// Arduino DS3232RTC Library
// https://github.com/JChristensen/DS3232RTC
// Copyright (C) 2018 by Jack Christensen and licensed under
// GNU GPL v3.0, https://www.gnu.org/licenses/gpl.html
//
// Example sketch to display the date and time from a DS3231
// or DS3232 RTC every second. Display the temperature once per
// minute. (The DS3231 does a temperature conversion once every
// 64 seconds. This is also the default for the DS3232.)
//
// Set the date and time by entering the following on the Arduino
// serial monitor:
// year,month,day,hour,minute,second,
//
// Where
// year can be two or four digits,
// month is 1-12,
// day is 1-31,
// hour is 0-23, and
// minute and second are 0-59.
//
// Entering the final comma delimiter (after "second") will avoid a
// one-second timeout and will allow the RTC to be set more accurately.
//
// No validity checking is done, invalid values or incomplete syntax
// in the input will result in an incorrect RTC setting.
//
// Jack Christensen 08Aug2013
#include <DS3232RTC.h> // https://github.com/JChristensen/DS3232RTC
#include <Streaming.h> // http://arduiniana.org/libraries/streaming/
void setup()
{
Serial.begin(115200);
// setSyncProvider() causes the Time library to synchronize with the
// external RTC by calling RTC.get() every five minutes by default.
setSyncProvider(RTC.get);
Serial << F("RTC Sync");
if (timeStatus() != timeSet) Serial << F(" FAIL!");
Serial << endl;
}
void loop()
{
static time_t tLast;
time_t t;
tmElements_t tm;
// check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
if (Serial.available() >= 12) {
// note that the tmElements_t Year member is an offset from 1970,
// but the RTC wants the last two digits of the calendar year.
// use the convenience macros from the Time Library to do the conversions.
int y = Serial.parseInt();
if (y >= 100 && y < 1000)
Serial << F("Error: Year must be two digits or four digits!") << endl;
else {
if (y >= 1000)
tm.Year = CalendarYrToTm(y);
else // (y < 100)
tm.Year = y2kYearToTm(y);
tm.Month = Serial.parseInt();
tm.Day = Serial.parseInt();
tm.Hour = Serial.parseInt();
tm.Minute = Serial.parseInt();
tm.Second = Serial.parseInt();
t = makeTime(tm);
RTC.set(t); // use the time_t value to ensure correct weekday is set
setTime(t);
Serial << F("RTC set to: ");
printDateTime(t);
Serial << endl;
// dump any extraneous input
while (Serial.available() > 0) Serial.read();
}
}
t = now();
if (t != tLast) {
tLast = t;
printDateTime(t);
if (second(t) == 0) {
float c = RTC.temperature() / 4.;
float f = c * 9. / 5. + 32.;
Serial << F(" ") << c << F(" C ") << f << F(" F");
}
Serial << endl;
}
}
// print date and time to Serial
void printDateTime(time_t t)
{
printDate(t);
Serial << ' ';
printTime(t);
}
// print time to Serial
void printTime(time_t t)
{
printI00(hour(t), ':');
printI00(minute(t), ':');
printI00(second(t), ' ');
}
// print date to Serial
void printDate(time_t t)
{
printI00(day(t), 0);
Serial << monthShortStr(month(t)) << _DEC(year(t));
}
// Print an integer in "00" format (with leading zero),
// followed by a delimiter character to Serial.
// Input value assumed to be between 0 and 99.
void printI00(int val, char delim)
{
if (val < 10) Serial << '0';
Serial << _DEC(val);
if (delim > 0) Serial << delim;
return;
}
[/code]
In mijn setup staat dit:
- Code: Alles selecteren
void setup()
{
Wire.begin();
setSyncProvider(RTC.get); // Get the time from the RTC
if (timeStatus() != timeSet) {
Serial.println("Unable to sync with the RTC");
}
else {
Serial.println("RTC has set the system time");
}
//setTime(hour, minute, second, day, month, year)
setTime(12, 35, 45, 28, 10, 2018);
In mijn loop dit:
- Code: Alles selecteren
// Tijd en datum update
void digitalClockDisplay()
{
unsigned long huidigetijdMillis = millis();
if (huidigetijdMillis - tijdMillis > 1000)
{
char tijdString[9];
static char vorigeTijd[9];
sprintf(tijdString, "%02d:%02d:%02d", hour(), minute(), second());
if (strcmp(tijdString, vorigeTijd) != 0)
{
t0.setText (tijdString); //Tijd update
strcpy(vorigeTijd, tijdString); //Bewaar vorigeTijd voor de volgende vergelijking
}
char datumString[9];
static char vorigeDatum[9];
sprintf(datumString, "%02d:%02d:%02d", day(), month(), year());
if (strcmp(datumString, vorigeDatum) != 0)
{
t1.setText (datumString); //Datum update
strcpy(vorigeDatum, datumString); //Bewaar vorigeDatum voor de volgende vergelijking
}
tijdMillis = huidigetijdMillis;
}
De klok synchroniseert met de externe(?) RTC elke 5 minuten, wordt aangegeven in de library. Gaat daar mogelijk iets fout?
Advertisement
Re: Van zomertijd naar de wintertijd.
De tijd library die je gebruikt is bedoeld voor de PaulStoffregen TimeLib: https://github.com/PaulStoffregen/Time.
Dat begrijp ik echter niet helemaal, het lijkt alsof er verschillen zijn.
De TimeLib draait op millis() en eens per 5 minuten wordt dat gesynchroniseerd met de echte tijd van de RTC.
Wil je de tijd wijzigen, dan is het nodig om de tijd in de RTC te wijzigen.
Dat gaat met RTC.set(). Dat is de functie die de tijd in de RTC zet.
Die wordt meteen gevolgd door een setTime(), zodat ook de tijd die op millis() is gebaseerd alvast de nieuwe tijd heeft, en er niet 5 minuten gewacht hoeft te worden.
Bijvoorbeeld de maand ophogen. Dan verhoog ik de maand, en vul bij de andere dingen de huidige waarden in.
Deze code heb ik trouwens niet op deze manier. Volgens mij heb ik een andere setTime() functie.
Ik ververs daarna (bij iedere druk op een knop) ook nog de hele datum en tijd op het Nextion schermpje, zodat ik niet op de overgang van de volgende seconde hoef te wachten.
Daar is veel code voor nodig. Ik heb 12 knoppen om de tijd in te stellen (knoppen voor + en - bij: jaar, maand, dag, uur, minuut, seconde).
De Europese zomer/winter-tijd is te berekenen. Dus bij mij ging de tijd vannacht automatisch van 02:59:59 naar 02:00:00
Daarvoor heb ik de hele sketch aan moeten passen, omdat ik de basistijd niet wijzig. De sketch draait dus eigenlijk altijd op wintertijd. Overal waar ik de tijd laat zien, kijk ik of ik er één uur bij op moet tellen.
Dat begrijp ik echter niet helemaal, het lijkt alsof er verschillen zijn.
De TimeLib draait op millis() en eens per 5 minuten wordt dat gesynchroniseerd met de echte tijd van de RTC.
Wil je de tijd wijzigen, dan is het nodig om de tijd in de RTC te wijzigen.
Dat gaat met RTC.set(). Dat is de functie die de tijd in de RTC zet.
Die wordt meteen gevolgd door een setTime(), zodat ook de tijd die op millis() is gebaseerd alvast de nieuwe tijd heeft, en er niet 5 minuten gewacht hoeft te worden.
Bijvoorbeeld de maand ophogen. Dan verhoog ik de maand, en vul bij de andere dingen de huidige waarden in.
- Code: Alles selecteren
time_t t;
tmElements_t tm;
int maand = month()
maand++;
if( maand > 12)
maand = 1;
tm.Year = year();
tm.Month = maand; // deze is gewijdigd, de rest blijft zo.
tm.Day = day();
tm.Hour = hour();
tm.Minute = minute();
tm.Second = seconde();
t = makeTime(tm);
RTC.set(t); // write the new time into the RTC
setTime(t); // set new time for the library
Deze code heb ik trouwens niet op deze manier. Volgens mij heb ik een andere setTime() functie.
Ik ververs daarna (bij iedere druk op een knop) ook nog de hele datum en tijd op het Nextion schermpje, zodat ik niet op de overgang van de volgende seconde hoef te wachten.
Daar is veel code voor nodig. Ik heb 12 knoppen om de tijd in te stellen (knoppen voor + en - bij: jaar, maand, dag, uur, minuut, seconde).
De Europese zomer/winter-tijd is te berekenen. Dus bij mij ging de tijd vannacht automatisch van 02:59:59 naar 02:00:00
Daarvoor heb ik de hele sketch aan moeten passen, omdat ik de basistijd niet wijzig. De sketch draait dus eigenlijk altijd op wintertijd. Overal waar ik de tijd laat zien, kijk ik of ik er één uur bij op moet tellen.
Re: Van zomertijd naar de wintertijd.
Heel raar eigenlijk. Toen ik mijn programma voor de eerste keer installeerde werd dus zonder het onderstaande de RTC gezet. Dit werkte dus goed. Ik deed dit in de zomer en deze tijd werd ook getoond op mijn Nextion. Nu heb ik eens een lege schets in de Arduino gezet gevolgd door m'n doseerprogramma zodat het net als de eerste keer een nieuwe installatie was met het idee in het achterhoofd dat er dan met de nu geldende tijd gewerkt zou worden. Toch blijft er dan ergens de zomertijd hangen en dat begrijp ik niet. De RTC heb ik dan toch geleegd? De wintertijd staat overigens wel in het deel setTime(12, 35, 45, 28, 10, 2018); zoals ik dit invoerde. Dit kan ik controleren door de Arduino te resetten.
Maar om een uur terug te zetten zou ik dit moeten doen:
time_t t;
tmElements_t tm;
int uur = hour()
uur--;
if( uur > 24)
uur = 1;
tm.Year = year();
tm.Month = maand; tm.Day = day();
tm.Hour = hour(); // Wintertijd wijziging
tm.Minute = minute();
tm.Second = seconde();
t = makeTime(tm);
RTC.set(t); // write the new time into the RTC
setTime(t); // set new time for the library
Zo zet ik dit in de void loop(), is dit correct? Wanneer ik weer terug ga naar de zomertijd zou ik dit deel met /* */ uit kunnen schakelen?
Dank trouwens voor je snelle reactie!
Maar om een uur terug te zetten zou ik dit moeten doen:
time_t t;
tmElements_t tm;
int uur = hour()
uur--;
if( uur > 24)
uur = 1;
tm.Year = year();
tm.Month = maand; tm.Day = day();
tm.Hour = hour(); // Wintertijd wijziging
tm.Minute = minute();
tm.Second = seconde();
t = makeTime(tm);
RTC.set(t); // write the new time into the RTC
setTime(t); // set new time for the library
Zo zet ik dit in de void loop(), is dit correct? Wanneer ik weer terug ga naar de zomertijd zou ik dit deel met /* */ uit kunnen schakelen?
Dank trouwens voor je snelle reactie!
Re: Van zomertijd naar de wintertijd.
Zulke code doe ik dus 12 keer. Niet in de loop(), maar in de callback functie van Nextion, voor elk van de 12 knoppen.
En ik geef ook nog bij allemaal een piep met een luidsprekertje.
Volgens mij gaat het uur van 0 tot en met 23.
Dus de code voor de knop op het Nextion scherm om een uur te verlagen, heeft dit:
Waar wil je de zomer of wintertijd instellen? Eenmalig in de sketch ? Of met het Nextion scherm ? Met een gewone schakelaar kan ook, of met een commando via de seriële poort.
Ik krijg de indruk dat je een sketch wilt maken die eenmalig de tijd op wintertijd zet. Maar dan heb je weer andere sketch nodig om volgend jaar naar zomertijd te gaan.
En ik geef ook nog bij allemaal een piep met een luidsprekertje.
Volgens mij gaat het uur van 0 tot en met 23.
Dus de code voor de knop op het Nextion scherm om een uur te verlagen, heeft dit:
- Code: Alles selecteren
int uur = hour()
uur--;
if( uur < 0)
uur = 23;
Waar wil je de zomer of wintertijd instellen? Eenmalig in de sketch ? Of met het Nextion scherm ? Met een gewone schakelaar kan ook, of met een commando via de seriële poort.
Ik krijg de indruk dat je een sketch wilt maken die eenmalig de tijd op wintertijd zet. Maar dan heb je weer andere sketch nodig om volgend jaar naar zomertijd te gaan.
Re: Van zomertijd naar de wintertijd.
Een en ander is ook moeilijk uit te leggen. Daarom vind ik het altijd knap hoe je snel een probleem doorziet.
Maar ik heb een oplossing gevonden die heel simpel is. Vooraf, voor mij is het geen probleem om in de zomer en de winter even een nieuwe tijd in te voeren.
Deze regel heb ik nu tussen de /* */ gezet.
setSyncProvider(RTC.get); // Get the time from the RTC
Nu staat de wintertijd erin.
Dank je wel voor je geduld.
Maar ik heb een oplossing gevonden die heel simpel is. Vooraf, voor mij is het geen probleem om in de zomer en de winter even een nieuwe tijd in te voeren.
Deze regel heb ik nu tussen de /* */ gezet.
setSyncProvider(RTC.get); // Get the time from the RTC
Nu staat de wintertijd erin.
Dank je wel voor je geduld.
Re: Van zomertijd naar de wintertijd.
Dan gebruik je de RTC niet meer.
De TimeLib loopt op millis() en één keer per 5 minuten wordt de echte tijd van de RTC opgehaald en wordt de TimeLib op die tijd gezet. Dat bedoelen ze met synchroniseren. De "provider" (leverancier) van die synchronisatie is de RTC chip met de echte tijd.
Wanneer je de syncProvider niet gebruikt, dan gebruik je dus niet meer de echte tijd van de RTC.
De TimeLib loopt op millis() en één keer per 5 minuten wordt de echte tijd van de RTC opgehaald en wordt de TimeLib op die tijd gezet. Dat bedoelen ze met synchroniseren. De "provider" (leverancier) van die synchronisatie is de RTC chip met de echte tijd.
Wanneer je de syncProvider niet gebruikt, dan gebruik je dus niet meer de echte tijd van de RTC.
Re: Van zomertijd naar de wintertijd.
De RTC moet dus wel gebruikt worden. Even duidelijk maken wat ik wil. In, bijvoorbeeld, mijn Aquariumcomputer zet ik de juiste zomer of wintertijd er op de desbetreffende dag in met het regeltje rtc.adjust en het werkt. Zoiets wil ik dus ook hier. Niet met een schakelaar in de Nextion o.i.d. maar gewoon telkens eenmalig in de sketch.
Nu heb ik dus dit in de loop gezet met als gevolg dat alles op hol slaat.
Nu heb ik dus dit in de loop gezet met als gevolg dat alles op hol slaat.
- Code: Alles selecteren
// Tijd en datum update
void digitalClockDisplay()
{
time_t t; //alleen in de wintertijd gebruiken
tmElements_t tm;
int uur = hour();
uur--;
if(uur < 0)
uur = 23;
tm.Year = year();
tm.Month = month();
tm.Day = day();
tm.Hour = hour(); // Wintertijd wijziging
tm.Minute = minute();
tm.Second = second();
t = makeTime(tm);
RTC.set(t); // write the new time into the RTC
setTime(t); // set new time for the library //Tot hier alleen in de wintertijd gebruiken.
unsigned long huidigetijdMillis = millis();
if (huidigetijdMillis - tijdMillis > 1000)
{
char tijdString[9];
static char vorigeTijd[9];
sprintf(tijdString, "%02d:%02d:%02d", hour(), minute(), second());
if (strcmp(tijdString, vorigeTijd) != 0)
{
t0.setText (tijdString); //Tijd update
strcpy(vorigeTijd, tijdString); //Bewaar vorigeTijd voor de volgende vergelijking
}
char datumString[9];
static char vorigeDatum[9];
sprintf(datumString, "%02d:%02d:%02d", day(), month(), year());
if (strcmp(datumString, vorigeDatum) != 0)
{
t1.setText (datumString); //Datum update
strcpy(vorigeDatum, datumString); //Bewaar vorigeDatum voor de volgende vergelijking
}
tijdMillis = huidigetijdMillis;
}
}
Re: Van zomertijd naar de wintertijd.
Ik denk dat zoiets niet mogelijk is. Het is in ieder geval veel moeilijker dan gewoon iets om de zomertijd of wintertijd te kiezen.
Je kunt niet iedere keer bij setup() een uur terug gaan.
Je kunt ook niet bij iedere aanroep van digitalClockDisplay() een uur terug gaan.
In de code van digitalClockDisplay() zet je ook echt de tijd van de RTC met RTC.set(t). Dus iedere keer gaat de echte tijd een uur terug.
Toch is het nodig om de echte tijd van de RTC te blijven gebruiken, met de RTC als synchronisatie provider. Dus dan heb je toch een knop of een commando nodig om eenmalig een uur terug of vooruit te gaan.
Je kunt niet iedere keer bij setup() een uur terug gaan.
Je kunt ook niet bij iedere aanroep van digitalClockDisplay() een uur terug gaan.
In de code van digitalClockDisplay() zet je ook echt de tijd van de RTC met RTC.set(t). Dus iedere keer gaat de echte tijd een uur terug.
Toch is het nodig om de echte tijd van de RTC te blijven gebruiken, met de RTC als synchronisatie provider. Dus dan heb je toch een knop of een commando nodig om eenmalig een uur terug of vooruit te gaan.
Re: Van zomertijd naar de wintertijd.
Inmiddels is het probleem veel groter geworden, helaas!
De aanvankelijk op de wintertijd goed draaiende sketch is nu ook die tijd kwijt, er komt nu een onzintijd tevoorschijn. Ik ben het nu eigenlijk helemaal kwijt. Hoe zou ik de hele boel kunnen resetten om van daaruit aan een goede oplossing te werken? Op youtube zag ik een filmpje waarin de klok d.m.v. de Serial monitor ingesteld wordt. Ze gebruiken daarbij de Library die ik ook gebruik.
https://www.youtube.com/watch?v=Z-66x-9-7T0
Zou dit een mogelijkheid zijn om in ieder geval een tijd in het apparaat te krijgen?
De aanvankelijk op de wintertijd goed draaiende sketch is nu ook die tijd kwijt, er komt nu een onzintijd tevoorschijn. Ik ben het nu eigenlijk helemaal kwijt. Hoe zou ik de hele boel kunnen resetten om van daaruit aan een goede oplossing te werken? Op youtube zag ik een filmpje waarin de klok d.m.v. de Serial monitor ingesteld wordt. Ze gebruiken daarbij de Library die ik ook gebruik.
https://www.youtube.com/watch?v=Z-66x-9-7T0
Zou dit een mogelijkheid zijn om in ieder geval een tijd in het apparaat te krijgen?
Re: Van zomertijd naar de wintertijd.
zoek naar timezone van jChristensen
paul deelen
shooter@home.nl
shooter@home.nl
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten