Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….
horloge - DIY

Projet ARDUINO ( Horloge avec notification ) – Partie 1

Le but de cet article , est de monter comment réaliser facilement une horloge Numérique  a base d’un Arduino , pour moins de 19 € .

Pour cela il nous faut :

Pour tous ceux qui découvre l’ARDUINO , je les invites à aller sur les sites suivants :

Relier la matrice à l’Arduino :

Dans cette partie , nous allons voir comment relier une matrice led de type MAX7219.

Nous allons la relier à L’Arduino Uno de la façon suivante .

Pour le code , voici le minimum pour afficher « Test »

// Projet horloge avec Notif
// janvier 2018


// Chargement des librairies
// gestion affichage matrice
#include <MD_Parola.h>
#include <MD_MAX72xx.h>

// Parametrage matrice  ( Pin Arduino ou est branché la matrice )
#define MAX_DEVICES 4 // ( nombre de matrice )
#define CLK_PIN   10
#define DATA_PIN  12
#define CS_PIN    11

// initialisation de la matrice
MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

void setup() {
    //init affichage
  P.begin();

}

void loop() {
  // Affichage d'un texte simple
  P.print("TEST");

}

Vous devriez obtenir ce résultat :

Affichage correct - TEST
Affichage correct – TEST

Si vous obtenez un affichage incompréhensible ou un texte a l’envers

Erreur d'affichage led
exemples de problème d’affichage
.. ou encore …
…. a l’envers et inversé .

, il faudra modifier les lignes suivantes dans le fichier de configuration de la bibliothèque master : src/MD_MAX72xx_lib.h

// *******************************************************************************************
// ** Combinations not listed here have probably not been tested and may not work correctly **
// *******************************************************************************************
#if USE_PAROLA_HW		// tested MC 8 March 2014
//#pragma message "PAROLA HW selected"
#define	HW_DIG_ROWS	1 ///< MAX72xx digits are mapped to rows in on the matrix
#define	HW_REV_COLS	0 ///< Normal orientation is col 0 on the right. Set to 1 if reversed
#define	HW_REV_ROWS	0 ///< Normal orientation is row 0 at the top. Set to 1 if reversed
#endif

Ci dessus la configuration qui marche avec ma matrice.

Animer le Texte :

Avec la bibliothèque Parola , il est très facile d’animer un texte , en utilisant la commande P.display et la fonction P.displayAnimate().

exemples :

void loop() {
  // Affichage d'un texte simple
 if (P.displayAnimate())
 {
  P.displayText("Message defilant", PA_LEFT,40,200, PA_SCROLL_LEFT, PA_SCROLL_LEFT); 
 }

}

La syntaxe est simple : le texte , la position de départ ( pas d’incidence en scroll ), la vitesse de scroll , le temps de pause à la fin de l’animation , L’effet entrant ( ici scroll de la gauche ) , l’effet sortant ( uniquement sur affichage en cours ).

Plein d’autres effets , que vous pouvez trouver dans les exemples fournis avec la bibliothèque.

Le module Horloge

Arduino a des fonctions de timer , très limité et surtout n’est pas en mesure de garder la notion d’heure et de date , une fois débranché. Il faut pour cela lui installer un module RTC ( Real Time Clock ) , comme le module DS3231 qui permet de connaître l’heure à la seconde près , ainsi que le jour , le mois , l’année , le jour de la semaine …. Il est de plus équipé d’une pile permettant de mémoriser le temps sur plusieurs années.

Module RTC

Son branchement est très simple:

Il suffit de relier la borne VCC au plus 5V de l’arduino , la broche GND à la broche GND de l’arduino.

Les deux broches qui vont servir seront SDA et SCL , qui seront relié aux broches SDA et SCL de l’arduino.

exemple branchement du module RTC ( seul ) , sur le UNO

voici , donc le script Modifié :

// Chargement des librairies
// gestion affichage matrice
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
// librairie pour horloge
#include <DS3231.h>

// Parametrage matrice  ( Pin Arduino ou est branché la matrice )
#define MAX_DEVICES 4 // ( nombre de matrice )
#define CLK_PIN   10
#define DATA_PIN  12
#define CS_PIN    11


// initialisation de la matrice
MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// parametrage horloge
DS3231 clock;
RTCDateTime dt;
// Commande a devalider pour reglage horloge premiere fois Manual (YYYY, MM, DD, HH, II, SS
//clock.setDateTime(2017, 10, 27, 16, 19, 00);

void setup() {
    //init affichage
  P.begin();
    // init horloge
  clock.begin();

}

void loop() {
  dt = clock.getDateTime();
  // Affichage d'un texte simple
 if (P.displayAnimate())
 {
  P.displayText(clock.dateFormat("H:i", dt), PA_CENTER,0,0, PA_PRINT, PA_NO_EFFECT); 
 }

}

Et voilà , votre horloge est prête , il ne vous reste plus qu’a lui trouver ( ou fabriquer un petit coffret ) .

Lors du premier lancement , votre horloge ne sera sûrement pas a l’heure ….
Pour corriger cela il faut decommenter la ligne « setDateTime » .

RTCDateTime dt;
// Commande a devalider pour reglage horloge premiere fois Manual (YYYY, MM, DD, HH, II, SS
clock.setDateTime(2017, 10, 27, 16, 19, 00);

En fonction de votre équipement mettez entre 5 et 15s de plus , qui correspond au temps de compilation.

Affichage de l'heure

Les notifications :

Pour illustrer les notifications , j’ai choisi d’afficher la date du jour toutes les 3 minutes.
Le Script complet :

// Projet horloge avec Notif
// janvier 2018


// Chargement des librairies
// gestion affichage matrice
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
// librairie pour horloge
#include <DS3231.h>

// Parametrage matrice  ( Pin Arduino ou est branché la matrice )
#define MAX_DEVICES 4 // ( nombre de matrice )
#define CLK_PIN   10
#define DATA_PIN  12
#define CS_PIN    11


// initialisation de la matrice
MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// parametrage horloge
DS3231 clock;
RTCDateTime dt;
// Commande a devalider pour reglage horloge premiere fois Manual (YYYY, MM, DD, HH, II, SS
//clock.setDateTime(2017, 10, 27, 16, 19, 00);

// variable pour tempo notif 
long temps;
unsigned int tempoNotif = 180 ; // temps en secondes


void setup() {
    //init affichage
  P.begin();
    // init horloge
  clock.begin();

}

void loop() {
  dt = clock.getDateTime();
  // Affichage d'un texte simple
 if (P.displayAnimate())
 {
  P.displayText(clock.dateFormat("H:i", dt), PA_CENTER,0,0, PA_PRINT, PA_NO_EFFECT); 
 
 // notif auto
    // temp et date
  if ((millis()-temps)>( tempoNotif*1000L))
    {
    P.displayText(clock.dateFormat("   --> d.m.y", dt), PA_LEFT,40,2000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
    temps=millis();
    }
    }
 

Afin d’éviter de bloquer l’exécution du script avec la commande delay , on utilise ici la fonction millis() , qui permet de lancer un timer sans arrêter le script.
Pour l’affichage de la date , j’ai choisi un effet de scrolling gauche . Une fois l’effet terminé , il revient à l’affichage de l’horloge au bout de deux secondes.

Et voila un réveil , avec une notification de date toutes les 3 minutes ( 180s).

Petite astuce : le calcul de la tempo on utilise la fonction  millis() qui est de type Long , on compare ensuite sa valeur à une multiplication par 1000 ( afin d’éviter de s’encombrer des millisecondes ) il faut penser à ajouter le L à la fin afin de forcer le résultat en « Long« . ( tempoNotif*1000L ).

Ce petit script , peut être amélioré en affichant la date « a la française « , sous la forme :  Mardi 05 décembre 2017 … par exemple , ou simplement l’ajout d’une phrase qui défierait automatiquement ….

Je me suis volontairement limiter à cette fonctionnalité , car la mémoire de l’Arduino étant très limité . pour information dans cette partie , on utilise déjà 70% de la mémoire.

Dans la partie 2 , nous ajouterons un capteur de température , afin d’afficher la température et l’humidité de la pièce .
Nous ajouterons aussi , un module IR , afin d’interagir avec l’horloge et la rendre plus dynamique , afin de l’associer avec une box Domotique ( comme Jeedom , par exemple ).