DS3231 Sommerzeit

Aloa,

Ja ich weis es gibt genug Topics zu diesem Thema aber (jetzt bitte weiterlesen)

Vorneweg:
Ich bin kein Programmierer oder hab sonst irgendwie groß Ahnung davon.

Ich habe es geschafft ein Programm zu schreiben das mir die Uhrzeit auf einem Display anzeigt

Sketch:

#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3
#define DHTTYPE DHT11
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <DS3231.h>
#include <LiquidCrystal.h> 
DHT dht(DHTPIN, DHTTYPE);
int checkDHT11(void);

DS3231  rtc(SDA, SCL);
LiquidCrystal lcd(1, 2, 5, 6, 7, 8); //Aktiviert die Kanäle für das Display. Parameter: (rs, enable, d4, d5, d6, d7) 
void setup() {
 lcd.begin(16,2);               //Aktiviert das Display und legt die Größe des LC´s fest
 rtc.begin();                   //Aktiviert das Uhrmodul
}
void loop() {
 lcd.setCursor(5,0);            //Plaziert Cursor auf Feld 5 Reihe 0 ( 1 )
 //lcd.print("Zeit:");          //Ausgabe "Zeit:" - Derzeit ausgeblendet!
 lcd.print(rtc.getTimeStr());   //Anzeige Uhrzeit
 lcd.setCursor(10,0);           //Plaziert Cursor auf Feld 10 Reihe 0 ( 1 )
 lcd.print("   ");              //Ausgabe von Leerzeichen zum Überschreiben von Kommastellen der Uhr - Sekunden werden ausgeblendet
 delay(1000);                   //Aktualisierungsintervall 1 Sek. (1000 = 1 Sek.)
  
 int h = dht.readHumidity();
 lcd.setCursor(3,1);            //Plaziert Cursor auf Feld 3 Reihe 1 ( 2 )
 lcd.print(h);                  //Anzeige für Luftfeuchtigkeit
 lcd.print("%");                //Ausgabe %
 lcd.setCursor(9,1);            //Plaziert Cursor auf Feld 9 Reihe 1 ( 2 )
 lcd.print(rtc.getTemp());      //Anzeige Temperatur
 lcd.setCursor(11,1);           //Plaziert Cursor auf Feld 11 Reihe 1 ( 2 )
 lcd.print("\xDF");             //Zeigt ° an (Grad Celsius)
 lcd.print("C  ");              //Zeigt "C" mit Leerzeichen an, zum Überschreiben der Kommastellen der Temperatur
 delay(10000);                  //Aktualisierungsintervall 10 Sek. (1000 = 1 Sek.)
}

Allerdings bekomme ich es nicht hin da eine Sommerzeit rein zu prügeln... Schon zig Themen gelesen wo es um das DS3231 Modul geht oder auch um andere.
Ich verstehe einfach nicht wo ich den Code rein kopieren muss damit er mir im Sommer +1 bei den Stunden rechnet.

Meine Librarie ist die DS32331 von Arduino. Inhalt meiner DS3231.h

/*
  DS3231.cpp - Arduino/chipKit library support for the DS3231 I2C Real-Time Clock
  Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
  
  This library has been made to easily interface and use the DS3231 RTC with
  an Arduino or chipKit.

  You can find the latest version of the library at 
  http://www.RinkyDinkElectronics.com/

  This library is free software; you can redistribute it and/or
  modify it under the terms of the CC BY-NC-SA 3.0 license.
  Please see the included documents for further information.

  Commercial use of this library requires you to buy a license that
  will allow commercial use. This includes using the library,
  modified or not, as a tool to sell products.

  The license applies to all part of the library including the 
  examples and tools supplied with the library.
*/
#ifndef DS3231_h
#define DS3231_h

#if defined(__AVR__)
 #include "Arduino.h"
 #include "hardware/avr/HW_AVR_defines.h"
#elif defined(__PIC32MX__)
 #include "WProgram.h"
 #include "hardware/pic32/HW_PIC32_defines.h"
#elif defined(__arm__)
 #include "Arduino.h"
 #include "hardware/arm/HW_ARM_defines.h"
#endif

#define DS3231_ADDR_R 0xD1
#define DS3231_ADDR_W 0xD0
#define DS3231_ADDR 0x68

#define FORMAT_SHORT 1
#define FORMAT_LONG 2

#define FORMAT_LITTLEENDIAN 1
#define FORMAT_BIGENDIAN 2
#define FORMAT_MIDDLEENDIAN 3

#define MONDAY 1
#define TUESDAY 2
#define WEDNESDAY 3
#define THURSDAY 4
#define FRIDAY 5
#define SATURDAY 6
#define SUNDAY 7

#define SQW_RATE_1 0
#define SQW_RATE_1K 1
#define SQW_RATE_4K 2
#define SQW_RATE_8K 3

#define OUTPUT_SQW 0
#define OUTPUT_INT 1

class Time
{
public:
 uint8_t hour;
 uint8_t min;
 uint8_t sec;
 uint8_t date;
 uint8_t mon;
 uint16_t year;
 uint8_t dow;

 Time();
};

class DS3231
{
 public:
 DS3231(uint8_t data_pin, uint8_t sclk_pin);
 void begin();
 Time getTime();
 void setTime(uint8_t hour, uint8_t min, uint8_t sec);
 void setDate(uint8_t date, uint8_t mon, uint16_t year);
 void setDOW();
 void setDOW(uint8_t dow);

 char *getTimeStr(uint8_t format=FORMAT_LONG);
 char *getDateStr(uint8_t slformat=FORMAT_LONG, uint8_t eformat=FORMAT_LITTLEENDIAN, char divider='.');
 char *getDOWStr(uint8_t format=FORMAT_LONG);
 char *getMonthStr(uint8_t format=FORMAT_LONG);
 long getUnixTime(Time t);

 void enable32KHz(bool enable);
 void setOutput(byte enable);
 void setSQWRate(int rate);
 float getTemp();

 private:
 uint8_t _scl_pin;
 uint8_t _sda_pin;
 uint8_t _burstArray[7];
 boolean _use_hw;

 void _sendStart(byte addr);
 void _sendStop();
 void _sendAck();
 void _sendNack();
 void _waitForAck();
 uint8_t _readByte();
 void _writeByte(uint8_t value);
 void _burstRead();
 uint8_t _readRegister(uint8_t reg);
 void _writeRegister(uint8_t reg, uint8_t value);
 uint8_t _decode(uint8_t value);
 uint8_t _decodeH(uint8_t value);
 uint8_t _decodeY(uint8_t value);
 uint8_t _encode(uint8_t vaule);
#if defined(__arm__)
 Twi *twi;
#endif
};
#endif

Vorab schonmal Danke für eure Unterstützung.

Gelesen habe ich u.a:
https://forum.arduino.cc/index.php?topic=228063.15
http://forum.arduino.cc/index.php?topic=154768.msg1163549#msg1163549

LG
Ramset

Ich sehe mir das gern an....aber zuvor bitte den Sketch in Code-Tags setzen.
Dann kann ich den auch im mobilen Gerät lesen.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar, auch mobile Geräte.

Habe es komplett neu geschrieben,

LG

Ramset:
Habe es komplett neu geschrieben,

Was geschrieben ?

Aber ok....jetzt kann ich es lesen.

Was sollen die langen delay() im Sketch.
Die solltest du entfernen.

Die Sommerzeit musst du der aktuellen Stunde hinzuzählen, wenn die Sommerzeit "true" ist.

Das mache ich hiermit und funktioniert seit Jahren:

// Sommerzeit holen
void check_SummerTime()
{
  isSummer = summertime_EU(year(), month(), day(), hour(), 1);
}


// Sommerzeit rechnen
//-------- utility code from jurs ----------
boolean summertime_EU(int year, byte month, byte day, byte hour, byte tzHours)
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
// input parameters: "normal time" for year, month, day, hour and tzHours (0=UTC, 1=MEZ)
// return value: returns true during Daylight Saving Time, false otherwise
{
  if (month < 3 || month > 10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
  if (month > 3 && month < 10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
  if (month == 3 && (hour + 24 * day) >= (1 + tzHours + 24 * (31 - (5 * year / 4 + 4) % 7)) || month == 10 && (hour + 24 * day) < (1 + tzHours + 24 * (31 - (5 * year / 4 + 1) % 7)))
    return true;
  else
    return false;
}

Danke für den Code, richtig lieb aberrrrrrr genau das ist mein Problem... wo stecke ich den jetzt hin? In den Sketch? in die Librarie?

Ich habe den Thread umformuliert da mir die erste Version zu affig vorkam. ^^ (war reine Verzweiflung)

LG

Edit:
Die langen Delays? Habe irgendwo gelesen das wenn man das so macht das den Chip entlastet und wohl flimmern am LCD verhindert?!?

Ramset:
Hallo Dieter,

Danke für den Code, richtig lieb aberrrrrrr genau das ist mein Problem... wo stecke ich den jetzt hin? In den Sketch? in die Librarie?

Ich habe den Thread umformuliert da mir die erste Version zu affig vorkam. ^^ (war reine Verzweiflung)

LG

Stimmt, ich finde die Ausgabe der zeit nicht mehr.

Da wo die Stunde angezeigt wird, zählst du "einfach" eine 1 dazu, wenn "isSummer == true".
Das ist die einfachste Lösung.

Hö? Den Code hab ich nicht geändert da sollte alles noch da sein...

Ich mach es mal etwas deutlicher als nur ein "WAS?!" um die Ohren zu hauen:
Ich bin ein Programmier Idiot das mag für Personen die sich damit auskennen einfach sein aber wie muss mein Code aussehn damit das passt?
Wenn ich einmal Frech sein darf: Würdest du mir das in den Code stopfen so das es funktioniert?

Den Code den du oben gepostet hast mit Sommerzeit Berechnung habe ich schon im Sketch gehabt und in der DS3231.h Datei aber da passiert nix :confused:

LG

Ramset:
Hö? Den Code hab ich nicht geändert da sollte alles noch da sein...

Das hat auch nix....aber gar nix in der Library zu suchen.

Nur in deinem Sketch.

habe jetzt gesehen, die Zeitanzeige ist noch vorhanden.
Du musst diese allerdings erst aufdröseln, in Stunden, Minuten (hour(), Minute(), day() ) usw.
Dann kannst du das auch der Stunde hinzufügen.

Also so ähnlich wie:

 stunden  = hour();
  if (isSummer == true) {                                          // wenn Sommerzeit + 1 Stunde
    stunden++;
    if (stunden > 23)
    {
      stunden = 0;
    }
  }
  lcd.print(stunden);

Habs mal Versucht aber naja... geht nicht.

Sketch:

#include <DHT.h>
#include <DHT_U.h>
#define DHTPIN 3
#define DHTTYPE DHT11
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <DS3231.h>
#include <LiquidCrystal.h> 
DHT dht(DHTPIN, DHTTYPE);
int checkDHT11(void);

// Sommerzeit holen
void check_SummerTime()
{
  isSummer = summertime_EU(year(), month(), day(), hour(), 1);
}


// Sommerzeit rechnen
//-------- utility code from jurs ----------
boolean summertime_EU(int year, byte month, byte day, byte hour, byte tzHours)
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
// input parameters: "normal time" for year, month, day, hour and tzHours (0=UTC, 1=MEZ)
// return value: returns true during Daylight Saving Time, false otherwise
{
  if (month < 3 || month > 10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
  if (month > 3 && month < 10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
  if (month == 3 && (hour + 24 * day) >= (1 + tzHours + 24 * (31 - (5 * year / 4 + 4) % 7)) || month == 10 && (hour + 24 * day) < (1 + tzHours + 24 * (31 - (5 * year / 4 + 1) % 7)))
    return true;
  else
    return false;
}

 stunden  = hour();
  if (isSummer == true) {                                          // wenn Sommerzeit + 1 Stunde
    stunden++;
    if (stunden > 23)
    {
      stunden = 0;
    }
  }

DS3231  rtc(SDA, SCL);
LiquidCrystal lcd(1, 2, 5, 6, 7, 8); //Aktiviert die Kanäle für das Display. Parameter: (rs, enable, d4, d5, d6, d7) 
void setup() {
 lcd.begin(16,2);               //Aktiviert das Display und legt die Größe des LC´s fest
 rtc.begin();                   //Aktiviert das Uhrmodul
}
void loop() {
 lcd.setCursor(5,0);            //Plaziert Cursor auf Feld 5 Reihe 0 ( 1 )
 //lcd.print("Zeit:");          //Ausgabe "Zeit:" - Derzeit ausgeblendet!
 //lcd.print(rtc.getTimeStr());   //Anzeige Uhrzeit
 lcd.print(stunden);            //
 lcd.setCursor(10,0);           //Plaziert Cursor auf Feld 10 Reihe 0 ( 1 )
 lcd.print("   ");              //Ausgabe von Leerzeichen zum Überschreiben von Kommastellen der Uhr - Sekunden werden ausgeblendet
 delay(1000);                   //Aktualisierungsintervall 1 Sek. (1000 = 1 Sek.)
  
 int h = dht.readHumidity();
 lcd.setCursor(3,1);            //Plaziert Cursor auf Feld 3 Reihe 1 ( 2 )
 lcd.print(h);                  //Anzeige für Luftfeuchtigkeit
 lcd.print("%");                //Ausgabe %
 lcd.setCursor(9,1);            //Plaziert Cursor auf Feld 9 Reihe 1 ( 2 )
 lcd.print(rtc.getTemp());      //Anzeige Temperatur
 lcd.setCursor(11,1);           //Plaziert Cursor auf Feld 11 Reihe 1 ( 2 )
 lcd.print("\xDF");             //Zeigt ° an (Grad Celsius)
 lcd.print("C  ");              //Zeigt "C" mit Leerzeichen an, zum Überschreiben der Kommastellen der Temperatur
 delay(10000);                  //Aktualisierungsintervall 10 Sek. (1000 = 1 Sek.)
}

Protokoll (Fehler):

ZeituTemp:15: error: 'day' was not declared in this scope

   isSummer = summertime_EU(year(), month(), day(), hour(), 1);

                                                 ^

ZeituTemp:15: error: 'hour' was not declared in this scope

   isSummer = summertime_EU(year(), month(), day(), hour(), 1);

                                                         ^
ZeituTemp:34: error: 'stunden' does not name a type

  stunden  = hour();

  ^

ZeituTemp:35: error: expected unqualified-id before 'if'

   if (isSummer == true) {                                          // wenn Sommerzeit + 1 Stunde

   ^

Mehrere Bibliotheken wurden für "DS3231.h" gefunden
 Benutzt: C:\Users\Chris\Documents\Arduino\libraries\DS3231
 Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\DS3231
exit status 1
'isSummer' was not declared in this scope

Ja....du musst natürlich auch die eingesetzten Variablen zuvor definieren.

Und das mache ich wie? bzw wie muss das aussehen?

Meinst du nicht du solltest dich mal mit den Basics erstmal beschäftigen bevor du so ein Projekt machst?
Schau dir die Beispiele der Software und den Grundaufbau eines Sketches mal an, dann verstehst du auch dein Problem wahrscheinlich von alleine.

Gruß

Ich bin ein Programmier Idiot ....

Je öfter du das wiederholst, desto fester glaubst du selber daran.
Nennt sich Autosuggestion.

Und wir glauben dir natürlich.

Das Gejammere ist also der beste Weg diesen Zustand zu stabilisieren.
Willst du das?

Mit dieser Aussage wollte Ich vermitteln das ich mit Programmierung nicht viel am hut habe und wissen welches für euch selbstverständlich ist nicht unbedingt besitze.
Natürlich habe ich vor mich weiterzubilden aber ich möchte derzeit nur das Baby und nicht die Wehen.

Ebenfalls könnte dieser Sketch dann auch den anderen helfen die einfach nur Copy&Paste machen müssen um ein Ergebniss zu erhalten.

Das mag vielleicht an dem ein oder anderen seiner Programmiererehre kratzen aber so ist es eben nun.
Ja die Platine ist vll zum Lernen gedacht aber wird nicht nur ausschließlich dafür genutzt.

LG

Ramset:
Das mag vielleicht an dem ein oder anderen seiner Programmiererehre kratzen aber so ist es eben nun.

Meine Ehre kratzt das nicht an, dass du nicht selbst etwas machen willst.

Dann musst du halt mit den fehlenden Features leben, so ist es eben nun (zu mindestens von meiner Seite).

Ich werde mich heute Abend da nochmal dran versuchen. Wenn es dann immer noch nicht will dann ist dem eben so.

Ramset:
Ich werde mich heute Abend da nochmal dran versuchen. Wenn es dann immer noch nicht will dann ist dem eben so.

Da du ja lernen willst, solltest du mit den einfachsten Beispielen aus der Library (DS3231) anfangen und die Anzeige erstmal auf dem seriellen Monitor machen.
Da gibt es Beispiele die auch die Zeit aufgedröselt ausgibt.

Wenn du das mit dem Programm nicht hinbekommst, dann musst du halt, wie früher, zwei mal im Jahr die Uhr von hand umstellen.

Vielleicht fällt dieser Sommerzeit-Umstell-Blödsinn ja bald weg, die EU prüft.

Gruß

MiReu

Darauf spekuliere ich derzeit auch. Ihr könnt darüber ja abstimmen.

Ramset:
Darauf spekuliere ich derzeit auch. Ihr könnt darüber ja abstimmen.

Da ich schon einige Uhren mit der Sommerzeit-Umstellung aufgebaut habe, bin ich gegen eine Änderung der Sommerzeit. :wink: