DCF RTC LCD klok

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 12
Geregistreerd: 24 Jan 2021, 20:37
Woonplaats: Bovenkarspel

DCF RTC LCD klok

Berichtdoor weirdweb » 11 Feb 2021, 21:51

Nog een bouwsel! Nu wat extra componenten toegevoegd die de Arduino aanstuurd.

In dit project zijn (naast de Arduino nano) een RTC module met de DS3231 chip, een DCF77 ontvanger en een LCD gebruikt.
Op de RTC module heb ik de diode losgesoldeerd die naar de knoopcel gaat zodat er een gewone niet oplaadbare in past.

Ook is m'n 3D printer ingezet om de behuizing te maken.

Voor iets meer info en foto's zie mijn website (Weird Science Web)

Code: Alles selecteren
#include <DCF77.h>
#include <DS3231.h>
#include <LiquidCrystal.h>

#define DCF_PIN 2
#define DCF_INTERRUPT 0
#define SYNC_BUTTON_PIN 7 // Synchronize button with pull down resistor.

const char *weekDayName[] = { "Zon", "Maa", "Din", "Woe", "Don", "Vrij", "Zat" }; // In Dutch
const char *monthName[] = { "Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"}; // In Dutch
bool h12, PM, century = false;

DS3231 Clock;
DCF77 DCF = DCF77( DCF_PIN, DCF_INTERRUPT );
time_t DCFtime;
LiquidCrystal lcd( 12, 11, 6, 5, 4, 3 );

void setup()
{
   lcd.begin( 16, 2 );
   Wire.begin();
   delay( 1000 );

   pinMode( SYNC_BUTTON_PIN, INPUT );

   // Start synchronizing when RTC is powered up for the very first time.
   if( Clock.getDate() == 1 && Clock.getMonth( century ) == 1 && Clock.getYear() == 0 ) {
      synchronizeDCF();
   }
}

void loop()
{
   // Start synchronizing every day at 3:00 AM or anytime when the synchronize button is pushed.
   if(( Clock.getHour( h12, PM ) == 3 && Clock.getMinute() == 0 ) || digitalRead( SYNC_BUTTON_PIN ) == HIGH ) {
      synchronizeDCF();
   }
   displayCRTTime();
   delay( 190 ); // Delay for a swift display response but no need for faster
}

void synchronizeDCF()
{
   int i, limit;

   DCF.Start();
   delay( 1000 );
   limit = Clock.getMinute() - 1;

   if( limit == -1 )
   {
      limit = 59;
   }

   do
   {
      for( i = 0; i < 10; i++ )
      {
         lcd.setCursor( 14, 0 );
         lcd.print( !digitalRead( DCF_PIN ) ? char( 219 ) : char( 165 ) ); // Show the pulses from the DCF77 transmitter.
         delay( 98 );
      }
      DCFtime = DCF.getTime(); // Gets the time through interrupt signals
      displayCRTTime(); // Update display anyway, even if there isn't a current time available
   } while( DCFtime == 0  &&    Clock.getMinute() != limit ); // try synchronizing for 59 minutes8

   lcd.setCursor( 14, 0 );
   if( DCFtime != 0 )
   {
      setTime( DCFtime );
      setCRTTime();
      lcd.print( " " );
   }
   else
   {
      lcd.print( "X" ); // Marker on the LCD to show that there was no synchronization possible
   }
   DCF.Stop();
}

void displayCRTTime() {
   char buf[17];

   sprintf( buf, "%2d:%02d:%02d", Clock.getHour( h12, PM ), Clock.getMinute(), Clock.getSecond() );
   lcd.setCursor( 4, 0 );
   lcd.print( buf );

   sprintf( buf, "%-4s %2d %s 2%d%02d", weekDayName[Clock.getDoW() - 1], Clock.getDate(),  monthName[Clock.getMonth( century ) - 1], century > 0 ? 1 : 0, Clock.getYear() );
   lcd.setCursor( 0, 1 );
   lcd.print( buf );
}

void setCRTTime()
{
   Clock.setSecond( second() );
   Clock.setMinute( minute() );
   Clock.setHour( hour() );
   Clock.setDoW( weekday() );
   Clock.setDate( day() );
   Clock.setMonth( month() );
   Clock.setYear( year() - 2000 );
}

Advertisement

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: DCF RTC LCD klok

Berichtdoor ctunes » 20 Apr 2021, 22:29

Code: Alles selecteren
   Wire.begin();
   delay( 1000 );


Code: Alles selecteren
#include Arduino.h
#define TAPTAPTAP _NOP

While (!Wire.begin()) TAPTAPTAP;


Scheelt weer een delay() en is interrumpeerbaar.

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

Re: DCF RTC LCD klok

Berichtdoor shooter » 21 Apr 2021, 08:53

de link lijkt niet te werken
paul deelen
shooter@home.nl

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: DCF RTC LCD klok

Berichtdoor ctunes » 04 Mei 2021, 21:44

Leuke sensor heb je gemaakt.

Code: Alles selecteren
delay( 190 ); // Delay for a swift display response but no need for faster


Is het echt nodig de processor op volle kracht te laten draaien?

Als het display op 60 Hz werkt, waarom dan wel buiten elke 30 microseconden de buffer updaten?

Gebruikers-avatar
Berichten: 12
Geregistreerd: 24 Jan 2021, 20:37
Woonplaats: Bovenkarspel

Re: DCF RTC LCD klok

Berichtdoor weirdweb » 06 Mei 2021, 14:19

shooter schreef:de link lijkt niet te werken


Je bedoelt naar m'n website?
Die wijst naar mijn NAS thuis. Het kan wel eens voorkomen dat de verbinding off-line is.
Je krijgt wel een self signed SSL certificate toegestuurd. Iedere browser vindt dat eng, dus gaat daarover zeuren.
Je kunt daar een uitzondering voor maken (als je mij durft te vertrouwen).

Gebruikers-avatar
Berichten: 12
Geregistreerd: 24 Jan 2021, 20:37
Woonplaats: Bovenkarspel

Re: DCF RTC LCD klok

Berichtdoor weirdweb » 06 Mei 2021, 14:29

ctunes schreef:Leuke sensor heb je gemaakt.

Code: Alles selecteren
delay( 190 ); // Delay for a swift display response but no need for faster


Is het echt nodig de processor op volle kracht te laten draaien?

Als het display op 60 Hz werkt, waarom dan wel buiten elke 30 microseconden de buffer updaten?


Het is inderdaad niet nodig om de processor op volle kracht te laten draaien, maar ik ben mij van geen kwaad bewust. :? 8-)

En waar zie je de 30 microseconden, gaarne uitleg, de delay is toch 190 milliseconden?

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: DCF RTC LCD klok

Berichtdoor ctunes » 06 Mei 2021, 22:23

weirdweb schreef:
En waar zie je de 30 microseconden, gaarne uitleg, de delay is toch 190 milliseconden?


Je hebt gelijk, ik zat uit m'n nek te ouwe****

delay(190) komt neer op ca 5,3 Hz.

Dus vijf keer per seconde update je iets dat eigenlijk slechts 1 keer per seconde getoond hoeft te worden.

Ik geloof dat ik daarop "triggerde" en dat vervolgens mijn ratio me in de steek liet.

Sorry
;)

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: DCF RTC LCD klok

Berichtdoor ctunes » 06 Mei 2021, 22:43

Maar stel nou, stel hè, jij gaat jouw klokje verkopen.

1 miljoen keer.

Als je sleep() implementeert, en daarmee 1mAh stroom kan besparen, dan is dat toch: 1000000 x 0.001 = 1000 Ah.

Misschien een druppel, maar die helpt wel de plaat langer te laten gloeien.

Althans, zo zie ik het.

"Groen" programmeren is ook maar een keuze uiteindelijk.

Gebruikers-avatar
Berichten: 12
Geregistreerd: 24 Jan 2021, 20:37
Woonplaats: Bovenkarspel

Re: DCF RTC LCD klok

Berichtdoor weirdweb » 07 Mei 2021, 07:04

ctunes schreef:Maar stel nou, stel hè, jij gaat jouw klokje verkopen.

1 miljoen keer.

Als je sleep() implementeert, en daarmee 1mAh stroom kan besparen, dan is dat toch: 1000000 x 0.001 = 1000 Ah.

Misschien een druppel, maar die helpt wel de plaat langer te laten gloeien.

Althans, zo zie ik het.

"Groen" programmeren is ook maar een keuze uiteindelijk.


De eerste aanname gaat niet gebeuren, ik ga mijn brouwsels nooit verkopen, geen behoefte aan.
Iedereen die dit klokje wil nabouwen kan de plannen (ook de STL files van de behuizing) van mijn website halen.
Dat laat ik geheel vrij voor een ieder die er iets mee wil gaan doen, ook eventuele verbeteringen.

De sleep() implementeren vind ik heel interessant, thx voor de tip, ik ga spitten...
Kan dan ook voor m'n Berlijn klok worden toegepast, die werkt op nagenoeg dezelfde code.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: DCF RTC LCD klok

Berichtdoor ctunes » 08 Mei 2021, 23:17

weirdweb schreef:
ctunes schreef:Maar stel nou, stel hè, jij gaat jouw klokje verkopen.

1 miljoen keer..


De eerste aanname gaat niet gebeuren, ik ga mijn brouwsels nooit verkopen, geen behoefte aan.
Iedereen die dit klokje wil nabouwen kan de plannen (ook de STL files van de behuizing) van mijn website halen.
Dat laat ik geheel vrij voor een ieder die er iets mee wil gaan doen, ook eventuele verbeteringen.

Dat gebeurt misschien nog wel vaker dan 1 miljoen keer, en vaak wordt een (verkeerd) voorbeeld zonder (verder) nadenken nagedaan.
Dus blijft mijn argumentatie valide.

De sleep() implementeren vind ik heel interessant, thx voor de tip, ik ga spitten...
Kan dan ook voor m'n Berlijn klok worden toegepast, die werkt op nagenoeg dezelfde code.


De 86/168/328 heeft ook nog een interne oscillator die op 128kHz kan draaien, snel genoeg voor jouw toepassing, en waaruit het heel eenvoudig een 1 seconde timer van kan maken.

Als je dit allemaal meeneemt, dan kan jouw klok ettelijke jaren draaien op 2 AA batterijen.

"Off Grid", om maar eens een factor te "hypen."

;)

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten