Go Down

Topic: DS1307 Uhrzeit und Datum einstellen (Read 9779 times) previous topic - next topic

Knippi

Hallo, ich lese seit einigen Wochen sehr interessiert in diesem Forum die Beiträge. Da mich diese Technik sehr interessiert, habe ich mich dazu entschlossen eine Mega2560 Board +LCD Display (LCD4884)+RTC DS1307 zu kaufen.
Um die Wartezeit zu verkürzen habe ich mich in dieser Zeit ein wenig mit der Programmierung vertraut gemacht. Unter Playground/Languages/Deutsch/Interessante weiterführende Links auf deutsche Seiten/Einsteiger & Fortgeschrittenen Video-Tutorials auf Deutsch, fand ich ein lehrreiches Einsteiger Video.
Ich habe ein elektronisches Grundwissen, aber leider keine Erfahrung mit der Programmierung von Mikrocontrollern. Da mich dieses Thema wie gesagt sehr interessiert, würde ich es mir gerne aneignen.
Nun zu meinem eigentlichen Problem:
Seit ein paar Tagen bin ich nun stolzer Besitzer der o.a. Hardware. Ich habe nun auch praktisch ein paar Einsteiger-Programmierungen erfolgreich durchgeführt.
Nun wollte ich das RTC-Modul (DS1307) testen, um damit weiter meine Erfahrungen auszubauen. Also habe ich das Modul an das Mega2560-Board angeschlossen (Vcc,Grnd,Sda,Scl). Den dazugehörigen Code, in den Libraries-Ordner der Software kopiert und dann den Sketch in das Arduino-Tool geladen. Der Code/Sketch hat 3 Examples (DS1307_Monitor;DS1307_Test;IC2Scanner). Ich kann mit dem Sketch DS1307_Test und dem Serial Monitor die Zeit und das Datum auslesen. Es wird auch pro Zeile eine Sekunde weiter gezählt, nur leider ist eine falsche Zeit und Datum eingestellt.
Meine Frage wäre nun: Wie kann ich dem DS1307 eine neue Zeit/Datum einstellen? Kann man über den Serial Monitor vielleicht Daten Zeit/Datum an den DS1307 senden? Ich habe schon gelesen, daß man die Zeit und das Datum mit einem 10-stelligen Timestamp laden muss, aber wie?
Ich habe auch mal den Sketch DS1307_Monitor geladen, nur sagt mir die Ausgabe am Serial Monitor "DS1307 Monitor (enable Lf/CR, type 'h' for help)" gar nichts und der Sketch IC2Scanner läßt sich nicht ausführen(irgendwelche Meldungen im unteren Teil des Tools). Wozu sind diese Sketche?
Eine andere Frage wäre noch: Wofür sind außer den Sketch-Dateien mit der Endung .pde noch für Dateien mit den Endungen .h oder .cpp?
Es sind viele Fragen, aber ich hoffe es kann mir jemand helfen.
Kann mir(ein Neuling auf diesem Gebiet), eine Lösung für das Problem mitteilen und vielleicht noch ein paar Grundlagen dazu geben.
Anbei der Link zum Sketch/Code: http://www.dfrobot.com/image/data/DFR0151/DS1307%20library%20v1.0(DFRobot).rar
Vielen Dank schon mal.
Gruß [font=Verdana]Jens[/font]  :smiley-eek-blue:

maverick1509

Du kannst per Befehl in der void setup Datum und Uhrzeit setzen oder aber
z.B. über Taster und ein LCD-Display per Tastendruck die Uhrzeit im Programm setzen,
das bedarf aber einer Programmierung. (die ich dir ggf. geben kann, ich mache das nämlich so)
Gruß
Bernward

Knippi

Hallo Bernward, Danke schon mal für die Info. Ein Sketch für beide Möglichkeiten wäre super und auch welche Zusatzdateien .h oder .cpp ich dazu benötigte.
Gruß Jens

maverick1509

Also ich habe nur folgende eingebunden:
#include <DS1307.h>

Code: [Select]

  RTC.stop();
   RTC.set(DS1307_SEC,0);
   RTC.set(DS1307_MIN,20);
   RTC.set(DS1307_HR,10);
   RTC.set(DS1307_DOW,1);
   RTC.set(DS1307_DATE,8);
   RTC.set(DS1307_MTH,6);
   RTC.set(DS1307_YR,12);
   RTC.start();


So sollte die Uhr auf den 08.06.2012, 10:20:00 gesetzt werden


Knippi

Hallo Bernward,
soll der Script unter der void Setup in der .pde Datei mit eingebunden werden?
Was meinst du mit "#include <DS1307.h>"?
Gruß Jens

maverick1509

Ja das gehört in die void setup.
Das #include <DS1307.h> bedeutet, da werden vorgefertigte Scripte eingebunden.
Die sollten eigentlich im Arduino Ordner unter "libraries" vorhanden sein,
da sollte ein Ordner DS1307 zu finden sein.

Cetax

#6
Jun 09, 2012, 12:17 pm Last Edit: Jun 09, 2012, 12:22 pm by Cetax Reason: 1
Hi,
ich klink mich mal kurz mit ein, ich habe hier die "DS1307RTC.h" ist das die selbe wie Eure ("DS1307.h") ?
Wenn nicht, wo bekomm ich Eure her ? Kann mir die jemand per PM schicken ?

Danke und Grüße aus LG
*greatz*

 CeTax

www dot blinkmann dot de


Knippi

ich habe es hin bekommen.
Es war in der void setup (DS1307_Test) mit eingebunden. Allerdings musste ich noch zwei Werte ändern, damit er die neue Zeit und das Datum neu setzt.
Den Wert in der Zeile " RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));" von 54 auf 55 ändern und den Wert in der Zeile "RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));" von 54 auf 5 ändern. Dann wird wie in dem u.a. Sketch das Datum und die Zeit auf 06.09.2012 02:14:00 gesetzt. Aber warum das so ist, kann ich nicht sagen, vielleicht hat einer eine Erklärung dafür.

Wie bekomme ich nun eigentlich das Datum und die Zeit anstelle des Serial Monitors, auf ein LCD-Display angezeigt?
Was für Befehle bzw. Befehlsfolgen brauche ich dafür?
Gruß [font=Verdana]Jens[/font]

Code: [Select]
[quote]
[color=#7E7E7E]// #############################################################################[/color]
[color=#7E7E7E]// #[/color]
[color=#7E7E7E]// # Scriptname : DS1307_Test.pde[/color]
[color=#7E7E7E]// # Author     : Peter Schmelzer, Oliver Kraus[/color]
[color=#7E7E7E]// # Date       : 2011-04-08[/color]

[color=#7E7E7E]// # Editor     : Lauren from DFRobot[/color]
[color=#7E7E7E]// # Date       : 30.12.2011[/color]

[color=#7E7E7E]// # Description:[/color]
[color=#7E7E7E]// # Test file for the DS1307new library. Assumes that you have a DS1307 [/color]
[color=#7E7E7E]// # connected to the I2C-Bus of your Arduino and that it has a battery backup.[/color]
[color=#7E7E7E]// # Update the library and sketch to compatible with IDE V1.0 and earlier[/color]

[color=#7E7E7E]// # Version    : 1.0[/color]
[color=#7E7E7E]// #############################################################################[/color]
[color=#7E7E7E]// *********************************************[/color]
[color=#7E7E7E]// INCLUDE[/color]
[color=#7E7E7E]// *********************************************[/color]
#include <[color=#CC6600]Wire[/color].h>                       [color=#7E7E7E]// For some strange reasons, Wire.h must be included here[/color]
#include <[color=#CC6600]DS1307new[/color].h>

[color=#7E7E7E]// *********************************************[/color]
[color=#7E7E7E]// DEFINE[/color]
[color=#7E7E7E]// *********************************************[/color]

[color=#7E7E7E]// *********************************************[/color]
[color=#7E7E7E]// VARIABLES[/color]
[color=#7E7E7E]// *********************************************[/color]
uint16_t startAddr = 0x0000;            [color=#7E7E7E]// Start address to store in the NV-RAM[/color]
uint16_t lastAddr;                      [color=#7E7E7E]// new address for storing in NV-RAM[/color]
uint16_t TimeIsSet = 0xaa55;            [color=#7E7E7E]// Helper that time must not set again[/color]

[color=#7E7E7E]// *********************************************[/color]
[color=#7E7E7E]// SETUP[/color]
[color=#7E7E7E]// *********************************************[/color]
[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]()
{
  [color=#CC6600]pinMode[/color](2, [color=#006699]INPUT[/color]);                    [color=#7E7E7E]// Test of the SQW pin, D2 = INPUT[/color]
  [color=#CC6600]digitalWrite[/color](2, [color=#006699]HIGH[/color]);                [color=#7E7E7E]// Test of the SQW pin, D2 = Pullup on[/color]

  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](9600);

[color=#7E7E7E]/*[/color]
[color=#7E7E7E]   PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!![/color]
[color=#7E7E7E]                  NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0[/color]
[color=#7E7E7E]                  TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF[/color]
[color=#7E7E7E]                  ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56![/color]
[color=#7E7E7E]*/[/color]
  RTC.[color=#CC6600]setRAM[/color](0, (uint8_t *)&startAddr, sizeof(uint16_t));[color=#7E7E7E]// Store startAddr in NV-RAM address 0x08 [/color]

[color=#7E7E7E]/*[/color]
[color=#7E7E7E]   Uncomment the next 2 lines if you want to SET the clock[/color]
[color=#7E7E7E]   Comment them out if the clock is set.[/color]
[color=#7E7E7E]   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK[/color]
[color=#7E7E7E]   AFTER SETTING THE CLOCK ONCE.[/color]
[color=#7E7E7E]*/[/color]
[color=#7E7E7E]//  TimeIsSet = 0xffff;[/color]
[color=#7E7E7E]//  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));  [/color]

[color=#7E7E7E]/*[/color]
[color=#7E7E7E]  Control the clock.[/color]
[color=#7E7E7E]  Clock will only be set if NV-RAM Address does not contain 0xaa.[/color]
[color=#7E7E7E]  DS1307 should have a battery backup.[/color]
[color=#7E7E7E]*/[/color]
  RTC.[color=#CC6600]getRAM[/color]([color=yellow]55[/color], (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  [color=#CC6600]if[/color] (TimeIsSet != 0xaa55)
  {
    RTC.[color=#CC6600]stopClock[/color]();
        
    RTC.[color=#CC6600]fillByYMD[/color]([color=yellow]2012,6,9[/color]);
    RTC.[color=#CC6600]fillByHMS[/color]([color=yellow]02,14,0[/color]);
    
    RTC.[color=#CC6600]setTime[/color]();
    TimeIsSet = 0xaa55;
    RTC.[color=#CC6600]setRAM[/color]([color=yellow]5[/color], (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.[color=#CC6600]startClock[/color]();
  }
  [color=#CC6600]else[/color]
  {
    RTC.[color=#CC6600]getTime[/color]();
  }

[color=#7E7E7E]/*[/color]
[color=#7E7E7E]   Control Register for SQW pin which can be used as an interrupt.[/color]
[color=#7E7E7E]*/[/color]
  RTC.[color=#CC6600]ctrl[/color] = 0x00;                      [color=#7E7E7E]// 0x00=disable SQW pin, 0x10=1Hz,[/color]
                                        [color=#7E7E7E]// 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz[/color]
  RTC.[color=#CC6600]setCTRL[/color]();

  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"DS1307 Testsketch"[/color]);
  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"Format is \"hh:mm:ss dd-mm-yyyy DDD\""[/color]);

  uint8_t MESZ;

  MESZ = RTC.[color=#CC6600]isMEZSummerTime[/color]();
  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"MEZ=0, MESZ=1 : "[/color]);
  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color](MESZ, [color=#006699]DEC[/color]);    
  [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]();
}
.....

Knippi

ich bin es nochmal.
Der Ausschnitt aus dem Sketch war nicht korrekt übertragen.
Anbei ein neuer Ausschnitt:

Code: [Select]
// INCLUDE
// *********************************************
#include <Wire.h>                       // For some strange reasons, Wire.h must be included here
#include <DS1307new.h>

// *********************************************
// DEFINE
// *********************************************

// *********************************************
// VARIABLES
// *********************************************
uint16_t startAddr = 0x0000;            // Start address to store in the NV-RAM
uint16_t lastAddr;                      // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55;            // Helper that time must not set again

// *********************************************
// SETUP
// *********************************************
void setup()
{
  pinMode(2, INPUT);                    // Test of the SQW pin, D2 = INPUT
  digitalWrite(2, HIGH);                // Test of the SQW pin, D2 = Pullup on

  Serial.begin(9600);

/*
   PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!!
                  NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0
                  TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF
                  ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56!
*/
  RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08

/*
   Uncomment the next 2 lines if you want to SET the clock
   Comment them out if the clock is set.
   DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
   AFTER SETTING THE CLOCK ONCE.
*/
//  TimeIsSet = 0xffff;
//  RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t)); 

/*
  Control the clock.
  Clock will only be set if NV-RAM Address does not contain 0xaa.
  DS1307 should have a battery backup.
*/
  RTC.getRAM(55, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
  if (TimeIsSet != 0xaa55)
  {
    RTC.stopClock();
       
    RTC.fillByYMD(2012,6,9);
    RTC.fillByHMS(02,14,0);
   
    RTC.setTime();
    TimeIsSet = 0xaa55;
    RTC.setRAM(5, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
    RTC.startClock();
  }
  else
  {
    RTC.getTime();
  }

michael_x

#10
Jun 09, 2012, 03:16 pm Last Edit: Jun 09, 2012, 04:43 pm by michael_x Reason: 1
Quote
Wie bekomme ich nun eigentlich das Datum und die Zeit anstelle des Serial Monitors, auf ein LCD-Display angezeigt?
Was für Befehle bzw. Befehlsfolgen brauche ich dafür?


Schau dir die LiquidCrystal Beispiele an, das hat nichts mit DS1307 und Uhrzeit zu tun, sondern handelt von normalem Text.
Statt Serial.print() mit lcd.print() und entsprechender Initialisierung, vorher.

olikraus

Hallo Zusammen

Ich wollte mich kurz (als einer der Autoren der eingangs erwähnten Lib) melden.

Die Lib befindet sich hier: http://code.google.com/p/ds1307new/

Die Anleitung hier: http://code.google.com/p/ds1307new/wiki/Reference

Quote
Ich habe auch mal den Sketch DS1307_Monitor geladen, nur sagt mir die Ausgabe am Serial Monitor "DS1307 Monitor (enable Lf/CR, type 'h' for help)" gar nichts

In der Tat ist dieser Sketch mehr als nur ein einfaches Beispiel, sondern man kann über den Befehl
Code: [Select]
s yyyy-mm-dd hh:mm:ss 
Datum und Uhrzeit über den Serial Monitor einstellen. Wenn man also die aktuelle Uhrzeit einstellen will, dann wäre dies:
Code: [Select]
s 2012-06-10 19:40:00 

Was das LCD betrifft, wäre es auch denkbar M2TKLIB (http://code.google.com/p/m2tklib/) zu verwenden. Mit Hilfe von M2TKLIB können Dialogboxen zur Eingabe von Informationen (hier von Datum und Uhrzeit) programmiert werden. Beispielsweise wäre hier der Code für die Eingabe der Uhrzeit.

Oliver

Code: [Select]
/* edit time dialog */

uint8_t td_hour;
uint8_t td_min;
uint8_t td_sec;

void td_get_from_RTC(void)
{
  RTC.getTime();
  td_hour = RTC.hour;
  td_min = RTC.minute;
  td_sec = RTC.second;
}

void td_put_to_RTC(void)
{
  RTC.getTime();
  RTC.fillByHMS(td_hour, td_min, td_sec);
  RTC.setTime();
  RTC.startClock(); 
}

void td_ok_fn(m2_el_fnarg_p fnarg)
{
  td_put_to_RTC();
  m2.setRoot(&el_top);
}

M2_U8NUM(el_td_hour, "c2", 0,23,&td_hour);
M2_LABEL(el_td_sep1, NULL, ":");
M2_U8NUM(el_td_min, "c2", 0,59,&td_min);
M2_LABEL(el_td_sep2, NULL, ":");
M2_U8NUM(el_td_sec, "c2", 0,59,&td_sec);

M2_LIST(list_time) = { &el_td_hour, &el_td_sep1, &el_td_min, &el_td_sep2, &el_td_sec };
M2_HLIST(el_time, NULL, list_time);

M2_ROOT(el_td_cancel, NULL, "cancel", &el_top);
M2_BUTTON(el_td_ok, NULL, "ok", td_ok_fn);
M2_LIST(list_td_buttons) = {&el_td_cancel, &el_td_ok };
M2_HLIST(el_td_buttons, NULL, list_td_buttons);

M2_LIST(list_td) = {&el_time, &el_td_buttons };
M2_VLIST(el_top_td, NULL, list_td);

Knippi

Danke schon mal für die Infos.
Ich habe nun das Problem mit der Uhrzeit und dem Datum dank der Hilfe hier im Forum gelöst.
Nun habe ich eine neue Frage, bei der ich nicht weis ob ich dafür einen neuen Beitrag erstellen muß/soll oder ob ich hier einfach weiter meine Fragen stellen soll :~
Die Frage hat allerdings auch mit dem DS1307 zu tun.
Ich stelle diese einfach mal und hoffe, dass mir einer behilflich sein kann.
Ich schalte zur einer bestimmten Uhrzeit den Ausgang Pin 13 mit einer angeschlossenen LED auf High und 15 sec. später wieder auf Low. Nach einer weiteren 1 min.+15 sec. wieder auf High. Nun bleibt der Ausgang bis zum nächsten Durchlauf in ca. 23 Stunden +ein paar zerhackte auf High. Trenne ich aber in der Zeit die Stromversorgung des Arduino und verbinde die Stromversorgung wieder bleibt der Ausgang auf Low.
Speichert der Arduino den letzten Zustand des Ausgangs nicht oder muss ich etwas in dem Sketch ändern?
Gruß [font=Verdana]Jens[/font]
Code: [Select]
  if (RTC.get(DS1307_HR, false) == 1 &&
      RTC.get(DS1307_MIN, false) == 50 &&
      RTC.get(DS1307_SEC, false) == 15){
     digitalWrite (13, HIGH);
     digitalWrite (9, LOW);
  }
  if (RTC.get(DS1307_HR, false) == 1 &&
      RTC.get(DS1307_MIN, false) == 50 &&
      RTC.get(DS1307_SEC, false) == 30){
      digitalWrite (13, LOW);
      digitalWrite (9, HIGH);
}
if (RTC.get(DS1307_HR, false) == 1 &&
      RTC.get(DS1307_MIN, false) == 51 &&
      RTC.get(DS1307_SEC, false) == 45){
     digitalWrite (13, HIGH);
     digitalWrite (9, LOW);
}
}

sth77

Du wertest ja exakte Zeiten aus, in der ersten if-Anweisung bei 01:50:15. Stell dir vor, du machst ein Reset und der arduino stertet um 01:50:17. Was passiert? Natürlich nichts - weil ja die Bedingung nicht erfüllt ist. Die if-Anweisungen müssen folglich umgestellt werden, dass es nach oder gleich 01:50:15 und noch vor 01:50:30.
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Knippi

moin moin aus dem Norden,
ich versuche nun schon seit einigen Tagen eine Lösung für mein Problem zu finden. Ich möchte die Uhrzeit/Datum aus dem Serial Monitor auf meinem Display zur Anzeige zu bringen. Es handelt sich um folgendes Display: http://tronixstuff.wordpress.com/2011/03/12/the-dfrobot-lcd4884-lcd-shield/.
michael_x hatte geschrieben:
Quote
Schau dir die LiquidCrystal Beispiele an, das hat nichts mit DS1307 und Uhrzeit zu tun, sondern handelt von normalem Text.
Statt Serial.print() mit lcd.print() und entsprechender Initialisierung, vorher.

Muß man alle "Serial" mit dem Wort "lcd" austauschen und was ist mit einer Initialisierung gemeint?
Ich habe ein paar Beispiel-Sketche mit dem Display ausprobiert und habe Texte in verschiedenen Zeilen/Spalten geschrieben und es hat funktioniert, nur leider komme ich nicht auf den Dreh, wie das mit der Uhrzeit/Datum funktionieren soll.
Ich habe mal einen Sketch für einen Text auf dem Display mit angehängt.
Gruß [font=Verdana]Jens[/font][/b]
Code: [Select]
/*
  &object:Ultrasonic Ranging and display the distance in LCD4884
  &LCD4884 connections Specification:
    Power Supply: 5V
    SPI Interface (using Arduino Digital Pin 2,3,4,5,6)
    One Reset button
    Backlit control (Arduino DIO Pin 7)
for more detial see the picture 

&Ultrasonic connection Specification:
*Vcc pin to  +5
*Trig pin to digital pin 12
*Echo pin to digital pin 13
fuction of this exampla :get the distance  data from HCS-RO4 and display in LCD4884
Any suggestions are welcome.upload the code to Arduino and you will see "Dis_CM:0XX"
notice :if you before you try to call lcd.LCD_write_string to display a value ,you should read  "LCD4884.ccp first"
E-mail:support@sainsmart.com
*/
#include <LiquidCrystal.h>

#include "LCD4884.h"y
#include "SainSmart.h"
#include "SainSmart_chinese.h"



void setup()
{

 
  //confign 4884
  lcd.LCD_init();
  lcd.LCD_clear();
  lcd.backlight(ON);//Turn on the backlight

  //lcd.backlight(OFF); // Turn off the backlight 
}


/* loop */

void loop()
{
  SainSmart();
}

/* menu functions */
// waiting for center key press



void SainSmart(){

 
// nomber_s[4]=char(123);
  lcd.LCD_write_string( 3, 2, "Hallo brauche", MENU_NORMAL);
  lcd.LCD_write_string(10, 5, "Hilfe :-)", MENU_HIGHLIGHT );
  //waitfor_OKkey();


}




Go Up