Horloge radio DCF77 et analyseur v2.0 – Projet Arduino Mega/UNO
Composants et fournitures
| Arduino Mega 2560 | × | 1 |
| Arduino UNO | × | 1 |
À propos du projet
Après avoir découvert la plateforme Arduino, j'ai été émerveillé et mon rêve de développer ma propre électronique est devenu réalité. Comme tout le monde, j'ai commencé par les sketches de base, mais j'ai vite voulu faire quelque chose d'utile. Aimant depuis toujours les horloges radio (elles se synchronisent sur le signal DCF77 d'Allemagne dans mon cas), j'ai décidé de créer une horloge qui n'affiche pas seulement l'heure, mais qui montre ce qui se passe.
Après des centaines d'heures de bidouillage et d'innombrables erreurs, j'ai enfin obtenu une horloge fonctionnelle avec mon propre code et mes propres circuits imprimés.
Plus tard, j'ai découvert le "superfiltre" DCF77 d'Udo Klein qui fournit un signal propre quand le signal radio est mauvais. C'est un Arduino Uno séparé avec le logiciel Superfilter, agissant comme une "boîte noire" filtrant le signal, placé entre l'antenne DCF77 et l'Arduino Mega exécutant mon sketch.
J'ai donc créé une version 2.0 de la première horloge :
- Code entièrement réécrit
- Abondamment commenté pour que chacun comprenne
- Ajout d'un capteur PIR pour réduire la consommation
- Intégration du Superfilter DCF77
- Affichage supplémentaire pour température ou autres usages (lever/coucher soleil)
Démonstration
Vidéo de démonstration disponible (voir lien original).
Intégration dans une horloge de grand-père
Vidéo d'intégration disponible (voir lien original).
La conception
Le panneau avant et le boîtier ont été conçus dans Inkscape (logiciel libre). La fabrication du panneau avant s'est avérée la partie la plus difficile. J'ai dépensé beaucoup d'argent en essayant de le faire dans un FabLab local avec une découpeuse laser et un acrylique spécial avec revêtement aluminium. L'idée était de découper les trous au laser et graver le texte/lignes en brûlant le mince revêtement pour exposer l'acrylique noir dessous. Mais la découpeuse laser ne respectait pas les tolérances nécessaires à cause d'une utilisation intensive.
J'ai alors découvert un service d'impression en ligne sur panneau DiBond. Prix très correct (28 € port inclus). Résultat d'abord décevant car ils n'ont pas imprimé 1:1 mais légèrement agrandi. Attention : si vous utilisez cette méthode, appelez-les d'abord pour confirmer l'impression 1:1. Après un appel, ils m'ont renvoyé un panneau aux bonnes dimensions. Excellent !
Puis beaucoup de perçage et fraisage nécessaire (voir photos jointes).
Code
Analyseur/Horloge DCF v2.1
/* ================================================================================
DCF77 Analyzer / Clock version 2
================================================================================
Ce sketch est un logiciel libre sous licence GNU LGPL v2.1 ou ultérieure.
Erik de Ruiter 2014-2020
- Version 2.1 (2020-01-18) : correction fonction économie d'énergie
- Version 2.0 : adapté pour Arduino MEGA + Superfilter DCF77
Utilise les ports du Mega pour piloter les LED (au lieu du MAX7219)
================================================================================ */
#include
#include
#include
#include // Version modifiée pour support anode commune
#include
#include
// Broches Arduino UNO (pour Superfilter) - voir code Superfilter ci-dessous
// Broches Arduino MEGA (horloge principale) :
#define DCF77PIN 2
#define PIRDETECTORPIN 3
#define BUZZERSWITCHPIN 4
#define CHIMESWITCHPIN 5
#define POWERSAVESWITCHPIN 6
#define TEMPSENSORPIN 8
#define TEMPRESETPIN 9
#define MAXIMCCLD 10
#define MAXIMCCCLK 11
#define MAXIMCCDATA 12
// LED sur broches 22-50 (jour, heure d'été/hiver, année bissextile, erreurs, etc.)
#define LED_SUNDAY 22
#define LED_MONDAY 23
// ... (toutes les définitions LED, voir code source complet)
#define BUZZER A7
#define SPEAKERVOLPIN A6
#define CHIMEPIN A5
// Configuration utilisateur
#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 // Heure activation affichages (9h)
#define POWERSAVINGONTIME 22 // Heure extinction affichages (22h)
#define POWERSAVE_BY_PIR 1
#define PIR_DELAY_TIME 30 // Minutes sans détection avant extinction
#define TEMPRESET_MIDNIGHT 1
// ... Suite du code : initialisation, boucle principale, gestion interruptions DCF77,
// décodage signal, vérification parité, synchronisation RTC, affichage température,
// économie d'énergie, carillon, etc. (Code complet très long, voir fichier joint)
// Fonctions principales :
// - scanSignal() : analyse fronts montants/descendants, vérifie largeur/période impulsions
// - processDcfBit() : stocke bits, vérifie parité (3 bits parité DCF77)
// - finalizeBuffer() : traite buffer complet, met à jour RTC si valide
// - decodeBufferContents() : extrait minute, heure, jour, mois, année, jour semaine, DST
// - bitDecode() : décode groupes de bits en valeurs décimales
// - calculateTemp() / displayTemp() : lecture capteur DS18B20
// - checkSwitches() / checkPIR() / tasksEverySecond/Minute/Hour()
// - ledTest() / ledDisplay() / buzzer() / error() / initialize()
Sketch Superfilter (Arduino Uno)
// Superfilter DCF77 par Udo Klein - www.blinkenlight.net // Basé sur la bibliothèque dcf77.h // Broches utilisées : // Entrée DCF ................. A5 (19) = dcf77_sample_pin // Sortie DCF Filtré .......... 12 = dcf77_filtered_pin // Sortie DCF Semi-synthétisé . A2 (16) = dcf77_semi_synthesized_pin // Sortie DCF Synthétisé ...... 6 = dcf77_synthesized_pin // LED DCF sortie filtrée ..... A4 (18) = dcf77_monitor_pin // LED 1 Hz ................... 10 = dcf77_second_pulse_pin // LED DCF OK ................. 13 = dcf77_signal_good_indicator_pin // LED Différence Filtré ...... 7 = dcf77_filter_diff_pin // LED Différence Semi-synth .. A0 = dcf77_semi_synthesized_diff_pin // LED Différence Synthétisé .. 4 = dcf77_synthesized_diff_pin #includeconst uint8_t dcf77_analog_samples = false; const uint8_t dcf77_analog_sample_pin = 5; const uint8_t dcf77_sample_pin = 19; // A5 const uint8_t dcf77_inverted_samples = 0; // Configuration sorties (filtré, semi-synthétisé, synthétisé) const bool provide_filtered_output = true; const uint8_t dcf77_filtered_pin = 12; const uint8_t dcf77_inverted_filtered_pin = 11; const uint8_t dcf77_filter_diff_pin = 7; const bool provide_semi_synthesized_output = true; const uint8_t dcf77_semi_synthesized_pin = 16; const uint8_t dcf77_inverted_semi_synthesized_pin = 15; const uint8_t dcf77_semi_synthesized_diff_pin = 14; const bool provide_synthesized_output = true; const uint8_t dcf77_synthesized_pin = 6; const uint8_t dcf77_inverted_synthesized_pin = 5; const uint8_t dcf77_synthesized_diff_pin = 4; const uint8_t dcf77_second_pulse_pin = 10; const uint8_t dcf77_signal_good_indicator_pin = 13; // ... Suite : scopes, échantillonnage, gestion horloge, sortie série, etc. // Code complet disponible dans le fichier joint.
Pièces personnalisées et boîtiers
- PCB pour afficheurs heure/date (MAX7219, afficheurs 7 segments 0,56")
- PCB pour afficheurs 7 segments compacts KingBright SC39-11SRWA
- Fichiers son : tic-tac et carillon pour horloge de grand-père
Schémas
Schéma complet disponible en téléchargement (voir fichier joint ZIP).
Processus de fabrication
- L'Horloge à Coucou : Histoire, Artisanat et Évolution Moderne
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge Numitron rétro avec Arduino : simple, fiable et économe en énergie
- Construire une horloge murale design avec anneaux Neopixel 60 LED Adafruit et Arduino
- Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
- Horloge Arduino temps réel pour les heures de prière islamiques
- Construire un Spybot Arduino piloté par Bluetooth
- FlickMote : Télécommande IR à gestes pour maison connectée
- Construire un Réveil Fiable avec RTC DS1302 et Arduino UNO