Klok slaat per 2 minuten 1 seconden over.

Arduino specifieke Software
Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Klok slaat per 2 minuten 1 seconden over.

Berichtdoor Hans van Kampen » 04 Dec 2020, 23:01

Beste forumleden.

Terugkomende op mijn klok die ik middels een Arduino Mega-2560 op een 32x64 RGB led matrix paneel projecteer samen met een RTC-1307 tijd module kwam ik er achter dat hij niet zo nauwkeurig loopt.

In c.a. een maand tijd loopt hij 4 minuten voor en zag sinds kort dat om de 2 minuten er een seconden wordt over geslagen, heel on willekeurig. Zo springt die van 39 naar 41 seconden en 2 minuten later van bijv. 13 naar 15, steeds om de 2 minuten valt er een seconden uit.

Hieronder de sketch die ik van het web heb over genomen via Great Projects RGB led Matrix Clock.

Wat ik jammer vind is dat er niet is gekozen voor een een DCF-77 moduul i.p.v. een RTC-1307. ik heb ook niet de kennis helaas die daarvoor te vervangen.

Heb al naarstig gezocht hier of iemand ook zo’n probleem ondervond maar kan niets vinden :-(

Weet iemand raad?
Dank alvast!

De code:

#include <Adafruit_GFX.h> // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library
#include <MD_DS1307.h>
#include <Wire.h>
#define CLK 11 // USE THIS ON ARDUINO MEGA
#define OE 9
#define LAT 10
#define A A0
#define B A1
#define C A2
#define D A3

RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false, 64);
// Global variables
#define MAX_MESG 4
#define MAX_MES 20
unsigned int NewRTCh = 24;
unsigned int NewRTCm = 60;
unsigned int NewRTCs = 60;
char szTime[12]; // mm:ss\0
char szMesg[MAX_MESG+1] = "";
char szDate[MAX_MES+1] = "";
char *mon2str(uint8_t mon, char *psz, uint8_t len)
// Get a label from PROGMEM into a char array
{
static const char str[][4] PROGMEM =
{
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

*psz = '\0';
mon--;
if (mon < 12)
{
strncpy_P(psz, str[mon], len);
psz[len] = '\0';
}

return(psz);
}

char *dow2str(uint8_t code, char *psz, uint8_t len)
{
static const char str[][10] PROGMEM =
{
"Su", "Mo", "Tu", "We",
"Th", "Fr", "Sa"
};

*psz = '\0';
code--;
if (code < 7)
{
strncpy_P(psz, str[code], len);
psz[len] = '\0';
}

return(psz);
}
void getTime(char *psz, bool f = true)
// Code for reading clock time
{

RTC.readTime();
if (NewRTCh != RTC.h)
{
sprintf(psz, "%02d", RTC.h);
matrix.setCursor(2, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(7, 0, 7));
matrix.fillRect(2, 4, 64, 14, matrix.Color333(0, 0, 0));
matrix.print(szTime);
sprintf(psz, "%02d", RTC.m);
matrix.setCursor(28, 4);
matrix.setTextColor(matrix.Color333(7, 0, 7));
matrix.fillRect(25, 4, 25, 14, matrix.Color333(0, 0, 0));
matrix.print(szTime);
matrix.setCursor(21, 4);
matrix.setTextColor(matrix.Color333(7, 0, 0));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(7, 7, 0));
matrix.fillRect(52, 9, 11, 7, matrix.Color333(0, 0, 0));
sprintf(psz, "%02d", RTC.s);
matrix.print(szTime);
getDate(szDate);
matrix.setCursor(5, 20);
matrix.fillRect(5, 20, 54, 8, matrix.Color333(0, 0, 0));
uint8_t y = 0;
for (y=0; y<10; y++) {
matrix.setTextColor(Wheel(y));
matrix.print(szDate[y]);
}
getDay(szMesg);
matrix.setTextSize(1);
matrix.setCursor(52, 1);
matrix.setTextColor(matrix.Color333(0, 7, 0));
matrix.fillRect(52, 1, 11, 7, matrix.Color333(0, 0, 0));
matrix.print(szMesg);
NewRTCh=RTC.h;
}
else if (NewRTCm != RTC.m)
{
sprintf(psz, "%02d", RTC.m);
matrix.setCursor(28, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(7, 0, 7));
matrix.fillRect(25, 4, 25, 14, matrix.Color333(0, 0, 0));
matrix.print(szTime);
matrix.setCursor(21, 4);
matrix.setTextColor(matrix.Color333(0, 0, 7));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(0, 7, 7));
sprintf(psz, "%02d", RTC.s);
matrix.fillRect(52, 9, 11, 7, matrix.Color333(0, 0, 0));
matrix.print(szTime);
NewRTCm=RTC.m;
}
else if (NewRTCs != RTC.s/10)
{
matrix.setCursor(21, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(0, 7, 0));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(0, 0, 7));
sprintf(psz, "%02d", RTC.s);
matrix.fillRect(52, 9, 11, 7, matrix.Color333(0, 0, 0));
matrix.print(szTime);
NewRTCs=RTC.s/10;
}
else
{
matrix.setCursor(21, 4);
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color333(0, 0, 7));
matrix.fillRect(25, 8, 2, 6, matrix.Color333(0, 0, 0));
matrix.print(f ? ':' : ' ');
matrix.setCursor(52, 9);
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color333(7, 0, 0));
sprintf(psz, "%02d", RTC.s);
matrix.fillRect(58, 9, 5, 7, matrix.Color333(0, 0, 0));
matrix.print(szTime);
}
}
void getDate(char *psz)
// Code for reading date
{
char szBuf[10];
sprintf(psz, "%02d%s%04d", RTC.dd, mon2str(RTC.mm, szBuf, sizeof(szBuf)-1), RTC.yyyy);
}
void getDay(char *psz)
// Code for reading day date
{
dow2str(RTC.dow, szMesg, MAX_MESG);
}

void setup() {

matrix.begin();
matrix.setTextWrap(false);
RTC.control(DS1307_CLOCK_HALT, DS1307_OFF);
RTC.control(DS1307_12H, DS1307_OFF);
}

void loop() {
static uint32_t lastime = 0; // millis() memory
static bool flasher = false; // seconds passing flasher
if (millis() - lastime >= 1000)

{
lastime = millis();
getTime(szTime, flasher);
flasher = !flasher;
}

}


// Input a value 0 to 24 to get a color value.
// The colours are a transition r - g - b - back to r.
uint16_t Wheel(byte WheelPos) {
if(WheelPos < 2) {
return matrix.Color333(0, 7, 0);
} else if(WheelPos < 5) {
WheelPos -= 2;
return matrix.Color333(7 , 0, 0);
} else {
WheelPos -= 5;
return matrix.Color333(0, 7, 0);
}
}

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor shooter » 05 Dec 2020, 12:13

zet jouw timer eens op 500 ipv 1000 want nu kan het voorkomen dat het lijkt alsof er een seconde overgeslagen wordt.
dan doet het display er dus 0,5 seconde update.
je zet iedere loop de lastime op 0 en dat is niet slim.
paul deelen
shooter@home.nl

Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor Hans van Kampen » 05 Dec 2020, 22:38

Dank Paul, ik ga ermee aan de slag.

Ik heb niets van de sketch zelf geschreven hoor maar geheel over genomen en vond het nogal slordig die overslaande seconden om de 2 minuten.

Ik heb deze origineel getoonde sketch wel ge customized omdat ik geen jaartal aanduiding wilde en de dag voor de datum gezet en kleuren aangepast maar in de originele boven genoemde sketch wordt ook die seconden over geslagen.

Ik laat het resultaat weten.

Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor Hans van Kampen » 06 Dec 2020, 16:40

Paul,

Hartstikke bedankt weer voor je hulp. Ik heb je voorgestelde wijziging aangebracht in die van het web ge-uploade sketch en nou wordt er geen seconden aanduiding over geslagen.

Mooi zou zijn geen RTC-1307 tijdmodule te gebruiken maar een DCF-77. De eerder genoemde moet je via de seriele monitor van de Arduino IDE instellen en uploaden en wijkt dan na verloop van tijd toch weer af maar goed.

De klok doet het.

Ik ben op Arduino gebied meer een na bouwer maar ben wel aardig op weg. Als ik zo'n sketch van de klok dan zie is er nog veel abra ca dabra voor me maar maak me de taal wel meester.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor shooter » 07 Dec 2020, 17:50

laat die tijdmodule gewoon erin, en zet er een dcf bij want, die ontvangt lang niet altijd het signaal voldoende om na 2 minuten de tijd te updaten, dus standaard op je module en dan bijvoorbeeld 1 /dag even naar je dcf loeren.
paul deelen
shooter@home.nl

Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor Hans van Kampen » 07 Dec 2020, 21:47

Hallo Paul,

Je schreef >> laat die tijdmodule gewoon erin, en zet er een dcf bij. <<

Zet ik die dan parallel over de RTC module die ik aan de Arduino laat hangen? Naast de plus en min zal die DCF module ook 2 overige aansluitingen hebben zoals bij die RTC module een SDA en een SCL aansluiting hebben.

Ik moet dan uitvogelen welke van de DCF-77 aan de SDA en SCL aansluiting van de Arduino mega.

Moet er in de sketch ook niet een wijziging worden aangebracht?

Ik vraag mij af of zo’n DCF-77 module niet de zelfde pulsen geeft als de RTC-1307 dan kan je die klakkeloos vervangen.

Dank alvast weer voor meedenken Paul, ik zag nu dat die matrix klok na 24 uur ruim vijf seconden voor loopt dus zou per week c.a. 40 seconden voorlopen zijn en dat vind ik nogal wat.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor shooter » 08 Dec 2020, 15:18

ja 5 seconden is erg veel voor een rtc1307 met adres 104 ofwel 1101000 binair.
de precisie van de 1307 ligt aan het kristal dat gebruikt is. (32768)
ofwel als je meer ic types op dezelfde bus zet dan hebben ze vaak een eigen adres, dus koppelen is geen probleem, de module van reichelt geeft gewoon een puls of niet en die kun je met software dus omzetten naar een juist tijdsignaal en heeft maar 1 ingang nodig en die heb je dan genoeg.
paul deelen
shooter@home.nl

Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor Hans van Kampen » 09 Dec 2020, 23:32

Dank Paul zover voor info.

Kijk iedere avond zelfde tijd naar klok en steeds ruim 5 seconden voor, nu na 3 dagen 16 seconden en is idd veel en valt tegen. Om hem gelijk te zetten weer heel gedoe met aan andere Arduino hangen voorzien van RTC-1307 sketch en via IDE hulpmiddelen > seriële monitor weer instellen en uploaden.

Adres 104 binair 1101000 zoals je schrijft is voor mij abracadabra. Ik begrijp wel dat 104 dat binaire getal geeft net zoals 0001101 het getal 13 maar adres 104??

Ik geloof inderdaad dat de precisie afhangt van kristal en zal niet zo nauwkeurig zijn, wellicht een andere RTC module proberen, kost een paar luttele Eurotjes maar ik blijf het onbegrijpelijk vinden waarom niet meteen een DCF-77 module gebruikt maar goed.

Voorlopig even geen panklare oplossing een DCF-77 module te gebruiken zonder al te veel kennis en software schrijven, ik doe het voorlopig met die RTC-1307.

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor shooter » 10 Dec 2020, 21:21

Volgens het datablad is de precisie gewoon afhankelijk van het gebruikte kristal, en je kun t voor een euro niet te veel verwachten natuurlijk, maar een dergelijke afwijking kun je wel gewoon vast in het prgramma zetten zoals elke 24 uur de tijd pakken en dan plus 4 seconden weer wegschrijven.dat gebeurt zelfs met atoomklokken.
en die 104 is het I2C adres waar je de rtc op kunt vinden, ook uit de datasheet. elke ic familie heeft op die manier zijn eigen adres zodat je een hoop (128) ic's aan 1 bius kunt koppelen.Heeft philips ooit bedacht voor tv. er bestaan vele soorten in zoals beeld en geluid maar ook simpele led drivers etc.

Voor je DCF heb je dus een antenne,versterker, decoder, verwerker nodig, dat kan nu eigenlijk allemaal in 1 IC enals verwerrker een simpele Nano. Bestaan veel ontwerpen voor en simpele library dus dat mag ook geen groot probleem zijn.
alle aanbieders leveren zelfs een softwarelink.
paul deelen
shooter@home.nl

Berichten: 34
Geregistreerd: 15 Mei 2016, 17:44

Re: Klok slaat per 2 minuten 1 seconden over.

Berichtdoor Hans van Kampen » 11 Dec 2020, 00:23

Dank Paul,

Ga het verder uitzoeken en kijken het voor elkaar te krijgen. Je hebt gelijk dat je voor een paar Euro niet te veel kan verwachten.

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Google [Bot] en 14 gasten