DCF77 Signal with Arduino

Posted by Mohammad Forgani under Electronic, Ring Clock Projecti:

The DCF77 signal is a puls-signal with AM modulation with carrier frequency 77.5kHz. It has a small bandwidth.

The carries include time and date information and will be transmitted in a simple binary-coded format by on-off modulation of the carriers.  (100ms/200ms)
The Signal time and date code include the following information:

  • year, month, day of month, day of week
  • hour, minute, second, summer time

DCF receiver module with antenna (Radio Controlled Clock)

This module comes in different variants and forms and receive the 77.5 kHz signal from Frankfurt and decodes and sends the data stream to the output. The output signal can be processed by a microcontroller.

The normal inputs/outputs on a DCF receiver module are:

TCON = Digital output of carrier signal
PON (if provided) usually grounded to GND to enable the receiver.
Operating voltage from  +2.5V to +5.5V

The data input should be connected to a digital pin of arduino that uses  a interrupt!

Arduino only has two pins that are digital and each uses an interrupt.


Digital 2 with INT0/0

DCF77 Code

DCF77 Code

Digital 3 with INT0/1


Digital output of carrier signal has to connected to D2 pin OR D3 pin.

If the device dose not received clear signal, make sure the DCF-Antenne is enough away from the interfering source. (At least 2m)
For example:

– Monitor, Computer
– Fluorescent lamps
– Power supplies


The amplitude of the carrier is reduced every second to 25% (- 6db) in order to code “0/1” logic by the length of the amplitude (simple pulse width signal). A 100ms lowering is a logic “0” whereas 200ms is a logic”1″.

Every second is equal to one bit. The start of a new time sequence is signalized by the 59th second after which there is not lowering of the amplitude.
The week-day is coded as “1” for Monday and “7” for  Sunday.





 * DCFSignal.ino - DCF77 debug Example

#include <DCF77.h>
#include <Time.h>
using namespace Utils;
#define DCF_PIN 2         // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0   // Interrupt number associated with pin
#define BLINK_PIN 13

time_t time;
void setup() {
  pinMode(DCF_PIN, INPUT);
  Serial.println("Waiting for DCF77 time ... ");
void loop() {
 time_t DCFtime = DCF.getTime(); // Check if new DCF77 time is available
 if (DCFtime!=0) {
    Serial.println("Time is updated");
void digitalClockDisplay(){
   Serial.print(" ");   Serial.print(day());
   Serial.print(" ");   Serial.print(month());
   Serial.print(" ");   Serial.print(year()); 
void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  if(digits < 10)


WS2812b & DS1307 with Arduino

Posted by Mohammad Forgani under Electronic, Ring Clock Projecti:

Making a ring wall clock with 1-meter long WS2812B LED strip with 60 RGB LEDs.  (ماژول LED RGB WS2812)

 LED WS2812 حلقه یا RGB LED WS2812b پنج متری

 For clock I used a DS1307, which contains a real-time clock.

WS2812b & DS1307

Driver IC: I2C DS1307 Real Time Clock
SCL Analog 5 (clock line)
SDA: Analog 4 (data line)
Voltage: +3.3V to +5V
GND: GND of Arduino
I2C Address: 0x68

NeoPixel – WS2812B LED strip
Length of strip: 1-meter
Number of LEDS per meter: 60
DIN: Digital 3
VCC: +5V to +12V
GND: GND on Arduino


The WS2812B LED strip is an addressable RGB LED strip and each LED includes an IC built in. This gives LEDs the possibility to communicate through one-wire interface.

Each LED has a data in/out pin and requires 24 bits (for each color 8 bits) of data to work.
The data is shifted in an 8 bit for green, 8 bits for red and finally 8 bits for blue intensity. (Total 3 byte)
Once a LED receives 24 bits data at its data-in pin, it forwards the data through its data-out pin to the next LED’s data-in pin.

The LED strip should be powered by an external 5V-12V power source.
by setting LED to maximal brightness, the maximum current of  LED will be ca. 50mA  (0,05 A x 60 LED’s = 3,0 A).

To reduce noise on strip you need to  add a 220 or 470 Ohm resistor between the arduino digital output pin and the strip data input pin.

Arduino libraries:
Adafruit’s Neopixel and RTClib

Demo Code

// include the library code
#include <Adafruit_NeoPixel.h> 

#define PIN 3
#define NUM_LEDS 60

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS1307 RTC;       // establish clock object

DateTime now;         // holds current clock time
byte hrs, mins, secs; 

int BLINK_PIN = 13;

void setup() {
  delay(1000);       // 1 second delay for recovery
  pinMode(BLINK_PIN, INPUT);
  if (!RTC.begin()) {
    Serial.println("Couldn't find RTC");
  if (!RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
  strip.show();       // Initialize all pixels to 'off'

void loop() {
  DateTime now = RTC.now();
  secs = now.second();  // get seconds
  mins = now.minute();  // get minutes
  hrs = now.hour();     // get hours
  Serial.print(now.year()); Serial.print("-");
  Serial.print(now.month()); Serial.print("-");
  Serial.print(now.day()); Serial.print(" ");
  Serial.print(hrs); Serial.print(":");
  Serial.print(mins); Serial.print(":");
  strip.setPixelColor(secs, 0x000055);
  strip.setPixelColor(mins, 0x550000);
  strip.setPixelColor(hrs, 0x005500);
  anyNr1(0, 0, 127); Serial.print("function: anyNr1\n");

// fill
void anyNr1(byte red, byte green, byte blue) {
  int l;
  for(l=NUM_LEDS+1; l>secs; l--) {  
    LToRight(l, red, green, blue);
    for(int n=0; n<NUM_LEDS; n++) {
      if (n <= secs) {
        if (n != mins && n != hrs) strip.setPixelColor(n, 0x000055);
      } else {
        if (n != mins && n != hrs) strip.setPixelColor(n, strip.Color(0, 0, 0));

void setPixel(int Pixel, byte red, byte green, byte blue) {
  strip.setPixelColor(Pixel, strip.Color(red, green, blue));

void LToRight(int i, byte red, byte green, byte blue) {
  if (i != secs && i != mins && i != hrs) 
    setPixel(i, red, green, blue);  
  if (i+1 != secs && i+1 != mins && i+1 != hrs) 
    setPixel(i+1, red/5, green/5, blue/5); 
  if (i+2 != secs && i+2 != mins && i+2 != hrs) 
    setPixel(i+2, red/10, green/10, blue/10);
  if (i+3 != secs && i+3 != mins && i+3 != hrs) 
    setPixel(i+3, red/20, green/20, blue/20);
  if (i+4 != secs && i+4 != mins && i+4 != hrs) 
    setPixel(i+4, red/30, green/30, blue/30);
  if (i+5 != secs && i+5 != mins && i+5 != hrs) 
    setPixel(i+5, red/90, green/90, blue/90);
  strip.setPixelColor(secs, 0x000055);
  strip.setPixelColor(mins, 0x550000);
  strip.setPixelColor(hrs, 0x005500);





LDR Sensor with Arduino

Posted by Mohammad Forgani under Electronic, Ring Clock Projecti:

The LDR Sensor also know as the Photo-resistor is basically a simple sensor that its resistance value changes with light. (resistance will lower with more light.)
The LDR isn’t very precise, so you can not get a LUX reading but it is good enough to tell the difference between light and shadow.
It can be used to make:

  • Automatic light dimmer
  • Light sensitive switch

    LDR Sensor with Arduino

    LDR Sensor with Arduino

Parts List

  • Arduino
  • LDR (also known as a photocell)
  • LED with 220 to 330 ohm resistor
  • 1K to 10K resistor (used with the LDR to setup a voltage divider)


The LDR is a special type of resistor which allows higher voltages to pass through it.
It means with a high intensity of light a low voltage passes.

The circuit based on a photo resistor that uses a resistor divider (4.7K to 10K) to allow the high impedance analog input to measure the voltage.
To get a voltage proportional to the photoresistor value, a resistor divider is necessary.

For demonstration we use an additional LED to digital pin 13 in series with the 220 ohm resistor.

Following formula is used  to calculate the voltage at A0 pin (Vout):


The voltage input (Vin) referenced to 5V expressed as a 10 bit value.
In other words 5V gets split up into 1024 levels, that is 5/1024 = 0.0048828125 volts per unit returned back.

ADC (analog-to-digital converter) of microcontroller converts and maps the analog value of the LDR from 0-5 volt to a value in 0-1023 range (digital 0-255).

 Reading an analog sensor on analog pin 0 and
 turning on and off a light emitting diode(LED Digital 13).
int sensorPin = A0;    // select the input pin for the potentiometer and 10K pulldown
int ledPin = 13;       // select the pin for the LED

void setup() {
  Serial.begin(9600);     // serial connection
  // declare the ledPin as an OUTPUT:
  pinMode(ledPin, OUTPUT);

void loop() {
  // read the value from the sensor and converts to 0 to 1023 range by using ADC
  sensorValue = analogRead(sensorPin);
  digitalWrite(ledPin, HIGH);   // turn the ledPin on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // turn the ledPin off
  // map it to the range of the analog out
  int outputValue = map(sensorValue, 0, 1023, 0, 255);
  analogWrite(ledPin, outputValue); // change the analog out value
  // print the results to the Serial Monitor
  Serial.print("sensor = "); Serial.print(sensorValue);
  Serial.print("\t output = "); Serial.println(outputValue);



See more website here...

  • Odlinks
  • Farsi-News
  • Advertise Here