Ceas cu PCF8563

In acest articol vom folosi un modul de ceas realizat cu circuitul integrat PCF8563. Acest modul este achizitionat de aici

Conectarea acestui modul este extrem de simpla deoarece se face prin intermediul interfetei I2C. Adresa acestui modul este 0x51, acest lucru se poate verifica folosind sketchul i2c_scanner existent deja in editorul Arduino.

Poza cu modulul folosit este mai jos;

 

Pentru a folosi acest modul am folosit informatiile existente in acest articol.

Pentru inceput va trebui sa  setam ora corecta pentru acest modul.

Pentru a face acest lucru vom folosi un sketch in care introducem data si ora pe care o dorim salvata in modul.

Sketchul este urmatorul:

 

#include "Wire.h"
#define PCF8563address 0x51
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  // mai jos se adauga setarile despre data si ora
  second = 0;  // secunda intre 0 si 60
  minute = 15;   // minutul intre 0 s 60
  hour = 19;     // ora intre 0 si 23
  dayOfWeek = 1;   // 0 - Duminica, 1 - Luni etc
  dayOfMonth = 8;  // ziua curenta
  month = 2;   //luna curenta
  year = 21;   //anul curent
  setPCF8563();
}

void loop() {
}

void setPCF8563()
{
  Wire.beginTransmission(PCF8563address);
  Wire.write(0x02);
  Wire.write(decToBcd(second));  
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));     
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(dayOfWeek));  
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}

byte decToBcd(byte value){
  return (value / 10 * 16 + value % 10);
}

 In urmatorul sketch vom folosi datele salvate in acest modul si le vom afisa in terminalul serial:

#include "Wire.h"
#define PCF8563address 0x51
String days[] = {"Duminica", "Luni", "Marti", "Miercuri", "Joi", "Vineri", "Sambata" };
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
 readPCF8563();
  Serial.print(days[dayOfWeek]); 
  Serial.print(" ");  
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/20");
  Serial.print(year, DEC);
  Serial.print(" - ");
  Serial.print(hour, DEC);
  Serial.print(":");
  if (minute < 10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");  
  if (second < 10)
  {
    Serial.print("0");
  }  
  Serial.println(second, DEC);  
  delay(1000);
}

void readPCF8563()
{
  Wire.beginTransmission(PCF8563address);
  Wire.write(0x02);
  Wire.endTransmission();
  Wire.requestFrom(PCF8563address, 7);
  second     = bcdToDec(Wire.read() & B01111111); 
  minute     = bcdToDec(Wire.read() & B01111111); 
  hour       = bcdToDec(Wire.read() & B00111111); 
  dayOfMonth = bcdToDec(Wire.read() & B00111111);
  dayOfWeek  = bcdToDec(Wire.read() & B00000111);  
  month      = bcdToDec(Wire.read() & B00011111);  
  year       = bcdToDec(Wire.read());
}

byte bcdToDec(byte value)
{
  return ((value / 16) * 10 + value % 16);
}

 

 

Autentificare