Probleem(pje) met RTC

Arduino specifieke Software
Gebruikers-avatar
Berichten: 111
Geregistreerd: 01 Jun 2016, 20:14

Probleem(pje) met RTC

Berichtdoor ruudhot » 26 Sep 2019, 17:52

Hallo Allen,

Ik heb een klein probleempje, wat ik niet begrijp.
Als ik bijgevoegde sketch upload naar de Arduino met een DS3231 RTC dan wordt de tijd en datum van de PC overgenomen.
Dit gaat goed, maar als ik de Serial monitor start, dan staat de tijd stil.
Het zou toch zo moeten zijn dat de RTC in de loop, iedere keer de nieuwe tijd en datum van de PC over moet nemen?
En dan zou de tijd dus goed moeten staan (maar die staat dus stil).
Ook de hele RTC staat stil, want als ik 10 minuten later de sketch upload, met de regel 23 uit, dan begint de RTC weer te lopen, maar loopt 10 minuten op de PC achter.
Als ik dit doe met de handmatige regel, dan zou ik het begrijpen, want iedere keer wordt dan alles gereset naar de ingegeven waarden.

Ook begrijp ik niet waarom de beide "instel"regels wel in de loop werken, maar NIET in het setup deel.

Kan iemand mij bijpraten?

Hier de code:

Code: Alles selecteren
#include <Wire.h>
#include "RTClib.h"
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {

  Serial.begin(9600);
  delay(3000); // wait for console opening
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}
void loop () {
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  DateTime now = rtc.now();
  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  Serial.print("   ");
  Serial.print(now.year(), DEC);
  Serial.print('-');
  if (now.month() < 10)
  {
    Serial.print("0");
    Serial.print(now.month(), DEC);
  }
  else {
    Serial.print(now.month(), DEC);
  }
  Serial.print('-');
  if (now.day() < 10)
  {
    Serial.print("0");
    Serial.print(now.day(), DEC);
  }
  else {
    Serial.print(now.day(), DEC);
  }
  Serial.print("   ");
  if (now.hour() < 10)
  {
    Serial.print("0");
    Serial.print(now.hour(), DEC);
  }
  else {
    Serial.print(now.hour(), DEC);
  }
  Serial.print(':');
  if (now.minute() < 10)
  {
    Serial.print("0");
    Serial.print(now.minute(), DEC);
  }
  else {
    Serial.print(now.minute(), DEC);
  }
  Serial.print(':');
  if (now.second() < 10)
  {
    Serial.print("0");
    Serial.print(now.second(), DEC);
  }
  else {
    Serial.print(now.second(), DEC);
  }
  Serial.println();
  delay(1000);
}

Advertisement

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

Re: Probleem(pje) met RTC

Berichtdoor shooter » 26 Sep 2019, 18:29

in setup heb je ze uitgezet, terwijl ze daar aan zouden kunnen staan, als je het de eerste keer programmeert.
in de loop moet adjust juist uitstaan want anders wordt er telkens een oude tijd in de 3231 gezet.
in de setup staat if lost power, en dus moet er dan een nieuwe tijd ingezet worden, en als het batterijtje aangesloten is dan hoef je dat maar een keer te doen.
dan ga je in de loop de tijd opvragen en er mee spelen.

ofwel als er // voor staat is de regel een commentaar dus werkt deze niet.
en nee de tijd wordt niet gesyncroniseerd maar gezet op een datum die in adjust staat.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 111
Geregistreerd: 01 Jun 2016, 20:14

Re: Probleem(pje) met RTC

Berichtdoor ruudhot » 26 Sep 2019, 19:33

Bedankt Shooter,

Ja, van die // dat weet ik.
Ik heb ze in principe overal vóór staan, en haal ze weg als ik een regel actief wil maken.

Het "probleem" is wat lastig uit te leggen.
Ik stel eerst de tijd met de handmatige regel in (dus op 2014 en 3 uur).
Als ik dat in setup doe, dan werkt dat niet.
In de loop wel, en dan staat de tijd datum dus inderdaad op 2014 en 3 uur.

Vervolgens maak ik met // de handmatige regel inactief, en haal de // bij de regel weg die de computer tijd en datum overneemt.
Wederom werkt dit NIET als ik dat in de setup doe, maar WEL in de loop.
Dan upload ik de sketch naar de Arduino.
Dan gaan de tijd en datum naar de computer tijd en datum.
MAAR, dan staat de RTC stil.

De RTC gaat pas weer lopen als de regel weer inactief maak, en nogmaals upload.
En dat laatste vindt ik vreemd, omdat ik zou verwachten dat de RTC steeds weer de nieuwe tijd van de computer over zou nemen (die wel doorloopt).
Ik weet dat de RTC stil staat omdat steeds dezelfde tijd wordt geprint in de serial monitor, en als ik na 10 minuten de goede versie weer upload, dan loopt de RTC 10 minuten achter op de PC.

Gebruikers-avatar
Berichten: 111
Geregistreerd: 01 Jun 2016, 20:14

Re: Probleem(pje) met RTC

Berichtdoor ruudhot » 26 Sep 2019, 19:35

En als aanvulling:

Deze regel: rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); neemt de computer tijd/datum aan.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Probleem(pje) met RTC

Berichtdoor Koepel » 26 Sep 2019, 20:22

Als de Arduino IDE de sketch compileert, dan wordt de GCC compiler gebruikt.
Die compiler weet de datum en tijd van de computer dat moment.
Als je wilt kun je die gebruiken, dat is __DATE__ en __TIME__.
Dat zijn vaste stukken tekst die de datum en tijd van het compileren zijn.

Stel dat je op de computer de sketch hebt gecompileerd op 26 september 2019 om 20:19.
Dat gaat de rtc.adjust(DateTime(F(__DATE__), F(__TIME__)) dus iedere keer die tijd er in schrijven.
Dat mag natuurlijk nooit in de loop(). Dat soort dingen kan alleen eenmalig in setup() als de RTC nog niet loopt.

Ik ben niet zo op de hoogte van de Adafruit RTClib. Er is een verschil tussen de tijd zetten voor de RTClib en de tijd zetten in de DS3231 zelf.

Gebruikers-avatar
Berichten: 111
Geregistreerd: 01 Jun 2016, 20:14

Re: Probleem(pje) met RTC

Berichtdoor ruudhot » 26 Sep 2019, 20:36

Bedankt Koepel,

OK, begrepen dat de tijd dus niet iedere keer opnieuw geschreven wordt.

Heb ik nog wel het probleem dat de 2 regels NIET werken in de setup, maar wel in de loop.
Komt dat omdat de RTC al loopt?

Als ik het in de loop doe, dan werkt het wel.
Daarna de // snel plaatsen en weer uploaden naar de Arduino.
Dan werkt het goed, het is alleen heel moeilijk om een tijd te kiezen om er in te zetten, zodat na de tweede keer uploaden de tijd goed uitkomt.

Gebruikers-avatar
Berichten: 111
Geregistreerd: 01 Jun 2016, 20:14

Re: Probleem(pje) met RTC

Berichtdoor ruudhot » 26 Sep 2019, 20:46

Als aanvulling:

Hoe zet de tijd in de RTC, zodat hij / zij direct gaat lopen daarna?
Kan dat met die handmatige regel?
Laatst gewijzigd door ruudhot op 26 Sep 2019, 20:58, in totaal 1 keer gewijzigd.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Probleem(pje) met RTC

Berichtdoor Koepel » 26 Sep 2019, 20:57

De rtc.lostPower() kijkt of de RTC loopt of helemaal nog niet loopt.
Als je de tijd wilt zetten als het al loopt, dan kun je een regel in setup() gebruiken met rtc.adjust() en eenmalig even de '//' weghalen. Maar dat moet werken in setup().

Als iets niet werkt, dan kun je even een voorbeeld proberen dat Adafruit zelf er bij geeft: https://github.com/adafruit/RTClib/blob/master/examples/ds3231/ds3231.ino.

Heb je zo'n goedkope DS3231 module met een verkeerd laadcircuit en een verkeerde batterij ?

Gebruikers-avatar
Berichten: 111
Geregistreerd: 01 Jun 2016, 20:14

Re: Probleem(pje) met RTC

Berichtdoor ruudhot » 26 Sep 2019, 20:59

Net geprobeerd.
In de loop wordt de tijd wel in de RTC gezet, maar de klok loopt niet.
En in de setup werkt het niet.

Kortom: Wat doe je als de RTC loopt, en de klok wijkt een paar minuten af?


Hoe weet ik of ik een foute batterij heb (LIR2032) en fout laadcircuit?
Hij was wel goedkoop.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Probleem(pje) met RTC

Berichtdoor Koepel » 26 Sep 2019, 22:29

Het kan een slechte verbinding zijn of een slechte module of de batterij is stuk gegaan door het verkeerde laad-circuit.
Kun je nieuwe draden proberen en bij een breadboard een andere positie op het breadboard proberen ?

De DS3231 geeft weinig problemen, maar het afgelopen half jaar las ik op forums toch wel eens over problemen met de DS3231.

Jouw DS3231 chip is waarschijnlijk wel "echt", maar van een mindere kwaliteit die niet de fabriek had mogen verlaten.
https://blog.heypete.com/2017/07/29/a-look-inside-the-ds3231-real-time-clock/.

Die goedkope DS3231 modules hebben een diode en een weerstand als laadcircuit.
Als je een LIR2032 hebt gekocht, dan ben je er in gestonken. Bij 5V wordt die teveel opgeladen, met risico van ontploffen en brand. Maar het was wel goedkoop :twisted:
Je kunt die diode of die weerstand er af halen en er een gewone batterij in doen.
Je kunt die diode en die weerstand er op laten zitten, en een supercap van 5V van 0.1F tot 1F er in solderen in plaats van de batterij.

Hier is de weerstand weggehaald: https://campercontrol.org/step-1-assembling-control-box/modifying-rtc-module/.
Ik heb bij een module de diode weggehaald en een gewone batterij gebruikt, en bij een andere module er een supercap ingezet.

Bij Adafruit gebruiken ze een DS3231 die op de normale manier de fabriek heeft verlaten. En ze gaan vanzelfsprekend geen dubieus laadcircuit gebruiken. Daar betaal je voor: https://www.adafruit.com/product/3013.

Een klok die een paar minuten afwijkt is iets anders dan een klok die niet loopt.

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten