Go Down

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

michael_x

Tschuldigung, ich hatte vorausgesetzt, du hättest schon die aktuelle RTC Uhrzeit auf dem Serial Monitor angezeigt, und willst diese Anzeige jetzt auf dein LCD Display bringen.
Code: [Select]
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC; // kann sein, dass das bei deiner RTC library anders geht ...
DateTime now;


const char LOGFORMAT[] = "%02u.%02u.%04u %02u:%02u:%02u";

void loop()  {
    now=RTC.now(); // kann sein, dass das bei deiner RTC library anders geht ...
...
    static char dataString[20];
    sprintf(dataString, LOGFORMAT,
       now.day(), now.month(), now.year(),now.hour(),now.minute(),now.second() );

    Serial.println(dataString); // Oder statt dessen  auf's LCD
... 
}

Knippi

danke michael_x,
für mich ist es als Neuling noch sehr schwierig alles zu verstehen. Ich habe mir mittlerweile auch ein Buch bestellt "Arduino Praxiseinstieg" von Thomas Brühlmann um das alles besser zu erlernen.
Nun aber wieder zur Materie zurück: Ich habe im Post #14 (1Seite) ein Sketch mit angefügt, der mir für mein Display Texte im Display anzeigt. Schreibe ich da nun den Code rein, wie du ihn geschrieben hast? Also praktisch die  #include.... vor der void setup; RTC_DS1307 RTC...DateTime...const char... in die void setup und die void loop Daten natürlich in die void loop oder? Vielleicht kannst du es ja einmal da mit einbauen (wenn es da überhaupt rein gehört), damit ich es verstehen kann wie so etwas aufgebaut ist.

Quote
Serial.println(dataString); // Oder statt dessen  auf's LCD


Ist damit gemeint, dass ich anstelle von Serial.print lcd.print ersetzen muß?

Quote
RTC_DS1307 RTC; // kann sein, dass das bei deiner RTC library anders geht ...


[quote    now=RTC.now(); // kann sein, dass das bei deiner RTC library anders geht ...][/quote]

Ich habe eine DS1307.h, ist das eine library und wofür sind die?

Gruß [font=Verdana]Jens[/font]

michael_x

Quote
Quote
now=RTC.now(); // kann sein, dass das bei deiner RTC library anders geht ...]

Ich habe eine DS1307.h, ist das eine library und wofür sind die?


"xyz.h" sind die sog. include - Dateien, in denen die Funktionsdeklarationen stehen.
Eine library hat in der Regel noch eine "xyz.cpp" Datei dazu, wo der eigentliche Programmcode der library drin steht.
( Im Prinzip das gleiche wie in deiner .ino Datei, kannst du dir anschauen und auch ändern, wenn du was zu verbessern findest )

Dem Namen nach ist DS1307.h wohl auch eine Library für den DS3107 Baustein. Im Examples Verzeichnis findest du dann passenden Beispielcode zum Verstehen lernen und kopieren.
( Ich nehm https://github.com/adafruit/RTClib, aber im Endeffekt geben die sich wohl nicht viel, da sie die Daten vom gleichen Baustein über die gleiche Schnittstelle  <Wire.h>  kriegen. )

Das gleiche gilt für die LCD library. Da verwendest du auch eine andere als ich (http://arduino.cc/en/Reference/LiquidCrystal), daher sind im Einzelfall evtl. unterschiedliche Funktionsaufrufe zu parametrieren. Aber ob der anzuzeigende Text nun "Hallo" oder "12:30:40" ist, ist der LCD library egal. (Selbst dass man den ersten nicht so oft neu schreiben muss, ist der library egal. Das ist deine Sache).

lcd.LCD_write_string(10, 5, "Hilfe :-)", MENU_HIGHLIGHT );    wird dann wohl
lcd.LCD_write_string(10, 5, dataString, MENU_HIGHLIGHT );
..., wenn ich mal rate, dass 10,5 die Stelle auf dem Display und MENU_HIGHLIGHT eine Farbe oder "Fettigkeit" sein wird.


Knippi

OK, danke habe ich soweit verstanden. 10,5 + MENU_HIGHLIGHT ist die Position und der Text wird schwarz hinterlegt.

Quote
Schreibe ich da nun den Code rein, wie du ihn geschrieben hast? Also praktisch die  #include.... vor der void setup; RTC_DS1307 RTC...DateTime...const char... in die void setup und die void loop Daten natürlich in die void loop oder?


Aber es bleibt immer noch die Frage mit den anderen Befehlen #unclude... von dem RTC. Müssen diese mit in den Sketch von dem Display-Sketch?
Gruß Jens

Knippi

Ich habe mal versucht es in den Sketch einzubauen.

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"
#include <Wire.h>
#include <RTClib.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 

  RTC_DS1307 RTC; // kann sein, dass das bei deiner RTC library anders geht ...
DateTime now;
const char LOGFORMAT[] = "%02u.%02u.%04u %02u:%02u:%02u";

}


/* loop */

void loop()
{
  SainSmart();
  now=RTC.now(); // kann sein, dass das bei deiner RTC library anders geht ...
static char dataString[20];
    sprintf(dataString, LOGFORMAT,
       now.day(), now.month(), now.year(),now.hour(),now.minute(),now.second() );
}

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



void SainSmart(){

 
// nomber_s[4]=char(123);
  lcd.LCD_write_string(10, 5, dataString, MENU_HIGHLIGHT );
  //waitfor_OKkey();


}




Doch irgendwie will es nicht und es kommt zu einer Fehlermeldung "RTC_DS1307' was not declared in this scope"


michael_x

Du hast mal ( in reply 9...11) die  ds1307new  Library verwendet und nach der Hilfe von olikraus

Quote
Die Lib befindet sich hier: http://code.google.com/p/ds1307new/
Die Anleitung hier: http://code.google.com/p/ds1307new/wiki/Reference

...auch Erfolg gehabt, dachte ich.


Ganz generell bezieht sich der Fehler  "RTC_DS1307' was not declared in this scope"
auf die Zeile

  RTC_DS1307 RTC;

Damit versuchst du, eine Variable namens RTC zu deklarieren, die vom Typ RTC_DS1307 sein soll.
Dieser Datentyp ( oder class in c++ ) sollte in der library definiert worden sein.  (Ist er aber wohl nicht, in deinem Fall)

Wenn ich deine Beispiele von früher richtig verstehe, nimmt dir die <ds1307new.h> das schon ab und bringt bereits ein RTC Objekt mit, das du gleich mit
RTC.get( ) verwenden kannst ???

Besteht dein Sketchbook aus meheren Dateien, wo die eine ds1307new.h und die andere rtclib.h  "includiert " ?
Da du nur insgesamt einen Uhrenbaustein hast, kann das nur Probleme geben...

Wer ist eigentlich SainSmart() ?

Ich verstehe dein Problem so, dass du anfangs noch Probleme mit Beispielen zu einer Library hattest.
Halt die Sketche klein und versuch die Examples einzeln zu verstehen, dann die einfachsten zu kombinieren.

Im Prinzip gilt:
alle #include an den Anfang, dann alle anderen #define und globalen Variablen, dann beide setup() zusammen und beide loop() Beispiele sinnvoll miteinander verbinden. (z.B. Der RTC Teil erzeugt ein char array[] und der LCD Teil gibt es dann aus ... )

Wie du merkst, bin ich zu faul mir deine libraries zusammenzusuchen und es selbst zu machen. Ich hoffe es hilft trotzdem (ein bisschen)  ;)

Ach, und noch eins: Nach vielem Hin und Her und Download und Install  hat man schon mal Dateien mit gleichen Namen, aber verschiedenen Inhalts, evtl. an verschiedenen Stellen ( einmal unter c:\user und einmal unter c:\programme oder so )
(ging mir jedenfalls mal so) Arduino meckert nicht, sondern nimmt einfach die Falschen. Gar nicht erst rauskriegen wollen, welche tatsächlich verwendet wird, sondern weg mit dem Mist ( zumindest umbenennen ;)

Webmeister

Ich bin der Autor des erwähnten Buches "Arduino Praxiseinstieg" und verfolge diesen Thread.

Es scheint mir dass Knippi bei der Lösung mit dem DS1307 verschiedene Bibliotheken und deren Code durcheinander bringt.

Die bisherige Standardbibliothek welche mit DS1307.h eingebunden wird, habe ich in meinem Buch beschrieben. Mit der neuen Arduino-IDE 1.0 funktioniert diese Bibliothek leider nicht mehr.  =(

Eine erweiterte Bibliothek "ds1307new" ist bereits erwähnt:
http://code.google.com/p/ds1307new/

Diese neue Bibliothek ist aber nicht ein 1:1-Ersatz für die Bisherige. Anhand der Beispiele ist dieser Bibliothek etwas komplexer und für Anfänger recht kompliziert. Die Library wird mit folgendem Aufruf in den Code geladen:

Quote

#include <Wire.h>
#include <DS1307new.h>


Auch erwähnt wurde in diesem Thread bereits die Library von Adafruit, welche unter folgender Adresse zu finden ist:
https://github.com/adafruit/RTClib

Diese Bibliothek wird mit so in den Code eingefügt:

Quote

#include <Wire.h>
#include "RTClib.h"


Die RTClib ist für Einsteiger recht einfach zu nutzen. Die Beispiele sind relativ kurz und gut verständlich. Zu beachten ist dass die Zeit via einer einzelnen Codezeile gesetzt wird und dazu das Compilierungsdatum verwendet.

Quote

// following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));


Aus dem Thread sehe ich nicht wirklich was nun bei Knippi bereits läuft und was nicht. Zu beachten ist nämlich dass die Codebeispiele der verschiedenen Bibliotheken jeweils nur zu den zugehörigen Bibliotheken passen. Code mixen geht hier nicht.

Plötzlich kommt auch noch ein mit Code für ein LC-Display ins Spiel. Ich empfehle Knippi zuerst ein Codebeispiel mit dem Uhrenbaustein zum Laufen zu bringen. Am besten macht man dazu die Ausgabe auf den seriellen Monitor.

Falls man mit der bisherigen DS1307-Library weiterarbeiten will, ist im folgenden Thread ein Link zu einer aktualisierten DS1307-Library angegeben. Diese Bibliothek funktioniert auch mit Arduino 1.0 und ist die einfachste Lösung die ich kenne.

http://arduino.cc/forum/index.php?topic=93077.0

Ich hoffe dass Knippi damit eine einfache Uhr realisieren kann.

Viel Glück

Knippi

moin,moin
ja, webmeister hat recht ich habe wohl mit vielen Bibliotheken versucht irgendwie eine Lösung zu finden und dabei mal hier und da ein paar Befehle mit copy+paste völlig den Überblick verloren. Wahrscheinlich ein typischer Anfängerfehler.
Ich finde es cool, das sich auch der Autor meines bestellten Buches hier mit einbringt. Ich bin erst bei Kapitel 4, aber mir ist nun schon einiges Verständlicher geworden. Danke schon mal.
Nun nochmal zu michael_x:
Ich habe nun erstmal die RTClib in die libraries kopiert und dann einen neuen Sketch geöffnet. Danach habe ich mal deinen Code reinkopiert. Leider kommt immer eine Fehlermeldung: 'LOGFORMAT' was not declared in this scope.
Code: [Select]
#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 RTC; // kann sein, dass das bei deiner RTC library anders geht ...
DateTime now;

void setup(){
 
const char LOGFORMAT[] = "%02u.%02u.%04u %02u:%02u:%02u";
}

void loop()  {
    now=RTC.now(); // kann sein, dass das bei deiner RTC library anders geht ...
   
  static char dataString[20];
    sprintf(dataString, LOGFORMAT, now.day(), now.month(), now.year(),now.hour(),now.minute(),now.second() );
       
   Serial.println(dataString); // Oder statt dessen  auf's LCD

Was ist hier das Problem?
Danke.
Gruß [font=Verdana]Jens[/font]

mkl0815

Die Definition von "LOGFORMAT" muss ausserhalb der Funktion setup() erfolgen. Sonst ist es nur eine lokale Variable die nur innerhalb von setup() bekannt ist.
Also das
Code: [Select]
const char LOGFORMAT[] = "%02u.%02u.%04u %02u:%02u:%02u";

einfach vor setup() { ...} setzen.

Knippi

Hat alles geklappt.  :D Danke.
Gibt es eigenlich die Möglichkeit, im "LOGFORMAT" das Datum und die Uhrzeit getrennt auszulesen und damit im Display diese beiden Formate in getrennten Zeilen anzeigen zu lassen?
[font=Verdana]Jens[/font]

mkl0815

Ja, einfach 2 Strings erzeugen  :)
Code: [Select]

const char DATEFORMAT[] = "%02u.%02u.%04u";
const char TIMEFORMAT[] = "%02u:%02u:%02u";
...
void loop() {

...
  static char dateString[11];
    sprintf(dateString, DATEFORMAT, now.day(), now.month(), now.year);
  static char timeString[9];
    sprintf(timeString, TIMEFORMAT, now.hour(),now.minute(),now.second() );

Serial.println(dateString); // Oder statt dessen  auf's LCD
Serial.println(timeString); // Oder statt dessen  auf's LCD


Webmeister

#26
Jun 21, 2012, 11:04 am Last Edit: Jun 21, 2012, 11:07 am by Webmeister Reason: 1
Quote
Gibt es eigenlich die Möglichkeit, im "LOGFORMAT" das Datum und die Uhrzeit getrennt auszulesen


Dann machst du eigene Formate für Uhr und Datum, basierend auf dem Beispiel

Code: [Select]

const char LOGFORMATDATE[] = "%02u.%02u.%04u";
const char LOGFORMATTIME[] = "%02u:%02u:%02u";


Und bei der Ausgabe einfach nur die nötigen Werte übergeben, also

Code: [Select]

static char dataStringDate[11];
sprintf(dataStringDate, LOGFORMATDATE, now.day(), now.month(), now.year() );
static char dataStringTime[9];
sprintf(dataStringTime, LOGFORMATTIME, now.hour(),now.minute(),now.second() );




Update: mkl0815 war schneller
;)

Knippi

Wofür sind die Zahlen in den eckigen Klammern und kann man diese frei wählen?

Quote
static char dateString[11];

mkl0815

dataStringDate und dataStringTime sind Arrays vom Typ "character" (also ein Zeichen). Die Zahl gibt an, wie groß der "Container", also das Array sein soll. Die 11 kommt wiefolgt zustande: 2 Zeichen für den Tag, zwei Zeichen für den Montat und 4 Zeichen für das Jahr, dazu noch die zwei Punkte, das macht schon mal 10 Zeichen. Das 11 Zeichen wird benötigt, weil in C/C++ Strings (Zeichenketten) mit einer 0 (der Wert Null, nicht das Zeichen "0") terminiert werden. Somit muss man sich nicht immer merken, wie lang eine Zeichenkette ist. Bei der Verarbeitung wird immer so lange gelesen, bis man den Wert "0" findet.

Knippi

Danke für die Erklärung.
Ich habe gesehen, dass man mit der DS1307new auch den Wochentag mit angezeigt bekommt. Kann man so etwas auch mit der RTClib und wenn ja, wie funktioniert das?
[font=Verdana]Jens[/font]

Go Up