dimanche 4 mars 2012

RTC Board

Utilisation du DS1302 pour garder l'heure sur mon thermostat.


La RTC Board de Comfile est composée d'un DS1302, d'un quartz (32.768kHz), d'un petit condensateur et d'un condensateur de sauvegarde (5.5V-0.10F).

Voir le datasheet du DS1302.

Ce composant permet continuer à faire fonctionner l'horloge lors d'une mise hors tension.

Dans mon cas, le condensateur de sauvegarde était déchargé. J'ai du le recharger manuellement avec l'alimentation de l'Arduino.


Branchement

Le branchement avec l'Arduino est très simple :

  • Arduino : RTC Board
  • 5V : 5V
  • GND : GND
  • 10 : RST
  • 11 : I/O
  • 12 : CLK




Pour communiquer avec le DS1302, j'ai utilisé la librairie de Henning Karlsen, téléchargeable sur son site.


Programme


#include <DS1302.h>

// Init the DS1302
DS1302 rtc(10, 11, 12);

// Init a Time-data structure
Time t;

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);

  // Setup Serial connection
  Serial.begin(9600);

  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(SUNDAY);
  rtc.setTime(12, 10, 0);
  rtc.setDate(4, 3, 2012);
}

void loop()
{
  t = rtc.getTime();

  Serial.print(t.date, DEC);
  Serial.print("/");
  Serial.print(t.mon, DEC);
  Serial.print("/");
  Serial.print(t.year, DEC);

  Serial.print(" ");
  Serial.print(t.hour, DEC);
  Serial.print(":");
  Serial.print(t.min, DEC);
  Serial.print(":");
  Serial.print(t.sec, DEC);
  Serial.println();

  delay (1000);
}


Amélioration du thermostat

Pour inclure la RTC Board dans mon montage de thermostat existant, j'ai simplement eu à raccorder les 5 sorties de la carte avec l'Arduino Mini.


Ensuite, dans le programme, la partie lecture/écriture de l'heure sur l'EEPROM est inutile. Je l'ai donc remplacé par une simple lecture de l'heure.

Pour permettre le rechargement de la pile de sauvegarde, il faut utiliser la fonction setTCR et désactiver la protection en écriture.

Extrait du programme


void setup() {
  lcd.begin(16, 2);
  if(debug) {
    Serial.begin(9600);
  }
  pinMode(8, OUTPUT);
  pinMode(13, OUTPUT);

  // Lecture de l'heure sur le DS1302
  rtc.halt(false);
  rtc.writeProtect(false);
  Time t = rtc.getTime();
  rtc.setTCR(TCR_D1R2K);

  secondes = t.sec;
  minutes = t.min;
  heures = t.hour;
  jours = t.dow - 1;

  calculerOptimisationHoraires();

  dureeChauffage = EEPROMReadInt(6);
}


Aucun commentaire:

Enregistrer un commentaire