vendredi 8 août 2014

Arduino : Afficher la date et l'heure sur un LCD

Pour afficher l'heure et la date et surtout ne pas perdre ces informations si l'arduino UNO n'est plus alimenté, on a besoin d'un module RTC à base de DS1307 (datasheets). On en trouve facilement sur internet à des prix très bas.


Ce module embarque, en plus du composant DS1307, une pile qui permet de sauvegarder l'heure. Cette pile (CR2032) à une durée de vie de plusieurs années.

Pour utiliser ce module on va avoir besoin d'une librairie non fournie avec l'IDE Arduino. Celle-ci peut être téléchargée ici (il suffit de faire "Download Zip" et de décompressé l'archive directement dans le répertoire librairies de l'IDE).

Cette librairie propose un exemple ("ds1307") permettant de mettre à jour le module avec l'heure de votre ordinateur (attention : l'heure utilisée est UTC). Pour cela, il suffit de décommenter la ligne "RTC.adjust(DateTime(__DATE__, __TIME__));".

Tout d'abord le branchement

Le branchement est relativement simple. On se base sur le montage du LCD vu précédemment.
Le module RTC DS1307 ce branche comme suit:

  • Gnd --> GND
  • Vcc --> 5 V
  • Sda --> analog pin A4
  • Scl --> analog pin A5

Le programme correspondant

/************************************************************
Horloge Arduino
Horloge simple avec un Arduino Duo, un module RTC DS1307
et un afficheur LCD 20x4.

Branchements du RTC DS1307:
Gnd --> GND
Vcc --> 5 V
Sda --> analog pin A4
Scl --> analog pin A5

Branchements de l'afficheur LCD:
rs (LCD pin 4) --> Arduino pin 12
enable (LCD pin 6) --> Arduino pin 10
LCD D4 --> Arduino pin 5
LCD D5 --> Arduino pin 4
LCD D6 --> Arduino pin 3
LCD D7 --> Arduino pin 2

***************************************************************/

#include <liquidcrystal.h>
#include <wire.h>
#include <rtclib.h>

LiquidCrystal lcd(12, 11, 10, 5, 4,3,2);
RTC_DS1307 rtc;

void setup() {
    lcd.begin(20,4);
    lcd.clear();

    Wire.begin();
    rtc.begin();
}

void loop(){
    DateTime now = rtc.now();

    lcd.setCursor(0,0);
    lcd.print(now.year());
    lcd.print("/");
    if (now.month()<10) lcd.print="0";
    lcd.print(now.month());
    lcd.print("/");
    if (now.day()<10) lcd.print="0";
    lcd.print(now.day());
    lcd.print(" ");
    if (now.hour()<10) lcd.print="0";
    lcd.print(now.hour());
    lcd.print(":");
    if (now.minute()<10) lcd.print="0";
    lcd.print(now.minute());
    lcd.print(":");
    if (now.second()<10) lcd.print="0";
    lcd.print(now.second());

    delay(900);
}

Source : Arduino, Librairie RTC, Datasheet du DS1307