Pentru a afisa data si ora curenta cu ajutorul placii de dezvoltare STM32F103C8 BluePill putem folosi un modul de ceas RTC realizat cu ajutorul circuitului integrat PCF8563L.

    Acest modul are un pret de 14 Lei si poate fi achizitionat de aici.

    Alimentarea modulului se face cu +5V iar conexiunile cu placa de dezvoltare se face pe magistrala I2C. Pentru a afisa informatiile returnate de catre acest modul vom folosi un display LCD 1602 cu adaptor I2C. Acest display va fi conectat in modul descris in acest articol.

    O poza cu acest modul este mai jos:

    Pentru a seta data curenta in modulul RTC vom folosi urmatorul sketch:

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

void setup() {
  Wire.begin();
  second = 0;  // secunda intre 0 si 60
  minute = 6;   // minutul intre 0 s 60
  hour = 10;     // ora intre 0 si 23
  dayOfWeek = 1;   // 0 - Duminica, 1 - Luni etc
  dayOfMonth = 15;  // ziua curenta
  month = 1;   //luna curenta
  year = 23;   //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);
}

    Pentru a afisa informatiile returnate de catre modul vom folosi sketchul de mai jos:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#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() {
  Wire.begin();
  lcd.begin();
  lcd.setCursor(0, 0);
  lcd.print("electronicstore");
  lcd.setCursor(13, 1);
  lcd.print(".ro");
  delay(3000);

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Testare modul");
  lcd.setCursor(3, 1);
  lcd.print("PCF8563");
  delay(3000);
}

void loop() {
   readPCF8563();
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Data: ");
   lcd.print(dayOfMonth, DEC);
   lcd.print("/");
   lcd.print(month, DEC);
   lcd.print("/");
   lcd.print(year, DEC);
   lcd.setCursor(0, 1);
   lcd.print("Ora: ");
   lcd.print(hour, DEC);
   lcd.print(":");
   if (minute < 10) { lcd.print("0"); }
   lcd.print(minute, DEC);
   lcd.print(":");
   if (second < 10) { lcd.print("0"); } 
   lcd.print(second, DEC); 
   delay(1000);
   lcd.clear();
   lcd.print(days[dayOfWeek]);
   lcd.setCursor(0, 1);
   lcd.print("Ora: ");
   lcd.print(hour, DEC);
   lcd.print(":");
   if (minute < 10) { lcd.print("0"); }
   lcd.print(minute, DEC);
   lcd.print(":");
   if (second < 10) { lcd.print("0"); } 
   lcd.print(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);
}

Nu sunt comentarii

Acest website foloseste cookie-uri pentru o experienta placuta in timpul navigarii.