Van zomertijd naar de wintertijd.

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Van zomertijd naar de wintertijd.

Berichtdoor benvo » 28 Okt 2018, 14:13

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.


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

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

Re: Van zomertijd naar de wintertijd.

Berichtdoor Koepel » 28 Okt 2018, 18:15

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.
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 :geek:
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.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Van zomertijd naar de wintertijd.

Berichtdoor benvo » 28 Okt 2018, 18:58

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!

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

Re: Van zomertijd naar de wintertijd.

Berichtdoor Koepel » 28 Okt 2018, 19:18

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:
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.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Van zomertijd naar de wintertijd.

Berichtdoor benvo » 28 Okt 2018, 20:00

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.

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

Re: Van zomertijd naar de wintertijd.

Berichtdoor Koepel » 28 Okt 2018, 20:06

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.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Van zomertijd naar de wintertijd.

Berichtdoor benvo » 28 Okt 2018, 21:08

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.

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;
  }
}



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

Re: Van zomertijd naar de wintertijd.

Berichtdoor Koepel » 28 Okt 2018, 23:12

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.

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: Van zomertijd naar de wintertijd.

Berichtdoor benvo » 28 Okt 2018, 23:29

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?

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Van zomertijd naar de wintertijd.

Berichtdoor shooter » 29 Okt 2018, 00:08

zoek naar timezone van jChristensen
paul deelen
shooter@home.nl

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten