Berlijn klok

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

Berlijn klok

Berichtdoor weirdweb » 11 Feb 2021, 22:06

Dit project startte ik nadat deze klok in Berlijn mij weer eens te binnen schoot.
In 1985 heb ik daar een week vanuit school vertoeft en met enige verwondering toen deze klok zien staan die toen nog op de Kurfürstendamm stond.
Deze klok staat nu voor het Europa-Center ongeveer een kilometer verderop.

Dat was een aardige uitdaging om daar wat moois van te maken maar is uiteindelijk gelukt.
Bij dit project is ook de 3D printer ingezet voor de realisatie.

Ook voor dit project staan er op mijn site (Weird Science Web) foto's en nog meer info om deze klok na te kunnen bouwen.

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

#define DCF_PIN 2
#define DCF_INTERRUPT 0
#define LDR_PIN A0 // LDR sensor met 10k pull down weerstand
#define SYNC_BUTTON_PIN 7 // Synchronisatie knop met 10k pull down weerstand

bool h12, PM, century = false, setOnce = true;
int analogValue, secs;

DS3231 Clock;
DCF77 DCF = DCF77( DCF_PIN, DCF_INTERRUPT );
time_t DCFtime;
LedControl lc = LedControl( 12, 11, 10, 1 ); // Pinnen 12, 11, 10 op Arduino aansluiten op pin 1, 13, 12 op de MAX7219

void setup()
{
   pinMode( SYNC_BUTTON_PIN, INPUT );

   Wire.begin();
   delay( 1000 );

   lc.shutdown( 0, false );
   setDisplay();

   // Start synchronisering als RTC voor de eerste keer wordt aangezet
   if( Clock.getDate() == 1 && Clock.getMonth( century ) == 1 && Clock.getYear() == 0 )
   {
      synchronizeDCF();
   }
}

void loop()
{
   // Start synchronisering elke dag om 3:00 AM of meteen nadat de synchronisatie knop is ingedrukt
   if(( Clock.getHour( h12, PM ) == 3 && Clock.getMinute() == 0 ) || digitalRead( SYNC_BUTTON_PIN ) == HIGH )
   {
      synchronizeDCF();
   }
   secs = Clock.getSecond();
   lc.setLed( 0, 2, 7, secs % 2 ); // Seconde aanduiding, laatste LED in de derde rij

   // Set display één keer gedurende de 0 seconde
   if( secs == 0 && setOnce )
   {
      setDisplay();
      setOnce = false;
   }
   if( secs != 0 )
   {
      setOnce = true;
   }
   delay( 99 ); // Kleine delay voor een snelle display response maar niet overdrijven
}

void synchronizeDCF()
{
   int i, limit;

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

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

   do
   {
      for( i = 0; i < 50; i++ )
      {
         lc.setLed( 0, 2, 7, !digitalRead( DCF_PIN )); // Laat de pulsen zien van de DCF77 ontvanger op de seconde LED
         delay( 20 ); // Kleine delay voor een snelle display response maar niet overdrijven
      }
      if( Clock.getSecond() == 0 )
      {
         setDisplay(); // Update display, ook al is er geen huidige tijd zichtbaar
      }
      DCFtime = DCF.getTime(); // Krijgt de tijd door interrupt signalen
   } while( DCFtime == 0  &&    Clock.getMinute() != limit ); // probeer synchronisatie voor 59 minuten

   if( DCFtime != 0 )
   {
      setTime( DCFtime );
      setCRTTime();
   }
   setDisplay();
   DCF.Stop();
}

void setDisplay()
{
   int i, hrs, mins;

   hrs = Clock.getHour( h12, PM );
   mins = Clock.getMinute();
   lc.clearDisplay( 0 );
   analogValue = analogRead( LDR_PIN ) / 73 + 1; // Maak het ADC bereik van 0..1023 naar 1..15
   lc.setIntensity( 0, analogValue ); // Zet display intensiteit volgens omgevingslicht (dimmen in het donker)

   for( i = 0; i < hrs / 5; i++ )
   {
      lc.setLed( 0, 0, i, true ); // Eerste 4 LEDs in eerste rij
   }
   for( i = 0; i < hrs % 5; i++ )
   {
      lc.setLed( 0, 0, i + 4, true ); // laatste 4 LEDs in eerste rij
   }
   for( i = 0; i < mins / 5; i++ )
   {
      if( i < 8 )
      {
         lc.setLed( 0, 1, i, true ); // Alle 8 LEDs in tweede rij
      }
      else
      {
         lc.setLed( 0, 2, i - 8, true ); // Plus 3 laatste LEDs in derde rij
      }
   }
   for( i = 0; i < mins % 5; i++ )
   {
      lc.setLed( 0, 2, i + 3, true ); // 4 LEDs in derde rij offset + 3
   }
}

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: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Berlijn klok

Berichtdoor shooter » 15 Feb 2021, 18:13

Ja mooi ding eigenlijk, heb ook de waterklok gezien die vindt ik ook mooi.
paul deelen
shooter@home.nl

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten