DCF RTC LCD klok
10 berichten
• Pagina 1 van 1
DCF RTC LCD klok
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)
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
Re: DCF RTC LCD klok
- 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.
Re: DCF RTC LCD klok
Leuke sensor heb je gemaakt.
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?
- 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?
Re: DCF RTC LCD klok
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).
Re: DCF RTC LCD klok
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.
En waar zie je de 30 microseconden, gaarne uitleg, de delay is toch 190 milliseconden?
Re: DCF RTC LCD klok
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
Re: DCF RTC LCD klok
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.
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.
Re: DCF RTC LCD klok
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.
Re: DCF RTC LCD klok
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."
10 berichten
• Pagina 1 van 1
Terug naar Afgeronde projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten