[TUTO] DCF77

Pour les arduinautes désireux de soulever le capôt et mettre les mains dans le cambouis logiciel :

La librairie proposée contient en réalité 4 headers distincts.

trameDCF77.h

Une librairie permettant la mise en buffer et manipulation des bits d'une trame DCF77.

Sa fonction de décodage logique d'une trame complète, effectue des contrôles de validité sur tout ce qu'il est possible de vérifier.
Ainsi par exemple, si le jour de la semaine ne correspond pas à la date reçue, la trame est considérée comme invalide.
Idem pour l'indicateur heure d'été / heure d'hiver, au regard de la date/heure.

Cette petite lib aurait sa place comme composant de base de tout développement autour du signal DCF77.

/***************************************************************************************************
/*
/* Librairie de manipulation d'une trame DCF77
/*
/* Code générique multi-plateforme, non spécifique à Arduino.
/* (2015) Bricoleau
/*
/***************************************************************************************************/
#ifndef trameDCF77_h
#define trameDCF77_h

#include <stdint.h>

const uint8_t NB_BITS_TRAME_DCF77 = 59;
const uint8_t NB_OCTETS_TRAME_DCF77 = (NB_BITS_TRAME_DCF77 + 7) / 8;

class trameDCF77_c
{
  public :
    trameDCF77_c();

    void raz();
    void ajouterBit(uint8_t bit);
    uint8_t lireBit(uint8_t rang);

    const uint8_t longueur();
    const bool estVide();
    const bool estComplete();

    const bool decoder(uint8_t *annee, uint8_t *mois, uint8_t *jour, uint8_t *joursem,
                       uint8_t *heure, uint8_t *minute, bool *heure_ete);
    //retourne false si trame invalide, avec date/heure inchangées
    //retourne true  si trame valide, avec date/heure chargées et certifiées cohérentes.
    //nb : joursem = 1 Lundi .... 7 Dimanche

  private : //Données : 9 octets
    uint8_t _longueur;
    uint8_t _valeur[NB_OCTETS_TRAME_DCF77];

    void localiserBit(uint8_t rang, uint8_t *num_octet, uint8_t *num_bit);
    void ecrireBit(uint8_t bit, uint8_t rang);
    uint8_t calculerParite(uint8_t debut, uint8_t fin);
    uint8_t extraireValeurDCB(uint8_t debut, uint8_t fin);
};

extern trameDCF77_c trameDCF77;

#endif

tunerDCF77.h

Une librairie permettant d'évaluer la qualité du signal reçu.

C'est aussi un stand alone logiciel en cpp standard, indépendant des primitives hardware de lecture du signal.

Elle contient un buffer dans lequel on enregistre les fronts montants / descendants observés, avec une référence temporelle.
Le buffer est géré sur une période de 5 secondes glissantes.
Une méthode de calcul exploite ce buffer pour fournir un indicateur de qualité du signal reçu.
Celui-ci ne considère pas la validité des données de la trame DCF77, mais seulement la bonne fréquence statistiques des fronts.

Cette librairie permet donc de savoir si le signal observé a "une bonne bouille de signal DCF77", avec une actualisation à chaque seconde.

Elle n'est pas strictement nécessaire au décodage des trames, mais bien utile pour suivre la réception et ajuster la position de l'antenne.

Peut-être que le calcul de l'indicateur de qualité pourrait être amélioré, afin d'être encore plus pertinent.

/***************************************************************************************************
/*
/* Tuner pour signal DCF77 - Permet de qualifier le niveau de réception du signal
/* Actualisation à la seconde
/*
/* Code générique multi-plateforme, non spécifique à Arduino.
/* (2015) Bricoleau
/*
/***************************************************************************************************/
#ifndef tunerDCF77_h
#define tunerDCF77_h

#include <stdint.h>

const uint8_t PERIODE_MESURE_DCF77 = 5; //secondes glissantes

const uint32_t DUREE_MINIMUM_NIVEAU_BAS_DCF77 = 700; //millisecondes

class tunerDCF77_c
{
  public :
    tunerDCF77_c();

    void enregistrerFrontMontant(uint32_t millis_front);
    void enregistrerFrontDescendant(uint32_t millis_front);

    const uint8_t qualiteReception(uint32_t millis_maintenant);
  //valeurs renvoyées :
  //  0    : signal inexistant
  //1 à 4  : signal trop faible, pas de décodage possible
  //  5    : signal parfait, décodage probable
  //  6    : signal correct, décodage probable
  //7 à 11 : signal parasité, décodage incertain selon algo

  private : //Données : 25 octets
    uint8_t  qualite;
    uint32_t ref_chrono;
    uint32_t ref_blanc;
    uint32_t ref_trou;
    uint8_t  nb_pics[PERIODE_MESURE_DCF77 + 1];
    uint8_t  nb_blancs[PERIODE_MESURE_DCF77 + 1];

    void     glisser(uint32_t jusqua);
    void     glisser(uint8_t combien);
    void     comblerTrou();
    uint8_t  calculerQualite();
};

extern tunerDCF77_c tunerDCF77;

#endif

Le programme exemple demo_tunerDCF77 montre une utilisation isolée de cette librairie :

Tuner pour signal DCF77

SIGNAL: FAIBLE        <-OK---BON-------PARASITES------>
                                                       00 Signal inexistant
>>>>>                                                  01 Signal trop faible
>>>>>>>>>>                                             02 Signal trop faible
>>>>>>>>>>>>>>>                                        03 Signal trop faible
>>>>>>>>>>>>>>>>>>>>                                   04 Signal trop faible
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>               08 Signal avec parasites
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>               08 Signal avec parasites
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>               08 Signal avec parasites
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                    07 Signal avec parasites
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                    07 Signal avec parasites
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                         06 Signal correct
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                         06 Signal correct
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                         06 Signal correct
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                         06 Signal correct