DCF77 Радио-часы и Анализатор v2.0 — проект на Arduino Mega/UNO
Компоненты и материалы
| Компонент | Количество |
|---|---|
| Arduino Mega 2560 (основной контроллер) | 1 |
| Arduino UNO (для DCF77 Superfilter) | 1 |
О проекте
Продвинутые радио-часы, синхронизируемые по сигналу DCF77 (Германия, 77.5 кГц). Версия 2.0 включает:
- Полностью переписанный, прокомментированный код
- PIR-датчик движения для экономии энергии (выключение дисплеев при отсутствии людей)
- Отдельный Arduino Uno с прошивкой DCF77 Superfilter (Udo Klein) — очищает зашумлённый сигнал антенны перед подачей на Mega
- Дополнительный дисплей для температуры, времени восхода/заката
- Звон часов (chiming) на Adafruit Sound Board
- Много LED-индикаторов: парность битов, ошибки, буфер, синхронизация RTC, летнее/зимнее время, високосный год
Конструкция корпуса
Фронтальная панель спроектирована в Inkscape. Печать на DiBond (алюминиевый композит) — 28€ с доставкой. Важно: требовать печать 1:1 без масштабирования! Корпус — дерево/акрил, много сверления/фрезеровки.
Функционал
- Приём DCF77: прерывание по фронту (пин 2 Mega), измерение длительности импульсов (100/200 мс) и пауз (1000/2000 мс). Декодирование 59 бит кадра.
- Проверка чётности (Parity): 3 бита чётности (минуты, часы, дата). Только если все 3 верны — обновление RTC и дисплеев.
- Дисплеи на MAX7219 (7-сегментные): время, дата, неделя, температура, буфер бит, ошибки. Common Cathode и Anode поддержка.
- Кольца LED (внутреннее/внешнее): визуализация входящих бит и текущего времени.
- Экономия энергии: ночное отключение (настраиваемое время) + PIR (задержка 30 мин). Часы тикают дальше.
- Звук: пищалка повторяет DCF-бипы (100/200 мс), часовые бои (выкл. ночью).
- Температура: DS18B20 (1-Wire), разрядность 0.1°C, мин/макс за период, сброс по кнопке или в полночь.
Программный код
DCF Analyzer / Clock v2.1 (Arduino Mega)
Полный код очень большой (~1500 строк). Ниже — ключевые фрагменты и структура.
/* DCF77 Analyzer / Clock v2.1 — Erik de Ruiter 2014-2020
GNU LGPL v2.1. Arduino Mega + DCF Superfilter (Uno).
Драйвит множество LED напрямую через порты Mega (не MAX7219).
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <LedControl.h> // Специальная версия для Common Anode!
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// --- ПИНЫ MEGA ---
#define DCF77PIN 2 // INT0 — сигнал DCF от Superfilter
#define PIRDETECTORPIN 3 // PIR вход
#define BUZZERSWITCHPIN 4 // Вкл/выкл звука DCF
#define CHIMESWITCHPIN 5 // Вкл/выкл боёв
#define POWERSAVESWITCHPIN 6 // Вкл/выкл эко-режим
#define TEMPSENSORPIN 8 // DS18B20
#define TEMPRESETPIN 9 // Кнопка сброса мин/макс темп.
#define MAXIMCCLD 10 // MAX7219 CS
#define MAXIMCCCLK 11 // MAX7219 CLK
#define MAXIMCCDATA 12 // MAX7219 DIN
// LED на пинах 22–50 (дни недели, CET/CEST, високосный, RTC ошибка, синхро, паритеты, PIR, питание)
#define LED_SUNDAY 22 ... #define LED_PIRMOTION 50
// Аналоговые
#define BUZZER A7
#define SPEAKERVOLPIN A6
#define CHIMEPIN A5
// --- НАСТРОЙКИ ---
#define SPEAKERVOLUME 12
#define PERFORM_LED_TEST 1
#define LEDTEST_DELAY_DISPLAYS 600
#define LEDTEST_DELAY_LED_RING 20
#define CONFIGURE_DS18B20 0
#define POWERSAVINGOFFTIME 9 // Включение дисплеев (утро)
#define POWERSAVINGONTIME 22 // Выключение (вечер)
#define POWERSAVE_BY_PIR 1
#define PIR_DELAY_TIME 30 // мин
#define TEMPRESET_MIDNIGHT 1
// --- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ---
LedControl MaximCC = LedControl(MAXIMCCDATA, MAXIMCCCLK, MAXIMCCLD, 7, false);
OneWire ds(TEMPSENSORPIN);
// ... буферы DCF, флаги, счётчики ошибок, переменные времени, температура ...
void setup() {
Serial.begin(9600);
// Инициализация пинов, LED, RTC, MAX7219, звука, DS18B20
attachInterrupt(0, int0handler, CHANGE); // DCF прерывание
setSyncProvider(RTC.get);
if (timeStatus() != timeSet) digitalWrite(LED_RTCERROR, HIGH);
// Настройка громкости Sound Board
if (CONFIGURE_DS18B20) configureDS18B20();
if (PERFORM_LED_TEST) ledTest(); else delay(750);
displayTemp();
}
void loop() {
if (DCFSignalState != previousSignalState) {
previousSignalState = DCFSignalState;
scanSignal(); // Анализ импульса
}
checkSwitches();
checkPIR();
tasksEverySecond();
tasksEveryMinute();
tasksEveryHour();
}
// Прерывание DCF
void int0handler() { DCFSignalState = digitalRead(DCF77PIN); }
// Анализ фронтов: период, ширина, парность, буфер
void scanSignal() { ... }
void processDcfBit(int bit) { ... }
void finalizeBuffer() { ... }
void decodeBufferContents() { ... }
int bitDecode(int start, int end) { ... }
// ... функции дисплеев, температуры, PIR, звука, чаймов ...
Superfilter Sketch (Arduino Uno — Udo Klein)
Отдельная плата Uno между антенной и Mega. Очищает сигнал DCF77, выдаёт отфильтрованный/синтезированный сигнал. Использует библиотеку dcf77.h (blinkenlight.net).
// Superfilter 3.0 — Udo Klein
// Пины Uno:
// DCF вход: A5 (19)
// Выходы: 12 (filtered), A2 (semi-synth), 6 (synth)
// LED: A4 (monitor), 10 (1Hz), 13 (signal good), 7/A0/4 (diff)
#include <dcf77.h>
const uint8_t dcf77_sample_pin = 19;
const uint8_t dcf77_filtered_pin = 12;
const uint8_t dcf77_semi_synthesized_pin = 16;
const uint8_t dcf77_synthesized_pin = 6;
const uint8_t dcf77_monitor_pin = 18;
const uint8_t dcf77_second_pulse_pin = 10;
const uint8_t dcf77_signal_good_indicator_pin = 13;
void setup() {
Serial.begin(115200);
// инициализация пинов, DCF77_Clock::setup()
}
void loop() {
DCF77_Clock::get_current_time(now);
// дебаг, скоупы
}
CAD / Печатные платы
- PCB для дисплеев времени/даты (MAX7219 + 0.56" 7-seg) — ZIP
- PCB для компактных 7-сегментников KingBright — ZIP
- Звуковые файлы (тик-так, бои) для Grandfather Clock — ZIP
Схемы
Полная схема (Eagle/KiCad) в ZIP-архиве в разделе Schematics. Включает: Mega, Superfilter Uno, MAX7219 каскад, DS1307 RTC, DS18B20, PIR, Sound Board, ключи, LED-индикация.
Полезные ссылки
- DCF77 Wikipedia
- Brett Oliver, Joop Tap, Thijs Elenbaas, Matthias Dalheimer — классические реализации DCF на Arduino
- GitHub автора: deruiter
- Flickr фото: edr1924
Производственный процесс
- Кукушка: история, мастерство и современная эволюция
- Arduino POV-часы: сборка дисплея на эффекте сохранения образа
- Ретро-часы на индикаторах Numitron с Arduino: просто, надёжно, экономно
- Стильные настенные часы на четырех кольцах Adafruit Neopixel 60 LED и Arduino
- Слово-часы (Word Clock) на Arduino — DIY-часы с текстовой индикацией времени
- Часы реального времени на Arduino с расчётом времени намаза
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код