Arduino Forum

International => Deutsch => Topic started by: G4rt3l on Nov 23, 2016, 07:33 pm

Title: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 23, 2016, 07:33 pm
Hallo Gemeinde,

auch wenn Ihr dieses Thema schon satt seid, ich habe ein Problem mit damit eine Zeitschaltuhr zu programmieren. Ich bin eher so der Handwerker als der Techniker, deswegen erhoffe ich mir hier ein wenig Hilfe.
Grob beschrieben: Ich möchte ein paar Pflanzen bewässern über eine Pumpe mit Mosfet und gleichzeitig mit RGB WS2812 beleuchten und ein LCD-Display einbinden mit Uhrzeit, Datum und Temperatur welches seine Daten aus einem DS3231 zieht.

Die einzelnen Funktionen habe ich auch schon am laufen gehabt: Uhrzeit im Display und Licht und Pumpe an und aus, aber leider halt nur an dann delay(5000) und wieder aus delay(5000).

Jetzt ist meine Frage wie kann ich einen Befehl schreiben, das der Arduino aus dem DS3231 die Zeit zieht und ich sagen kann: Pumpe um 8 Uhr morgens für 2 Minuten an; bzw. Licht um 6:00 Uhr an und um 19 Uhr aus.

Ich muss zu meiner Schande gestehen das ich keine Ahnung von Programmierung habe... :/ ich hoffe ihr könnt mir ein paar Tipps geben über welche Funktion ich sowas einbinden kann.

Folgenden Sketch habe ich mir "zurechtkopiert":

Code: [Select]

#include <Wire.h>
#include "ds3231.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(2,3,4,5,6,7);

#define BUFF_MAX 128

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h>
#endif

uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 1000;

#define PIN 12
Adafruit_NeoPixel strip = Adafruit_NeoPixel(33, PIN, NEO_GRB + NEO_KHZ800);
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

int Wasserpumpe = 11;  


void setup()
{
   Serial.begin(9600);
   Wire.begin();
   DS3231_init(DS3231_INTCN);
   memset(recv, 0, BUFF_MAX);
   Serial.println("GET time");
   lcd.begin(16, 2);
   lcd.clear();
   
   //Serial.println("Setting time");       // Zum Zeiteinstellen!
   //parse_cmd("T200519323112016",16);     // T= Time; Sekunden: 45; Minuten: 25; Stunden: 18; Tag der Woche: 1=Montag, 2=Dienstag etc.;Datum: 23 11 2016;; 16 für 16 Bytes

strip.begin();
 strip.show(); // Initialize all pixels to 'off'
 pinMode(Wasserpumpe, OUTPUT);

}

void loop()
{


   char in;
   char tempF[6];
   float temperature;
   char buff[BUFF_MAX];
   unsigned long now = millis();
   struct ts t;

   // show time once in a while
   if ((now - prev > interval) && (Serial.available() <= 0)) {
       DS3231_get(&t); //Get time
       parse_cmd("C",1);
       temperature = DS3231_get_treg(); //Get temperature
       dtostrf(temperature, 5, 1, tempF);

       lcd.clear();
       lcd.setCursor(0,0);
       
       lcd.print(t.mday);
       
       printMonth(t.mon);
       
       lcd.print(t.year);
       
       lcd.setCursor(0,1); //Go to second line of the LCD Screen
       lcd.print(t.hour);
       lcd.print(":");
       if(t.min<10)
       {
         lcd.print("0");
       }
       lcd.print(t.min);
       lcd.print(":");
       if(t.sec<10)
       {
         lcd.print("0");
       }
       lcd.print(t.sec);
       
       lcd.print(' ');
       lcd.print(tempF);
       lcd.print((char)223);
       lcd.print("C ");
       prev = now;
   }

   
   if (Serial.available() > 0) {
       in = Serial.read();

       if ((in == 10 || in == 13) && (recv_size > 0)) {
           parse_cmd(recv, recv_size);
           recv_size = 0;
           recv[0] = 0;
       } else if (in < 48 || in > 122) {;       // ignore ~[0-9A-Za-z]
       } else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
           // drop
           recv_size = 0;
           recv[0] = 0;
       } else if (recv_size < BUFF_MAX - 2) {
           recv[recv_size] = in;
           recv[recv_size + 1] = 0;
           recv_size += 1;
       }

   }
}

void parse_cmd(char *cmd, int cmdsize)
{
   uint8_t i;
   uint8_t reg_val;
   char buff[BUFF_MAX];
   struct ts t;

   //snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
   //Serial.print(buff);

   // TssmmhhWDDMMYYYY aka set time
   if (cmd[0] == 84 && cmdsize == 16) {
       //T355720619112011
       t.sec = inp2toi(cmd, 1);
       t.min = inp2toi(cmd, 3);
       t.hour = inp2toi(cmd, 5);
       t.wday = inp2toi(cmd, 7);
       t.mday = inp2toi(cmd, 8);
       t.mon = inp2toi(cmd, 10);
       t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
       DS3231_set(t);
       Serial.println("OK");
   } else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
       DS3231_get_a1(&buff[0], 59);
       Serial.println(buff);
   } else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
       DS3231_get_a2(&buff[0], 59);
       Serial.println(buff);
   } else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
       Serial.print("aging reg is ");
       Serial.println(DS3231_get_aging(), DEC);
   } else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
       DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
       //ASSMMHHDD
       for (i = 0; i < 4; i++) {
           time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
       }
       byte flags[5] = { 0, 0, 0, 0, 0 };
       DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
       DS3231_get_a1(&buff[0], 59);
       Serial.println(buff);
   } else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
       DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
       //BMMHHDD
       for (i = 0; i < 4; i++) {
           time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
       }
       byte flags[5] = { 0, 0, 0, 0 };
       DS3231_set_a2(time[0], time[1], time[2], flags);
       DS3231_get_a2(&buff[0], 59);
       Serial.println(buff);
   } else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - get temperature register
       Serial.print("temperature reg is ");
       Serial.println(DS3231_get_treg(), DEC);
   } else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - reset status register alarm flags
       reg_val = DS3231_get_sreg();
       reg_val &= B11111100;
       DS3231_set_sreg(reg_val);
   } else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
       reg_val = DS3231_get_addr(0x5);
       Serial.print("orig ");
       Serial.print(reg_val,DEC);
       Serial.print("month is ");
       Serial.println(bcdtodec(reg_val & 0x1F),DEC);
   } else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
       DS3231_set_aging(0);
   } else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
       Serial.print("status reg is ");
       Serial.println(DS3231_get_sreg(), DEC);
   } else {
       Serial.print("unknown command prefix ");
       Serial.println(cmd[0]);
       Serial.println(cmd[0], DEC);
   }
}

void printMonth(int month)
{
 switch(month)
 {
   case 1: lcd.print(" Januar ");break;
   case 2: lcd.print(" Februar ");break;
   case 3: lcd.print(" Maerz ");break;
   case 4: lcd.print(" April ");break;
   case 5: lcd.print(" Mai ");break;
   case 6: lcd.print(" Juni ");break;
   case 7: lcd.print(" Juli ");break;
   case 8: lcd.print(" August ");break;
   case 9: lcd.print(" September ");break;
   case 10: lcd.print(" Oktober ");break;
   case 11: lcd.print(" November ");break;
   case 12: lcd.print(" Dezember ");break;
   default: lcd.print(" Error ");break;
 }
}

Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: ElEspanol on Nov 23, 2016, 07:36 pm
Willkommen im Forum!

Setze den Code bitte in Codetags </> Schaltfläche links oben beim Editieren (nicht Quick Edit, sondern more modify)

Zusammenkopieren und verstehen ist ok, aber wenn du nicht grob verstehst, was da vor sich geht, ist schlecht.
Basics lernen, Buch kaufen, Beispiele durcharbeiten, bis dir die ersten Lichter aufgehen.

Wichtiger Punkt: keine delays verwenden, sondern mit millis() arbeiten. Such mal nach den Nachtwächter Beispiel.

Arduino programmieren lernt man nicht an einem Tag. Und man lernt nie aus.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 23, 2016, 07:47 pm
Danke für den Hinweis mit den Code Tags.
Ja Buch gekauft und durchgearbeitet auch schon.
"Franzis Maker Kit" + War recht spannend. Allerdings das was ich vorhabe wird in diesem Buch nicht erschlagen... Dort kann ich lämpchen anmachen und Potis einbinden oder mit einem Display arbeiten, allerdings eine Verknüpfung von einem DS3231 und wie ich die Funktion auslese steht dort nicht drin.
Deshalb habe ich mir ein wenig durch kopieren weitergeholfen. Ich werde mich mal auf die Suche nach dem Nachtwächter machen. Vielen Dank.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 23, 2016, 08:19 pm
Jetzt ist meine Frage wie kann ich einen Befehl schreiben, das der Arduino aus dem DS3231 die Zeit zieht und ich sagen kann: Pumpe um 8 Uhr morgens für 2 Minuten an; bzw. Licht um 6:00 Uhr an und um 19 Uhr aus.
Da ist es mit einem einzigen Befehl nicht getan. Alles in allem wirst Du wohl deutlich über 200 Programmzeilen kommen, je nach sonstigen Anforderungen.

Also Du möchtest im Prinzip eine programmierbare automatische Zeitschaltuhr für zwei Schaltkanäle:
- Kanal 1: Wasserpumpe EIN/AUS
-LKanal 2: icht in Form einzeln adressierbarerWS2812  EIN/AUS (oder noch was anderes?)
- mehrere Schaltzeiten pro Tag
- Ein- und Ausschaltzeiten minutengenau programmierbar
- kleinste Schaltdauer: 1 Minute

So ungefähr?

Wie stellst Du Dir die Programmierung der Schaltzeiten vor, falls diese nicht fest im Programm stehen sollen?
Am einfachsten wäre eine Programmierung von Einstellungen/Schaltzeiten über den seriellen Monitor machbar: Schaltzeiten/Einstellwerte im seriellen Monitor eingeben, das Program speichert dieWerte im EEPROM?
Frage: Kannst Du das fertige Gerät zum Programmieren (Schaltzeiten, Datums- und Zeiteinstellung der Uhr, andere Einstellungen) an einen PC anschließen?
Und wenn Einstellungen fertig, dann trägst Du das Gerät ins Gewächshaus (oder wohin auch immer) und betreibst es dort mit einem USB-Netzteil. Machbar?


Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 23, 2016, 08:46 pm
Also Nachtwächter durchgelesen. War für mich jetzt etwas unverständlich, da es an sich nur um Ein- und Ausschaltzeiten handelt, die davon abhängig sind seit wann der Arduino eingeschaltet wird. Da bin ich ja aber bei Stromausfällen usw aufgeschmissen.

@jurs:

Sehr gut erfasst: Es handelt sich um eine kleine mobile Schalteinheit mit einem Arduino Nano und allem Drum und Dran. Habe ich auch schon alles fest auf einer Rasterplatine verlötet und tut wunderbar seinen Dienst. Kann ich jederzeit von meiner Bewässerungs- / Lichteinheit abbasteln, da diese nur mit JST Steckern an die Plantine gebracht werden. Das Arduino wird vor Ort von einem 5V Netzteil mit 10A versorgt, was gleichzeitig auch meine Pumpe (ja, 5V Pumpe =D) und die 66 WS2812 LED's versorgt.

Zu den Schaltzeiten:
Kanal 1 Wasserpumpe EIN / AUS      // Nur eine Schaltzeit pro Tag
Kanal 2 WS 2812 EIN / AUS             // Nur eine Schaltzeit pro Tag und immer dieselbe Farbe.


Zu der Programmierung:
Ich bin für jede Art der Programmierung offen. Die einfachste ist mir am liebsten! =D
Grundsätzlich spricht nichts dagegen, die Schaltzeiten fest in das Programm zu schreiben.

Mir fehlt irgendwie so eine große Denkstütze... Ich stelle mir das ganze irgendwie einfach vor.

Am Beispiel der Wasserpumpe über Mosfet:

getTime  // also irgendwie die Zeit des DS3231 überwachen
If Time 06:00 Uhr
Pin 11 HIGH
If Time 18:00 Uhr
Pin 11 LOW

Vielen Dank für dein Interesse und dein Hirnschmalz :)
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: HotSystems on Nov 23, 2016, 08:54 pm
Dann sieh dir mal diesen Beitrag an. Hier wird eine sehr einfach Schaltuhr mit festen Zeiten beschrieben, auf die man auch aufbauen kann.

Schaltuhr (http://forum.arduino.cc/index.php?topic=435651.0)
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 23, 2016, 10:01 pm
Mir fehlt irgendwie so eine große Denkstütze... Ich stelle mir das ganze irgendwie einfach vor.
Ja, ist auch irgendwie einfach.

Wenn ich am kommenden Wochenende etwas Zeit finde, kann ich mich ja mal kümmern.
Aber ich müßte erstmal bei mir aber ein DS3231 RTC-Modul herauskramen, zum Selbertesten.
Mal schauen, was ich dafür machen kann.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 24, 2016, 06:59 am
Hallo Hot Systems,

also den Denkansatz in deinem Beispiel finde ich schon eine spannende Grundlage. Da werde ich mich heute
mal beisetzen und probieren das auf meinen Fall umzuswitchen.

@jurs: Da ich ja wahrscheinlich nicht wirklich Erfolg haben werde, finde ich es cool das du es auch probieren willst. Falls du noch eine DS3231 benötigst, gib bitte eben laut. Hier fliegen nämlich noch ein paar rum.

Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: agmue on Nov 24, 2016, 09:58 am
Hier findest Du [Projekt] INTERVAL (http://forum.arduino.cc/index.php?board=31.0).
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: Moko on Nov 24, 2016, 10:09 am
Hier findest Du [Projekt] INTERVAL (http://forum.arduino.cc/index.php?board=31.0).

Meintest Du evtl diesen Link (http://forum.arduino.cc/index.php?topic=413734.0)?
Oder war das als Suchaufgabe gedacht? :smiley-lol:
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: ElEspanol on Nov 24, 2016, 07:28 pm
Hier findest Du [Projekt] INTERVAL (http://forum.arduino.cc/index.php?board=31.0).

Wieso steht eigentlich diese Wunderwaffe nicht unsterblich auf Github?
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: agmue on Nov 24, 2016, 07:48 pm
Meintest Du evtl diesen Link (http://forum.arduino.cc/index.php?topic=413734.0)?
Oder war das als Suchaufgabe gedacht? :smiley-lol:
Sorry, sollte schon der richtige Link sein :o
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 24, 2016, 08:45 pm
@jurs: Da ich ja wahrscheinlich nicht wirklich Erfolg haben werde, finde ich es cool das du es auch probieren willst. Falls du noch eine DS3231 benötigst, gib bitte eben laut. Hier fliegen nämlich noch ein paar rum.
Vielen Dank für das sehr freundliche Angebot, aber ich denke mal, das wird nicht notwendig sein und ich finde bei mir auch noch ein brauchbares RTC-Modul in der Bastelkiste!


Ich bin ja hier im Forum schon immer froh, wenn mir jemand überhaupt mitteilt, um welche Hardware es geht und wenn ich diese Hardware kenne und programmieren kann.

Irgendwas an RTC-Modul werde ich wohl hier noch finden können.
Mal schauen, das Wochenende kommt ja erst noch.

Ansonsten habe ich nochmal wegen einer interaktiven Konfigurationsmöglichkeit über die serielle Schnittstelle nachgedacht.

Momentan denke ich daran, diese vier Kommandos umzusetzen, die man dann einfach über den seriellen Monitor senden könnte:

setclock 2130 (zum Setzen der RTC-Uhrzeit auf 21:30Uhr

setdate 24.11.2016 (zum Setzen des RTC-Datums auf den 24.11.2016

setpump 730-750 (zum Setzen der Schaltzeit für die Pumpe von 07:30 Uhr bis 07:50 Uhr

setlight 900-1739 (zum Setzen der Schaltzeit für das Licht von 09:00 Uhr bis 17:39 Uhr

So ungefähr:
-die Befehle "setclock" und "setdate" würden direkt Zeit und Datum in der RTC umstellen
-die Befehle "setpump" und "setlight" würden die Schaltzeiten für Pumpe und Licht im EEPROM speichern /und beim nächsten Reset/Programmstart automatisch wieder aus dem EEPROM laden.


So OK?
Durchschaust Du das Prinzip bei den Zeitangaben (Stunden als dezimale Hunderter)?

Wenn Du meinst, dass es so ginge, versuche ich mich am Wochenende mal an der Umsetzung in einen Sketch.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 25, 2016, 07:08 am
Ja das Prinzip ist simpel. Gestern wollte ich mich auch voller Elan an die Programmierung schmeißen und dann hat mich die Hardware mal wieder voll zurückgeschmissen. Komischerweise merkt die RTC sich die Zeit nicht mehr. Ich stelle die Zeit ein:

Serial.println("Setting time");     
parse_cmd("T003321424112016",16);

In dem Fall 24.11.2016, Donnerstag, 21:33:00 Uhr

Und der RTC wenn man Ihn stromlos macht springt immer wieder auf diese Uhrzeit zurück wenn man Ihm neu Strom zuführt.
Hatte als erstes vermutet das es die Batterie ist, negativ
Dann habe ich die RTC ausgetauscht, negativ
Jetzt werde ich heute wahrscheinlich meine Lochrasterplatine nochmal von vorne aufbauen.
Weil der Code hat ja schon funktioniert und ich habe nichts verändert..... :/...
Programmieren schwere Kost =D.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 25, 2016, 10:59 am
Und der RTC wenn man Ihn stromlos macht springt immer wieder auf diese Uhrzeit zurück wenn man Ihm neu Strom zuführt.
Diese Fehlermeldung kommt mir bekannt vor, die ist innerhalb der letzten 5 Jahr bestimmt hundert mal gepostet worden.

Allerdings meines Wissens nach nie im Zusammenhang mit  DS3231 RTC-Modulen, sondern immer nur
- mit DS1307 RTC-Modulen, die auf der Platine mit "Tiny RTC" beschriftet sind.

Also nur die Kombination "DS1307 mit der ModulBeschriftung "Tiny RTC" zeigt das Problem recht oft, meines Wissens nach, keine anderen DS1307-Module mit andererer Platine und auch kein DS3231-Nodul.

Beschreibe mal Deine RTC-Module: Link zum Shop, eBay oder sowas, wo Du sie her hast?

Ist irgendwas auf der Modulplatine beschriftet? Steht da rauf "Tiny RTC" oder "Chronodot" oder was anderes?

Softwaretechnisch käme noch in Frage, dass die Uhr eventuell gestoppt statt gestartet ist.

Sowohl die DS1307 als auch die DS3231 bieten die Möglichkeit "Uhr anhalten" und "Uhr starten" zu programmieren, allerdings ist das dafür zuständige Bit bei der DS3231 in einem anderen Register als bei der DS107.

Und zu dieser Zeitangabe:
In dem Fall 24.11.2016, Donnerstag, 21:33:00 Uhr
fällt mir nur ein:
Das ist eine ungültige Zeitangabe, es gibt keine 33:00Uhr, was soll das sein?
Soll das mit den 33:00Uhr eventuell für 09:00 Uhr vormittags am nachfolgenden Tag stehen?
P.S.: Ach ne, verlesen, 21:33 Uhr und 00 Sekunden, siehe auch Beitrag HotSystems#16.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: ElEspanol on Nov 25, 2016, 11:11 am
Quote
parse_cmd("T003321424112016",16);
Bist du sicher, dass die 4 dahin gehört?
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: HotSystems on Nov 25, 2016, 11:16 am
Und zu dieser Zeitangabe:
In dem Fall 24.11.2016, Donnerstag, 21:33:00 Uhr
fällt mir nur ein:
Das ist eine ungültige Zeitangabe, es gibt keine 33:00Uhr, was soll das sein?
Soll das mit den 33:00Uhr eventuell für 09:00 Uhr vormittags am nachfolgenden Tag stehen?

Da steht doch 21:33:00 Uhr, oder ?

Und zur ständigen Rücksetzung der Zeit, vermute ich, die wird immer im Setup gestellt, muss also im Setup auskommentiert werden.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 25, 2016, 11:23 am
Bist du sicher, dass die 4 dahin gehört?
Die Zeitangabe mit einem Großbuchstaben "T" gefolgt von etlichen Ziffern deutet darauf hin, dass er die Uhr mit einer "Unixtime" Zeitangabe füttern möchte, also der Anzahl vergangener Sekunden eit dem 1.1.1970 um 00:00 UTC-Zeit.

Wenn er das macht und die von ihm verwendete Library-Funktion das korrekt umsetzt, läuft seine RTC danach allerdings wohl auf UTC-Zeit (Zeitzone von London).

Um diese Zeit aufauf deutsche Zeit umzurechnen, muß er in der Winterzeit dann immer eine Stunde und in der Sommerzeit zwei Stunden auf die Zeit draufrechnen, um auf "amtliche deutsche Zeit" zu kommen.

Ich werde es bei mir hier anders machen:
- Die RTC-Uhr läuft auf Zonenzeit (Zeitzone von Berlin, Deutschland ist UTC+1) und es wird in der Winterzeit direkt diese Zeit zum Anzeigen und Schalten verwendet, und nur während der Sommerzeit eine Stunde draufgeschlagen.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 25, 2016, 11:26 am
Da steht doch 21:33:00 Uhr, oder ?
Ja, in der Tat, Du hast Recht, ich habe mich verlesen, ein kleiner Lapsus von mir.
Ich war nicht davon ausgegangen, dass er die Uhrzeit sekundengenau einstellen öchte, wenn das Programm anschließend nur minutengenaue Schaltzeiten bekommt, die minutengenau eingehalten werden sollen.

Ich glaube, in meinem Sketch werde ich für die RTC erstmal nur eine minutengenaue Zeiteinstellung "auf die volle Minute" vorsehen. Und zwar nicht per "Einstellung nach Londoner Zeitzone mit Angabe von "Unixzeit", sondern per Einstellung in der "Zeitzone von Deutschland (UTC+1), mit automatischer Umrechnung auf Sommerzeit während der Sommermonate für Zeitanzeige und Schaltzeiten.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: ElEspanol on Nov 25, 2016, 01:07 pm
Die Zeitangabe mit einem Großbuchstaben "T" gefolgt von etlichen Ziffern deutet darauf hin, dass er die Uhr mit einer "Unixtime" Zeitangabe füttern möchte, also der Anzahl vergangener Sekunden eit dem 1.1.1970 um 00:00 UTC-Zeit.
Ich sehe da eher die Zeit im Klartext 003321424112016
00 Sekunden
33 Minuten
21 Stunden
4 ?? falsch?? Fehler verursachend?
24 Tag
11 Monat
2016 Jahr vierstellig
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 25, 2016, 05:12 pm
Ich weiß nicht genau wie der Sketch funktioniert. Es ist ja im Grunde der Standard-Sketch von Rodan - Github zur DS3231

https://github.com/rodan/ds3231


Richtig die Aufgliederung in diesem Sketch funktioniert mit Angabe des Wochentages
003321424112016:
00 Sekunden
33 Minuten
21 Stunden
4 Wochentag = Donnerstag; 1 wäre Montag and so on
24 Tag
11 Monat
2016 Jahr vierstellig

Die Sekundenschaltung ist nicht nötig und war nur ein zusätzliches Gimmik in dem Sketch... Das LCD.Clear erfolgt auch sekundlich.

Zu dem DS3231: Grundsätzlich steht hier nichts drauf vermerkt

DS3231M
1125A3
625AA

und dann ist da noch ein kleiner chip, könnte jetzt nur vermuten das es sich hierbei um das Thermometer handelt:
ATMEL632
24C32M
SU27   D

Generell draufgedruckt steht noch ZS-042

Link von den Teilen:
http://www.ebay.de/itm/391499267511


Also ich vermute da eher einen Platinenfehler / Also Fehler in meiner Verlötung die sich gelöst hat.
Ich werde das nochmal alles neu punktieren und versuchen. Weil das gleich zwei Stück nicht richtig funktionieren halte ich für unwahrscheinlich.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 25, 2016, 05:44 pm
und dann ist da noch ein kleiner chip, könnte jetzt nur vermuten das es sich hierbei um das Thermometer handelt:
ATMEL632
24C32M
Nein, das Thermometer (Auflösung 0,25°C, Genauigkeit 3°C) ist direkt im DS3231 Chip EINGEBAUT! Das Thermometer ist kein eigenes Bauteil auf der Platine.

Und der Chip AT24C32 ist ein zusätzliches I2C Speichermodul mit einer Speichergröße von 8192 Bytes.
(Nichtflüchtger Speicher, Inhalt bleibt ohne Stromversorgung bestehen)

Wenn Du dieses Uhrenmodul korrekt an die Spannungsversorgung, GND und den I2C-Bus anschließt, dann hast Du danach zwei I2C-Geräte am I2C-Bus:
1. das Uhrenmodul DS3231
2. das Speicher EEPROM 24C32

Lade Dir mal einen "I2C Scanner" Sketch auf das Board hoch und schaue Dir an, ob und wie viele Geräte am I2C-Bus gefunden werden, wenn Du die RTC-Modulplatine angeschlossen hast!
Der I2C-Scanner Sketch sollte dann zwei Geräte an zwei verschiedenen Adressen finden, wenn alles funktioniert.

Was bekommst Du?

Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 25, 2016, 06:01 pm
Ja Ja der liebe unbekannte Fehler!! =D Ich hab meine Platine komplett nochmal auf dem Breadboard nachgebaut und dort funktioniert die Zeit wunderbar fortlaufend! =D Daraufhin habe ich nochmal meine eigentlich Platine angeschmissen und bums, läuft es dort auch wieder... Bin kurz davor mir in Hintern zu beißen.

i2c Scanner sagt:

I2C Scanner
Scanning...
I2C device found at address 0x57  !
I2C device found at address 0x68  !
done

Also alles Paletti :)
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 25, 2016, 06:24 pm
Okay Fehler gefunden... Menschliches Versagen... Menschliches Denkliches Versagen =D

Ich spiele den Sketch auf mit der richtigen Zeit:

  Serial.println("Setting time");
  parse_cmd("T102118525112016",16);


Und muss Ihn dann ohne Ihn vom Strom zu nehmen nochmal hochladen bloß als Text:

  //Serial.println("Setting time");
  //parse_cmd("T102118525112016",16);

Weil wenn ich den Arduino sonst immer wieder neu starte, setzt er immer wieder die alte Zeit...

Tut mir leid um die vergeudete Zeit =D
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: michael_x on Nov 25, 2016, 07:37 pm
Und zur ständigen Rücksetzung der Zeit, vermute ich, die wird immer im Setup gestellt, muss also im Setup auskommentiert werden.
Das ist der beliebteste Fehler, denke ich mal
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: HotSystems on Nov 25, 2016, 07:42 pm
Und muss Ihn dann ohne Ihn vom Strom zu nehmen nochmal hochladen bloß als Text:

  //Serial.println("Setting time");
  //parse_cmd("T102118525112016",16);

Weil wenn ich den Arduino sonst immer wieder neu starte, setzt er immer wieder die alte Zeit...

Tut mir leid um die vergeudete Zeit =D
Man sollte doch immer die Posts der "Helfer" komplett lesen.
Siehe mein Post #16.

Ups, das habe ich jetzt überlesen, michael_x.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 25, 2016, 08:02 pm
Ja ich hab es gelesen aber nicht verstanden was du mit auskommentieren meintest
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: michael_x on Nov 25, 2016, 08:05 pm
Quote
Ups, das habe ich jetzt überlesen
;) Ich hab gleich gemerkt, dass den Tip schon jemand gegeben hatte ;)

@G4rt3l:
Ist zwar der "beliebteste" Fehler, aber schon ziemlich blöde, sich so wenig um seinen "eigenen" Sketch zu kümmern.

Wenn man eh Serial verwendet, könnte man ja auch per Serial.read() eine Uhrzeit-Stellfunktion machen, statt die Primitiv-Demo unreflektiert zu übernehmen.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: HotSystems on Nov 25, 2016, 08:16 pm
Ja ich hab es gelesen aber nicht verstanden was du mit auskommentieren meintest
Da könnte man aber nachfragen.
Z.B. Code als Kommentar setzen.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 26, 2016, 10:19 am
Scheint nicht bei jeden durchgedrungen zu sein, das ich nur über minimalste Grundkenntnisse im Programmieren verfüge und mir nicht eigene Sketche ausdenken kann. Ich kann ein wenig dran rumfummeln und noch ein wenig hinzufügen, das war es aber auch. Von daher sagt mir Serial.read() mal überhaupt nichts.
 
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: agmue on Nov 26, 2016, 10:26 am
Nicht erschöpfend, aber eine Language Reference (https://www.arduino.cc/en/Reference/HomePage) und von da weiter nach Serial (https://www.arduino.cc/en/Reference/Serial).
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: michael_x on Nov 26, 2016, 11:53 am
Quote
nur über minimalste Grundkenntnisse im Programmieren
Schon klar. Gerade am Anfang ist die "Lernkurve" am steilsten, wenn man will. Da wollte ich nur einen kleinen Schubs geben.
Wie das genau werden soll zwischen Serial.read() und RTC stellen, wird noch eine kleine Herausforderung für dich, das hab ich erstmal weggelassen. Für die nächste Zeit ist deine supergenaue DS3231 ja erstmal richtig gestellt.

Für Arduino findet man so viele Sketche. Das ist toll, aber immer erst der Anfang.
Dass es läuft, zählt erst, wenn man weiss, warum  ;)

OK, manchmal behaupte ich auch das Gegenteil:
"Jeder Sketch der tut was er soll, ist ein guter Sketch"
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 26, 2016, 01:33 pm
Scheint nicht bei jeden durchgedrungen zu sein, das ich nur über minimalste Grundkenntnisse im Programmieren verfüge und mir nicht eigene Sketche ausdenken kann.
Da trifft es sich ja gut, dass ich es verstanden habe, wie gering Deine Programmierkeenntnisse sind, weil ich Dir ja ein Beispielprogramm für die Zeitschaltuhr machen und damit an diesem Wochenende anfangen wollte.

In Sachen RTC kann ich Entspannung vermelden: Ich konnte inzwischen bei mir zwar keine funktionierende DS3231 aus der Bastelkiste ziehen, sondern nur einen DS3231 "Chronodot v2.0" ohne eingelötete Header und ohne Lithium-Battereie als Backup. Die benötigte Lithiumbatterie scheint eine CR1620 zu sein und so eine habe ich hier nicht.

Anyway, ich habe eine DS1307 vom Typ "Tiny RTC" finden und in Betrieb nehmen können. Damit steht der Entwicklung eines Beispielprogramms mit folgenden Funktionen erstmal nichts im Wege:
- programmierbare Zweikanal-Schaltuhr mit zwei täglichen Schaltzeiten (eine Einschaltzeit/eine Ausschaltzeit)  pro Kanal also nichts mehr im Wege
- die Programmierung erfolgt über den seriellen Monitor
- Zeiteinstellung kompatibel für DS3231 und DS1307 RTC-Module
- Speicherung der Konfigurationsdaten für Einschalt-/Ausschaltzeiten im EEPROM
- (die gepseicherten Konfigurationsdaten werden bei jedem Power-on oder Reset automatisch wieder eingelesen

Ich setze mich mal dran und probiere was.

Wenn ich was habe, poste ich es hier in diesem Thread und Du kannst es ausprobieren und kommentieren.
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 26, 2016, 02:01 pm
Okay hab es hinbekommen. Vielen Dank für die Anregungen.
War nicht so schwer wie gedacht, aber in dem RCSwitch Beitrag konnte
man sich ganz gut rausdenken die man die RTC ausliest und dann war es
nur noch sinnig füllen:

(Habe den Code in zwei Teile teilen müssen da nicht mehr als 9000 Zeichen erlaubt sind)

P.S. Ich bin trotzdem noch auf deinen Lösungsansatz gespannt jurs! Falls du noch Lust hast das parallel zu erstellen :)

Code: [Select]

#include <Wire.h>
#include "ds3231.h"
#include "INTERVAL.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(2,3,4,5,6,7);


#define RTC_ADDRESS 0x68

#define BUFF_MAX 128

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

uint8_t time[8];
char recv[BUFF_MAX];
unsigned int recv_size = 0;
unsigned long prev, interval = 1000;

int Wasserpumpe = 11; 

#define PIN 12
Adafruit_NeoPixel strip = Adafruit_NeoPixel(33, PIN, NEO_GRB + NEO_KHZ800);
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

byte ss, mm,  hh = 0;   // Save Variables for time

/*
Schaltzeit Wasserpumpe 07:00-07:02
Schaltzeit Licht 06:00-19:00
*/

byte Wasserpumpe_ein_hh=7;
byte Wasserpumpe_ein_mm=0;
byte Wasserpumpe_aus_hh=7;
byte Wasserpumpe_aus_mm=02;

byte Licht_ein_hh=06;
byte Licht_ein_mm=00;
byte Licht_aus_hh=19;
byte Licht_aus_mm=00;

/*
RTC Funktionen zur Steuerung der RTC DS3231
*/

void TimeRead(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);               // Pointer auf Sekunden
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 3);
  ss= bcdToDec(Wire.read());
  mm= bcdToDec(Wire.read());
  hh= bcdToDec(Wire.read());
}

void RTC_Set(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.write(decToBcd(mm));
  Wire.write(decToBcd(hh));      // If you want 12 hour am/pm you need to set
  Wire.endTransmission();
}

void RTC_Start(){
  Wire.beginTransmission(RTC_ADDRESS);
  Wire.write(0x00);
  Wire.write(decToBcd(ss));    // 0 to bit 7 starts the clock
  Wire.endTransmission();
}

byte decToBcd(byte val)
{
  return ((val/10)<<4)+(val%10);
}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ((val>>4)*10)+val%16;
}


Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: G4rt3l on Nov 26, 2016, 02:06 pm
Code: [Select]
void setup()
{
    Serial.begin(9600);
    Wire.begin();
    DS3231_init(DS3231_INTCN);
    memset(recv, 0, BUFF_MAX);
    Serial.println("GET time");
    lcd.begin(16, 2);
    lcd.clear();
    
    //Serial.println("Setting time");       // Zum Zeiteinstellen!
    //parse_cmd("T304413626112016",16);     // T= Time; Sekunden: 45; Minuten: 25; Stunden: 18; Tag der Woche: 1=Montag, 2=Dienstag etc.;Datum: 23 11 2016;; 16 für 16 Bytes

strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  pinMode(Wasserpumpe, OUTPUT);
 
 
  Wire.begin();                 // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);      // Beginn Kommunikation auf  Adresse 0x68
  Wire.write(0x0E);                               // Pointer auf Control Register 0x07
  Wire.write(0x00);                               // Controlbyte for RTC to set the sqw Output to 1Hz
  Wire.endTransmission();             // Beenden der I2C Kommunitkation
  TimeRead();
  RTC_Start();
  Serial.begin(9600);
  Serial.print("start");
 
}

void loop() {

    INTERVAL(1000UL){                 //Jede  Minute nach Zeit schauen
    TimeRead();
    Serial.print(hh);
    Serial.print(":");
    Serial.println(mm);
    
  }
  if (hh==Wasserpumpe_ein_hh && mm==Wasserpumpe_ein_mm){   // Einschalten
    INTERVAL (200UL){
      digitalWrite(Wasserpumpe, HIGH);
    }
  }
  if (hh==Wasserpumpe_aus_hh && mm>=Wasserpumpe_aus_mm){   // Ausschalten
    INTERVAL(200UL){
      digitalWrite(Wasserpumpe, LOW);
    }
  }
    if (hh==Licht_ein_hh && mm==Licht_ein_mm){   // Einschalten
    INTERVAL (200UL){
      colorWipe(strip.Color(62, 6, 148), 50); // Ultra Violet
    }
  }
  if (hh==Licht_aus_hh && mm>=Licht_aus_mm){   // Ausschalten
    INTERVAL(200UL){
      colorWipe(strip.Color(0,0,0), 50); // LED Strip aus
    }
  }
    char in;
    char tempF[6];
    float temperature;
    char buff[BUFF_MAX];
    unsigned long now = millis();
    struct ts t;

    // show time once in a while
    if ((now - prev > interval) && (Serial.available() <= 0)) {
        DS3231_get(&t); //Get time
        parse_cmd("C",1);
        temperature = DS3231_get_treg(); //Get temperature
        dtostrf(temperature, 5, 1, tempF);

        lcd.clear();
        lcd.setCursor(0,0);
        
        lcd.print(t.mday);
        
        printMonth(t.mon);
        
        lcd.print(t.year);
        
        lcd.setCursor(0,1); //Go to second line of the LCD Screen
        lcd.print(t.hour);
        lcd.print(":");
        if(t.min<10)
        {
          lcd.print("0");
        }
        lcd.print(t.min);
        lcd.print(":");
        if(t.sec<10)
        {
          lcd.print("0");
        }
        lcd.print(t.sec);
        
        lcd.print(' ');
        lcd.print(tempF);
        lcd.print((char)223);
        lcd.print("C ");
        prev = now;
    }

    
    if (Serial.available() > 0) {
        in = Serial.read();

        if ((in == 10 || in == 13) && (recv_size > 0)) {
            parse_cmd(recv, recv_size);
            recv_size = 0;
            recv[0] = 0;
        } else if (in < 48 || in > 122) {;       // ignore ~[0-9A-Za-z]
        } else if (recv_size > BUFF_MAX - 2) {   // drop lines that are too long
            // drop
            recv_size = 0;
            recv[0] = 0;
        } else if (recv_size < BUFF_MAX - 2) {
            recv[recv_size] = in;
            recv[recv_size + 1] = 0;
            recv_size += 1;
        }

    }
}

void parse_cmd(char *cmd, int cmdsize)
{
    uint8_t i;
    uint8_t reg_val;
    char buff[BUFF_MAX];
    struct ts t;

    //snprintf(buff, BUFF_MAX, "cmd was '%s' %d\n", cmd, cmdsize);
    //Serial.print(buff);

    // TssmmhhWDDMMYYYY aka set time
    if (cmd[0] == 84 && cmdsize == 16) {
        //T355720619112011
        t.sec = inp2toi(cmd, 1);
        t.min = inp2toi(cmd, 3);
        t.hour = inp2toi(cmd, 5);
        t.wday = inp2toi(cmd, 7);
        t.mday = inp2toi(cmd, 8);
        t.mon = inp2toi(cmd, 10);
        t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);
        DS3231_set(t);
        Serial.println("OK");
    } else if (cmd[0] == 49 && cmdsize == 1) {  // "1" get alarm 1
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 50 && cmdsize == 1) {  // "2" get alarm 1
        DS3231_get_a2(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 51 && cmdsize == 1) {  // "3" get aging register
        Serial.print("aging reg is ");
        Serial.println(DS3231_get_aging(), DEC);
    } else if (cmd[0] == 65 && cmdsize == 9) {  // "A" set alarm 1
        DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
        //ASSMMHHDD
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // ss, mm, hh, dd
        }
        byte flags[5] = { 0, 0, 0, 0, 0 };
        DS3231_set_a1(time[0], time[1], time[2], time[3], flags);
        DS3231_get_a1(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 66 && cmdsize == 7) {  // "B" Set Alarm 2
        DS3231_set_creg(DS3231_INTCN | DS3231_A2IE);
        //BMMHHDD
        for (i = 0; i < 4; i++) {
            time[i] = (cmd[2 * i + 1] - 48) * 10 + cmd[2 * i + 2] - 48; // mm, hh, dd
        }
        byte flags[5] = { 0, 0, 0, 0 };
        DS3231_set_a2(time[0], time[1], time[2], flags);
        DS3231_get_a2(&buff[0], 59);
        Serial.println(buff);
    } else if (cmd[0] == 67 && cmdsize == 1) {  // "C" - get temperature register
        Serial.print("temperature reg is ");
        Serial.println(DS3231_get_treg(), DEC);
    } else if (cmd[0] == 68 && cmdsize == 1) {  // "D" - reset status register alarm flags
        reg_val = DS3231_get_sreg();
        reg_val &= B11111100;
        DS3231_set_sreg(reg_val);
    } else if (cmd[0] == 70 && cmdsize == 1) {  // "F" - custom fct
        reg_val = DS3231_get_addr(0x5);
        Serial.print("orig ");
        Serial.print(reg_val,DEC);
        Serial.print("month is ");
        Serial.println(bcdtodec(reg_val & 0x1F),DEC);
    } else if (cmd[0] == 71 && cmdsize == 1) {  // "G" - set aging status register
        DS3231_set_aging(0);
    } else if (cmd[0] == 83 && cmdsize == 1) {  // "S" - get status register
        Serial.print("status reg is ");
        Serial.println(DS3231_get_sreg(), DEC);
    } else {
        Serial.print("unknown command prefix ");
        Serial.println(cmd[0]);
        Serial.println(cmd[0], DEC);
    }
}

void printMonth(int month)
{
  switch(month)
  {
    case 1: lcd.print(" Januar ");break;
    case 2: lcd.print(" Februar ");break;
    case 3: lcd.print(" Maerz ");break;
    case 4: lcd.print(" April ");break;
    case 5: lcd.print(" Mai ");break;
    case 6: lcd.print(" Juni ");break;
    case 7: lcd.print(" Juli ");break;
    case 8: lcd.print(" August ");break;
    case 9: lcd.print(" September ");break;
    case 10: lcd.print(" Oktober ");break;
    case 11: lcd.print(" November ");break;
    case 12: lcd.print(" Dezember ");break;
    default: lcd.print(" Error ");break;
  }
}

void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: jurs on Nov 26, 2016, 02:32 pm
Okay hab es hinbekommen.
OK, wenn Dir DAS so reicht, dann stelle ich meine eigenen Bemühungen für ein über den seriellen Monitor programmierbares und konfigurierbares Zweikanal-Zeitschaltuhrprogramm für den Rest des Wochenendes ein.

In Deinem Code kann ich nirgends erkennen, dass die Uhrzeit oder irgendeine Schaltzeit über den seriellen Monitor eingestellt werden kann, sondern ich sehe nur:
- Wenn die Uhrzeit beim Programmstart neu gestellt werden soll ==> Programmcode ändern, Programm neu hochladen
- Wenn die Uhrzeit danach beim Programmstart NICHT neu gestellt werden soll ==> Programmcode ändern, Programm neu hochladen
-Wenn Einschaltzeit oder Ausschaltzeit neu gestellt werden soll ==> Programmcode ändern, Programm neu hochladen
-am Termin der Sommerzeitumschaltung ==> RTC-Zeit läuft entweder eine Stunde falsch, oder Neuprogrammierung
-am Termin der Winterzeitumschaltung ==> RTC-Zeit läuft entweder eine Stunde falsch, oder Neuprogrammierung.

Nachdem Du hier mitteilst "Okay hab es hinbekommen.", teile ich dann nur noch abschließend mit
"Das ist ja schön für Dich, wenn Dir das so ausreicht"!
Und ich verabschiede mich dann hiermit aus diesem Thread-Thema.


BYE und schönes Wochenende noch!



Title: Re: DS 3231 Zeitschaltuhr mit LCD-Display
Post by: Doc_Arduino on Nov 28, 2016, 04:22 pm
Hallo,

@ jurs, du darfst ruhig dein Schaltzeitenprogramm fertig stellen. Bin gespannt was du dir wieder ausgedacht hast.

Wegen der Lib und den tausend Warnungen. Was mir ja nicht gefällt bis jetzt.
Habe mal alten Code rausgesucht. Ganz ohne RTC Lib. Nur paar Funktionen.
Damit kannst fehlerfrei auf Sekunde, Minute, Stunde, Wochentag, Tag, Monat und Jahr zugreifen.
Was noch fehlt ist die Winter-Sommerzeitkorrektur.

Code: [Select]
/*
Arduino Mega2560
I2C RTC DS3231
*/

#include <Wire.h>
#define ds3231_adress  0x68   // Adresse

int Sekunde, Minute, Stunde, Wochentag, Tag, Monat, Jahr;
char RtcDateTimeBuf[26];  // Buffer zum Zwischenspeichern der formatierten DS3231 Werte

void setup()
{
  Wire.begin();
  Serial.begin(9600);
 
}

void loop()
{
  RtcRequestEverySecond();
}


void RtcRequestEverySecond()
{
 static unsigned long last_millis = 0;
 
 if (millis()-last_millis < 10000) return;  // Zeit noch nicht erreicht, Funktion abbrechen
 last_millis+=10000;                        // addiere 10sec
 
 if (read_RTC_DS3231 (ds3231_adress) == true) {    // RTC auslesen, wenn Fehlerstatus "wahr", dann
   Serial.println("DS3231 I2C Busfehler");
 }
 else {
   // Datum und Zeit für Ausgabe formatieren und in globalen String 'RtcDateTimeBuf' speichern
   snprintf(RtcDateTimeBuf,26,"%02d.%02d.%04d ; %02d:%02d:%02d",Tag,Monat,Jahr,Stunde,Minute,Sekunde);   
   Serial.println(RtcDateTimeBuf);
 } 
 
} // Ende "RtcRequestEverySecond"
 
 
 
boolean read_RTC_DS3231 (int i2c_adresse)
{
  boolean error = false;                   // Fehlerstatus setzen
  Wire.beginTransmission(i2c_adresse);     // Connect
  Wire.write(0);                           // Anfrage ab/der Register Nummer
  if (Wire.endTransmission() > 0 )         // war Connect fehlerfrei?
   {
    error = true;                          // I2C Busfehler
    return error;                          // Abruch
   }
   
  Wire.requestFrom(i2c_adresse, 7);        // 7 Bytes in Folge anfordern/lesen

  if (Wire.available() > 0 )               // sind Daten vorhanden?
    {
     Sekunde   = bcdToDec(Wire.read() & 0x7F);  // Maske für die ersten 7 Bits alleine
     Minute    = bcdToDec(Wire.read() );
     Stunde    = bcdToDec(Wire.read() & 0x3F);  // Umschaltung auf 24h statt 12h (AM/PM)
                          Wire.read();          // wäre der Wochentag
     Tag       = bcdToDec(Wire.read() );             
     Monat     = bcdToDec(Wire.read() );
     Jahr      = bcdToDec(Wire.read() ) + 2000;
    }   
  return error; 
}

byte bcdToDec(byte val)  // Hilfsfunktion zum Lesen/Schreiben der RTC
// Convert binary coded decimal to decimal number
// Hilfsfunktion für die Echtzeituhr
{
  return ( (val/16*10) + (val%16) );
}