DS3231 - modul ceas de timp real

In acest articol vom folosi modulul DS3231. Acesta este un RTC (Real Time Clock), sau, mai pe romaneste, Ceas de Timp Real. 

Conectarea la Arduino se face prin interfata I2C, asta inseamna ca vom folosi doar 2 fire de conexiune.

Se conecteaza SDA si SCL de la modul la echivalentele lor de  placuta Arduino. Alimentarea modulului se face cu 5V. 

Modulul initial vine neprogramat si de aceea va trebui ca ora si data sa o programam noi. Pentru acest lucru vom folosi libraria DS1307RTC (chiar daca scrie ca este pentru chip-ul DS1307 putem programa si chip-urile DS3231). Aceasta librarie se poate descarca de pe acest site. Pe langa libraria precedenta vom avea nevoie si de libraria Time, aceasta putand fi descarcata de aici

 Modulul arata ca in pozele de mai jos:

Iar sketch-ul pentru programarea acestui modul se poate gasi in Arduino la  meniul Fisier > Exemple > DS1307RTC > SetTime.

Acest sketch este si mai jos:

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

 Pentru a verifica daca modulul a fost programat corect vom folosi un alt sketch tot din exemplele cu care vine libraria. Acest sketch poate fi incarcat accesand din Arduino meniul Fisier > Exemple > DS1307RTC > ReadTest.

Rezultatele vor fi afisate in terminalul serial.

Acest sketch va fi postat si mai jos:

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}

void loop() {
  tmElements_t tm;

  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}

 Am facut montajul pe breadboard pentru a vedea cum functioneaza:

Apoi am rulat ultimul sketch si am deschis terminalul serial pentru a vedea daca se afiseaza ora si data corect:

Observand ca data si ora sunt cele corecte am scos modulul de pe placuta de test, am asteptat un minut apoi am reconectat modulul in circuit si am verificat iarasi terminalul serial pentru a vedea daca data si ora s-au pastrat:

Nu sunt comentarii in “DS3231 - modul ceas de timp real”

Lasa un comentariu

Raspuns lui Some User

ESP32

ESP32 impreuna cu un senzor de lumina

    Pentru a detecta prezenta sau absenta luminii de catre ESP32 vom folosi un fotorezistor. Iar in acest articol vom folosi un modul detector de lumin cu fotorezistor.     Acest modul se poate alime...

ESP32 si un led

    Pentru a semnaliza o anumita stare dintr-un program executat de catre ESP32 puem folosi ca martor indicator un led. In acest exemplu vom folosi un led conectat cu anodul la pinul GPIO_25 al ESP32,...

ESP32 si comunicarea seriala

    Daca dorim sa vedem diferite date returnate de catre ESP32 putem folosi terminalul serial pentru a realiza acest lucru. Folosirea acestuia este destul de simpla, de fapt fiind acelasi cod sursa fo...

More Articles

Mai multe de la: ESP32

Autentificare