Echtzeituhr : RTC RV8523 funktioniert nicht ? Was mache ich falsch ?

Hallo Leute,
ich bin neu im Gebiet der Elektronik und Programmierung. Vielleicht kann mir der eine oder andere ja helfen?

Es geht um folgendes:

Ich habe eine Wortuhr gebaut, die soweit auch funktioniert. Wenn ich den Strom abstecke, hat er die Uhrzeit verloren. Das heißt, ich müsste immer wenn ich den Strom abstecke, die Uhrzeit neu hochladen… Dann funktioniert es wieder.

Bei der Programmierung ist das RCT-Modul auch nicht farbig… muss es farbig sein ?

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RV8523.h>

Heißt es dann, dass es das RTC-Modul nicht erkennt ?
Wie kann ich weiter vorgehen ? Habe ich etwas in der Library falsch gemacht?

Vielleicht kann mir ja jemand helfen ?

Beste Grüße

joaofernando

Wie sollen wir dir helfen, wenn wir deinen Sketch nicht kennen.

Poste den bitte hier.

Nimm dazu die Code-Tags, damit dieser besser lesbar ist.

Bei der Programmierung ist das RCT-Modul auch nicht farbig... muss es farbig sein ?

Die Farbgebung in der IDE ist in einer der vielen keywords.txt festgelegt. Das hat keinen Einfluss auf die Funktion.

Habe ich etwas in der Library falsch gemacht?

Da du sowohl Schaltplan, als auch Code geheim hältst, wird man dir, in dieser Sache, nicht helfen können. Meine Kristallkugel ist gerade in Urlaub.

joaofernando: Habe ich etwas in der Library falsch gemacht?

Am besten postest Du Deine Fragen nochmal in einem Hellseher-Forum!

Woher sollen wir wissen, was Du gemacht, programmiert, oder nicht gemacht und nicht programmiert hast?

hi,

war da nicht was, daß manche beispielsketches bei jedem neustart die zeit der RTC setzen.?
daß man also einmal beim sketch hochladen das uhrzeit-setzen drinläßt, es dann rausnimmt und den sketch nochmals hochlädt?

wie schreibst Du jetzt die richtige uhrzeit?

gruß und willkommen,
stefan

Echtzeituhr = Real Time Clock = RTC

Wäre nett, wenn Du das in #0 (Dein erster Beitrag) in der Überschrift (Subject) ändern würdest, dann hat man eine bessere Chance zu verstehen, was Du willst.

Willkommen im Forum!

Mein Sketch für die Einstellung der Uhrzeit:

/*
  RV8523 RTC (Real-Time-Clock) Example

  Uno       A4 (SDA), A5 (SCL)
  Mega      20 (SDA), 21 (SCL)
  Leonardo   2 (SDA),  3 (SCL)
  
  Note: To enable the I2C pull-up resistors on the RTC-Breakout, the jumper J1 has to be closed.
 */

#include <Wire.h>
#include <RV8523.h>


RV8523 rtc;


void setup()
{
  //init Serial port
  Serial.begin(9600);
  while(!Serial); //wait for serial port to connect - needed for Leonardo only

  //init RTC
  Serial.println("Init RTC...");

  //set 12 hour mode
  rtc.set12HourMode();

  //set 24 hour mode
  // rtc.set24HourMode();

  //set the date+time (only one time)
  rtc.set(0, 9, 1, 17, 01, 2016); //08:00:00 24.12.2014 //sec, min, hour, day, month, year

  //stop/pause RTC
  // rtc.stop();

  //start RTC
  rtc.start();

  //When the power source is removed, the RTC will keep the time.
  rtc.batterySwitchOver(true); //battery switch over on

  //When the power source is removed, the RTC will not keep the time.
  // rtc.batterySwitchOver(0); //battery switch over off
}


void loop()
{
  uint8_t sec, min, hour, day, month;
  uint16_t year;

  //get time from RTC
  rtc.get(&sec, &min, &hour, &day, &month, &year);

  //serial output
  Serial.print("\nTime: ");
  Serial.print(hour, DEC);
  Serial.print(":");
  Serial.print(min, DEC);
  Serial.print(":");
  Serial.print(sec, DEC);

  Serial.print("\nDate: ");
  Serial.print(day, DEC);
  Serial.print(".");
  Serial.print(month, DEC);
  Serial.print(".");
  Serial.print(year, DEC);

  //wait a second
  delay(1000);
}

Ich lade zuerst die Uhrzeit hoch und anschließend den anderen Sketch. Wenn ich jetzt das Netzteil gleichzeitig dran habe und die USB-Verbindung entferne, funktioniert es einwandfrei. Da ich aber nicht jedes Mal wenn die Uhr ausgesteckt wird, das Programm erneut hochladen will, brauche ich eine Lösung.

OK ich sehe ein, dass meine Angaben sehr schwammig waren. Hier ein paar Details:

Mein Sketch:

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RV8523.h>

RV8523 rtc;

#define RGBLEDPIN    6

// 114 LED's für jeden Buchstaben eine.
#define N_LEDS 114

Adafruit_NeoPixel led = Adafruit_NeoPixel(N_LEDS, RGBLEDPIN, NEO_GRB + NEO_KHZ800);

uint32_t farbe = led.Color(230, 230, 230);

// Definition der Wörter
// Jede Zahl steht für die Position im Led led. 
// -1 schließt das Wort ab. 

int ES[] = {0,1,-1};
int IST[] = {3,4,5,-1};

int NACH[] = {33,34,35,36,-1};
int VOR[] = {41,42,43,-1};
int HALB[] = {44,45,46,47,-1};
int UHR[] = {99,100,101,-1};

int FUENF_NV[] ={7,8,9,10,-1};
int ZEHN_NV[] = {18,19,20,21,-1};
int ZWANZIG_NV[] = {11,12,13,14,15,16,17,-1};
int VIERTEL_NV[] = {26,27,28,29,30,31,32,-1};


int EINS[] = {62,63,64,65,-1};
int ZWEI[] = {55,56,57,58,-1};
int DREI[] = {66,67,68,69,-1};
int VIER[] = {73,74,75,76,-1};
int FUENF[] = {51,52,53,54,-1};
int SECHS[] = {83,84,85,86,87,-1};
int SIEBEN[] = {88,89,90,91,92,93,-1};

int ACHT[] = {77,78,79,80,-1};
int NEUN[] = {103,104,105,106,-1};
int ZEHN[] = {106,107,108,109,-1};
int ELF[] = {77,78,79,-1};
int ZWOELF[] = {94,95,96,97,98,-1};

// Definition der Eck LEDs

int PLUS_EINS[] = {111,-1};
int PLUS_ZWEI[] = {111,112,-1};
int PLUS_DREI[] = {111,112,113,-1};
int PLUS_VIER[] = {111,112,113,110,-1};


uint8_t sekunde, minute, stunde, tag, monat;
uint16_t jahr;

void setup(){
  led.begin();
  
  // LED Helligkeit set
  led.setBrightness(30);  
  led.show();
  
  // RTC Modul starten.
  rtc.start();
  rtc.batterySwitchOver(1);
  rtc.get(&sekunde, &minute, &stunde, &tag, &monat, &jahr);
  
}


void loop(){

  rtc.get(&sekunde, &minute, &stunde, &tag, &monat, &jahr);
   // Bei Endung der Minutenanzahl mit 1 und 6 LED LINKS OBEN 
     if(minute == 1) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
     if(minute == 6) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
      if(minute == 11) {
     schreibeWort(PLUS_EINS,farbe);
     
   }

  if(minute == 16) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 21) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 26) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 31) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 36) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 41) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 46) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 51) {
     schreibeWort(PLUS_EINS,farbe);
     
   }
  if(minute == 56) {
     schreibeWort(PLUS_EINS,farbe);
     
   }

   // Bei Endung der Minutenanzahl mit 2 und 7 LED LINKS und RECHTS OBEN 
   if(minute == 2) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
     if(minute == 7) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
      if(minute == 12) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }

  if(minute == 17) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 22) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 27) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 32) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 37) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 42) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 47) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 52) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }
  if(minute == 57) {
     schreibeWort(PLUS_ZWEI,farbe);
     
   }


     // Bei Endung der Minutenanzahl mit 3 und 8 LED LINKS und RECHTS OBEN und RECHTS UNTEN 
        if(minute == 3) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
     if(minute == 8) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
      if(minute == 13) {
     schreibeWort(PLUS_DREI,farbe);
     
   }

  if(minute == 18) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 23) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 28) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 33) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 38) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 43) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 48) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 53) {
     schreibeWort(PLUS_DREI,farbe);
     
   }
  if(minute == 58) {
     schreibeWort(PLUS_DREI,farbe);
     
   }

 
    // Bei Endung der Minutenanzahl mit 4 und 9 ALLE LEDS IN ECKEN AN (LINKS und RECHTS OBEN + LINKS und RECHTS UNTEN) 
        if(minute == 4) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
     if(minute == 9) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
      if(minute == 14) {
     schreibeWort(PLUS_VIER,farbe);
     
   }

  if(minute == 19) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 24) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 29) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 34) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 39) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 44) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 49) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 54) {
     schreibeWort(PLUS_VIER,farbe);
     
   }
  if(minute == 59) {
     schreibeWort(PLUS_VIER,farbe);
     
   }

  // Es ist wird immer geschrieben... 
  schreibeWort(ES,farbe);
  schreibeWort(IST,farbe);
  
  // Uhrzeit vor der nächsten vollen stunde
  // Bspw. 3:40 wird zu 20 vor 4
  if (minute >= 30)  stunde++;
   
  // Fünf vor oder Nach   
  if(((minute >= 5) && (minute < 10)) || ((minute >= 55)  && (minute <= 59))) {
     schreibeWort(FUENF_NV,farbe);
     schreibe_vor_oder_nach();
  }
   
  // Zehn vor oder Nach
  if(((minute >= 10) &&  (minute < 15) ) ||(( minute >= 50) && (minute < 55))) {
     schreibeWort(ZEHN_NV,farbe);
     schreibe_vor_oder_nach();
  }
   
  // Fünfzehn vor oder Nach
  if(((minute >= 15) && (minute < 20)) || ((minute >= 45) && (minute < 50 ))) {
     schreibeWort(VIERTEL_NV,farbe);
     schreibe_vor_oder_nach();
  } 
   
  // Zwanzig vor oder nach
  if(((minute >= 20) && (minute < 25)) || ((minute >= 40) && (minute < 45)) ) {
     schreibeWort(ZWANZIG_NV,farbe);
     schreibe_vor_oder_nach();
  }
   
  // Fünf vor oder nach halb 
  if(((minute < 30) && (minute >= 25)) || ((minute >= 35 ) && (minute < 40)) ) {
     schreibeWort(FUENF_NV,farbe);
     schreibeWort(HALB,farbe);
     // Speziealfall 
     if (minute <= 29) 
      schreibeWort(VOR,farbe);
     else
      schreibeWort(NACH,farbe);
  } 
 
  if (minute == 30){
    schreibeWort(HALB,farbe);
  }
 
  // Die Stunde ausgeben
  switch(stunde){
    case 1:
     schreibeWort(EINS, farbe);
    break;
    case 2:
     schreibeWort(ZWEI, farbe);
    break;
    case 3:
     schreibeWort(DREI, farbe);
    break;
    case 4:
     schreibeWort(VIER, farbe);
    break;
    case 5:
     schreibeWort(FUENF, farbe);
    break;
    case 6:
     schreibeWort(SECHS, farbe);
    break;
    case 7:
     schreibeWort(SIEBEN, farbe);
    break;
    case 8:
     schreibeWort(ACHT, farbe);
    break;
    case 9:
     schreibeWort(NEUN, farbe);
    break;
    case 10:
     schreibeWort(ZEHN, farbe);
    break;
    case 11:
     schreibeWort(ELF, farbe);
    break;
    case 12:
     schreibeWort(ZWOELF, farbe);
    break;    
  }
  
  // Schreibe UHR zu jeder vollen Stunde.
  if (minute == 0){ 
    schreibeWort(UHR,farbe);
  }
  if (minute == 1){ 
    schreibeWort(UHR,farbe);
  }
  if (minute == 2){ 
    schreibeWort(UHR,farbe);
  }
  if (minute == 3){ 
    schreibeWort(UHR,farbe);
  }
  if (minute == 4){ 
    schreibeWort(UHR,farbe);
  }
  
  delay(30000);
  led.clear();
}

// Hilfsfunktion ist es vor oder nach?
void schreibe_vor_oder_nach(){
  if (minute <= 29) 
    schreibeWort(NACH,farbe);
  else
    schreibeWort(VOR,farbe);
}
 
// Hilfsfuntion zum schreiben der Wörter
void schreibeWort(int arrWort[], uint32_t intColor){
  for(int i = 0; i < led.numPixels() + 1; i++){
    if(arrWort[i] == -1){
      led.show();
      break;
    }else{
      led.setPixelColor(arrWort[i],intColor);
    }
  }
}

Hallo,

ich habe für meine Wortuhr die RTC DS3231 benutzt. Da ist eine Stützbatterie mit drauf und ich habe diese Probleme nicht.

Gruss Kalli

jurs: Am besten postest Du Deine Fragen nochmal in einem Hellseher-Forum!

Im Hellsehen sind wir doch gar nicht so schlecht hier :)

Zeigt die Uhr denn eine korrekte Zeit an, nachdem sie gestellt wurde? Hast du die Batterie eingesetzt?

Zeige uns mal einen Link deiner RTC.

Und ändere bitte die Überschrift deine Post #0 in RTC, wie agmue schon geschrieben hat.

Ich vermute einen Hardwarefehler, wenn die Urzeit nicht in der RTC "gespeichert" bleibt.

Serenifly: Im Hellsehen sind wir doch gar nicht so schlecht hier :)

Dann starte ich mal einen Versuch: Im Sketch sehe ich rtc.batterySwitchOver(1); und im App-Manual lese ich

The RV-8523 has a battery backup input pin and battery switch-over circuit, which monitors the main power supply and automatically switches to the backup battery when a power failure condition is detected. Accurate timekeeping is maintained even when the main power supply is interrupted. A battery low detection circuit monitors the status of the battery. When the battery voltage goes below a certain threshold value, a flag is set to indicate that the battery must be replaced soon. This ensures the integrity of the data during periods of battery backup.

Die Entwickler haben sich da wohl eine ganze Menge überlegt, was dann auch richtig implementiert werden muß.

Daher wäre der Link zum RV 8523 breadboard schon wichtig.

//set the date+time (only one time)
  rtc.set(0, 9, 1, 17, 01, 2016); //08:00:00 24.12.2014 //sec, min, hour, day, month, year

Hier haben wir doch schon (den richtig vermuteten) Übeltäter! Im Sketch wird jedesmal beim Start des Arduino diese im Code "hartverdrahtete" Uhrzeit gesetzt. Da bringt es dann auch nichts, die Pufferung einzuschalten :smiling_imp:

 //When the power source is removed, the RTC will keep the time.
  rtc.batterySwitchOver(true); //battery switch over on

Lade einmal die Zeit hoch, lass die Pufferung an, dann kommentierst du das Setzen der Uhrzeit mit // vor der Zeile aus und lädst den veränderten Sketch nochmals hoch. Vorausgesetzt, das Modul hat eine Pufferbatterie, sollte es dann funktionieren ;)

So wie ich verstehe hat er zwei Sketches. #6 um die Zeit zu stellen. Und dann #7 für den eigentlichen Betrieb

Braucht man aber nicht unbedingt. Man kann auch das setzen der Uhrzeit in den anderen Sketch packen und es danach auskommentieren.

Ich verwende dieses RTC- Modul (http://www.watterott.com/de/Ultra-Low-Power-Real-Time-Clock-Modul-RTC)

@nix_mehr_frei: Ich habe es so versucht, wie du beschrieben hast. Leider kein Erfolg. Oder was meinst du mit Pufferung anlassen? Pufferbatterie ist eigentlich vorhanden. Glaube langsam, dass das Modul kaputt ist, oder dass etwas mit meinen Lötstellen nicht stimmt.

Danke schonmal für eure Hilfe bisher!! :)

Nochmal die Frage. Hast du eine Batterie eingesetzt?

Wenn ja, vermute ich einen Defekt der RTC.

Kaufe eine neue. Und zwar die DS3231. Die hat sich bewährt und wird von vielen hier eingesetzt.

Die Batterie könnte natürlich auch leer sein.

Ja die Batterie habe ich eingesetzt. Ob die Batterie leer ist werde ich prüfen.

Danke für den Tipp! Ich werde mir die DS3231 besorgen wenn alle Stricke reißen.

Ich würde die DS3231 jetzt schon in China bestellen. Sie kosten da ja keine 2Euro, aber man wartet. Falls du sie nicht jetzt brauchst, dann bei einem der nächsten Projekte.

Hallo zusammen,

Ich habe versucht den Sketch des RTC-Moduls in meinen Sketch für die Wortuhr zu integrieren. Soweit hat es auch ganz gut funktioniert.

Das Positive: Wenn ich die Wortuhr vom Strom nehme und wieder einstecke, zeigt er mir eine Urzeit an.

Das Negative: Es ist die Uhrzeit die ich eingestellt habe. Er springt also immer wieder zurück auf die eingegebene Uhrzeit. Wenn ich den Seriellen Monitor aufrufe, wird mir auch nur diese Uhrzeit angezeigt und es geht nicht weiter.

Ich vermute nicht, dass es am RTC-Modul liegt, sondern an meiner Programmierung. Vielleicht kann mir ja jemand weiterhelfen

Hier mein Code:

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RV8523.h>

RV8523 rtc;

#define RGBLEDPIN    6

// 114 LED's für jeden Buchstaben eine + 4 in den Ecken
#define N_LEDS 114

Adafruit_NeoPixel led = Adafruit_NeoPixel(N_LEDS, RGBLEDPIN, NEO_GRB + NEO_KHZ800);

uint32_t farbe = led.Color(200, 200, 200);

// Definition der Wörter
// Jede Zahl steht für die Position im Led led. 
// -1 schließt das Wort ab. 

int ES[] = {0,1,-1};
int IST[] = {3,4,5,-1};

int NACH[] = {33,34,35,36,-1};
int VOR[] = {41,42,43,-1};
int HALB[] = {44,45,46,47,-1};
int UHR[] = {99,100,101,-1};

int FUENF_NV[] ={7,8,9,10,-1};
int ZEHN_NV[] = {18,19,20,21,-1};
int ZWANZIG_NV[] = {11,12,13,14,15,16,17,-1};
int VIERTEL_NV[] = {26,27,28,29,30,31,32,-1};


int EINS[] = {62,63,64,65,-1};
int ZWEI[] = {55,56,57,58,-1};
int DREI[] = {66,67,68,69,-1};
int VIER[] = {73,74,75,76,-1};
int FUENF[] = {51,52,53,54,-1};
int SECHS[] = {83,84,85,86,87,-1};
int SIEBEN[] = {88,89,90,91,92,93,-1};

int ACHT[] = {77,78,79,80,-1};
int NEUN[] = {103,104,105,106,-1};
int ZEHN[] = {106,107,108,109,-1};
int ELF[] = {77,78,79,-1};
int ZWOELF[] = {94,95,96,97,98,-1};

// Definition der Eck LEDs

int PLUS_EINS[] = {111,-1};
int PLUS_ZWEI[] = {111,112,-1};
int PLUS_DREI[] = {111,112,113,-1};
int PLUS_VIER[] = {111,112,113,110,-1};


uint8_t sekunde, minute, stunde, tag, monat;
uint16_t jahr;

void setup(){
  led.begin();
  
  // LED Helligkeit set
  led.setBrightness(40);  
  led.show();
  
 //init Serial port
  Serial.begin(9600);
  while(!Serial); //wait for serial port to connect - needed for Leonardo only
  
 //init RTC
  Serial.println("Init RTC...");

  //set 12 hour mode
  rtc.set12HourMode();

  //set 24 hour mode
  // rtc.set24HourMode();

  //set the date+time (only one time)
  rtc.set(50, 29, 2, 10, 02, 2016); //08:00:00 24.12.2014 //sec, min, hour, day, month, year

  //stop/pause RTC
  // rtc.stop();

  

  //When the power source is removed, the RTC will not keep the time.
   //rtc.batterySwitchOver(0); //battery switch over off
   
   //start RTC
  rtc.start();
  

  //When the power source is removed, the RTC will keep the time.
   rtc.batterySwitchOver(1); //battery switch over on
}


void loop(){
uint8_t sekunde, min, stunde, tag, monat;
  uint16_t jahr;
 
  //get time from RTC
 rtc.get(&sekunde, &minute, &stunde, &tag, &monat, &jahr);

  //serial output
  Serial.print("\nTime: ");
  Serial.print(stunde, DEC);
  Serial.print(":");
  Serial.print(minute, DEC);
  Serial.print(":");
  Serial.print(sekunde, DEC);

  Serial.print("\nDate: ");
  Serial.print(tag, DEC);
  Serial.print(".");
  Serial.print(monat, DEC);
  Serial.print(".");
  Serial.print(jahr, DEC);


  //wait a second
  delay(1000);
  
  
  // Es ist wird immer geschrieben... 
  schreibeWort(ES,farbe);
  schreibeWort(IST,farbe);
  
//DER REST HAT NICHT MEHR HINGEPASST


}