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);
}