DS3231: ceas și calendar în timp real pentru Arduino

DS3231

În unele proiecte este necesar să aveți dovada orei, orei sau datei. Fie datorită necesității de a efectua anumite funcții în funcție de timp, de a menține un calendar de evenimente sau înregistrări, de a păstra ora într-un sistem, sau pur și simplu de a crea un ceas digital cu Arduino. Cu DS3231 îl poți obține, altul componente pe care o adăugăm la listă.

DS3231 este modulul pe care l-ați căutat și aici veți găsi tot ce aveți nevoie pentru controlul său și vă voi arăta, de asemenea, un exemplu de integrează-l cu Arduino cu un exemplu practic ...

Ce este DS3231?

DS3231

În primul rând, ar trebui să știți ce RTC (Ceas în timp real), sau ceas în timp real. Aceste cipuri sunt foarte frecvente într-o multitudine de aplicații, de fapt, PC-ul dvs. are una dintre ele pe placa de bază și este, de asemenea, alimentat de un Baterie CR2032 de asemenea. Este cea care menține timpul și configurația în BIOS / UEFI și de la care sistemul de operare îl ia la pornire pentru a fi la timp (deși acum, cu Internet, sincronizarea cu serverele poate fi utilizată pentru o precizie mai mare, dar acest lucru este o altă poveste ...).

Ceea ce face RTC este să obțină măsurători de timp, atât de simplu. Diferența față de alte tipuri de ceasuri electronice este că pur și simplu măsoară timpul, și face acest lucru prin numărarea impulsurilor de semnal de ceas, cunoscându-i frecvența și perioadele. În plus față de timp, un RTC vă permite, de asemenea, să țineți contabilitatea zilelor, săptămânilor, lunilor și anilor. Adică data completă ...

Pentru ca acest lucru să fie posibil, RTC trebuie să fie însoțit de un Xtal sau cristal de cuarț care va acționa ca un rezonator, cel care asigură frecvența. În plus, aveți nevoie de circuite electronice capabile să numere și să stocheze data într-o memorie. Circuitul trebuie să fie capabil să numere secunde, minute, ore, zile, săptămâni, luni și ani.

memoria este volatilăDe aceea are nevoie de baterie, pentru a avea o putere constantă. Dacă nu aveți o baterie sau se epuizează, aceasta va fi ștearsă ... Asta se întâmplă cu computerele atunci când bateria se epuizează, acestea dau un timp incorect. Dacă îl configurați în timp ce computerul este pornit, timpul va fi păstrat, deoarece RTC este alimentat, dar este în timpul proceselor în care este oprit atunci când este necesară bateria ...

Pentru proiectele DIY, producătorii folosesc de obicei două jetoane RTC comune, care sunt DS1307 și DS3231. Ambele sunt realizate de Maxim (fost Dallas Semiconductor), iar DS3231 este cel mai precis dintre cele două, deoarece nu este la fel de afectat de variațiile de temperatură ca și primul. Prin urmare, nu fluctuează atât de mult în funcție de temperatură și păstrează timpul mai precis.

Uneori, cu diferențe semnificative de temperatură, DS1307 ar putea fi la fel de întârziată ca 1 sau 2 minute pe zi. Ceva intolerabil pentru unele aplicații.

DS3231 nu este că nu este afectat de variații, ci că are sisteme de măsurare și compensare a temperaturii încorporate pentru a asigura o precizie de 2 ppm, care ar fi echivalentă cu o întârziere de aproximativ 172 ms pe zi, adică puțin mai mult de 1 secundă pe săptămână cel mult. Și, în practică, acestea variază de obicei doar 1 sau 2 secunde pe lună.

Cât despre fel comunicați cu RTC DS3131 pentru a obține valorile de dată pe care le obține, se face de Autobuz I2C. Și pentru energie, puteți utiliza 2.3 până la 5.5v pentru DS3231, care este ceva mai mic decât 4.5 până la 5.5v pentru DS1307, deci poate fi mai eficient din punct de vedere energetic și poate face bateria să dureze mai mult.

De asemenea, trebuie să știți că aceste module au de obicei un EEPROM AT24C32 suplimentar pentru a stoca unele înregistrări și măsurători anterioare, ceea ce este destul de practic.

aplicatii

În ceea ce privește aplicațiile, am menționat deja câteva, cum ar fi implementarea unui ceas cu Arduino, pentru a crea un sistem care acționează pe baza Timpul Oricum, pentru a păstra timpul pe echipamente precum PC-uri și multe alte dispozitive electronice și aparate care au timp etc.

Poate fi folosit și în Proiecte pentru a crea temporizatoare pentru iluminat, sisteme de irigare, datalogger etc. Aplicațiile pot fi cele mai numeroase ...

Cumpărați un RTC DS3231

Modulul DS3131 este ieftin, și îl puteți găsi în unele magazine specializate de electronice sau în magazine mari precum eBay, AliExpress, Amazon etc. Dacă sunteți interesat să aveți una, iată câteva recomandări:

DS3231 Integrare Arduino

Captură de ecran a Arduino IDE

Dacă doriți integrează-ți DS3231 cu placa Arduino și începeți să creați proiecte „temporizate”, trebuie mai întâi să faceți conexiunile adecvate. Pentru a-l putea conecta, este la fel de simplu ca:

  • Pinul SLC al plăcii DS3231 trebuie să fie conectat la A5-ul dvs. Arduino UNO.
  • SDA-ul DS3231 este conectat la formatul A4 al Arduino.
  • Vcc din modul va merge la 5V de la Arduino.
  • GND la GND.
Nu uitați să instalați biblioteca pentru a utiliza RTC DS3231 în ID-ul dvs. Arduino sau codul nu va funcționa ...

Acum aveți sistemul conectat, următorul lucru este să scrieți schiță cod sursă pentru a-l programa. Puteți modifica codurile și le puteți adapta la nevoile dvs., dar puteți începe prin simpla obținere a datei de la un RTC DS3231 conectat la Arduino:

#include <Wire.h>
#include "RTClib.h"
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("No se encuentra el RTC"));
      while (1);
   }
 
   // Si se ha perdido el suministro eléctrico, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora (poner la de compilación del sketch)
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En este ejemplo el 2021-01-01 a las 00:00:00
      // rtc.adjust(DateTime(2020, 1, 1, 0, 0, 0));
   }
}
//Imprimir completa obtenida la fecha en decimal
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
 
   delay(3000);    //Espera 3 segundos
}

Și pentru a utiliza data RTC la programează o sarcină, cum ar fi pentru aprinderea sau stingerea luminilor, pentru udarea automată sau pentru a suna o alarmă etc. Amintiți-vă că pentru a manipula dispozitive de tensiune mai mare puteți utiliza tranzistoare sau releu:

#include <Wire.h>
#include "RTClib.h"
 
const int outputPin = LED_BUILTIN;
bool state = false;
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
void setup() {
   Serial.begin(9600);
   delay(1000);
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   if (rtc.lostPower()) {
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   }
}
 
// Se comprueba si está programado el encendido
bool isScheduledON(DateTime date)
{
   int weekDay = date.dayOfTheWeek();
   float hours = date.hour() + date.minute() / 60.0;
 
   // Configuración de horas de 08:30 a 9:30 y de 22:00 a 23:00 (usando decimal)
   bool hourCondition = (hours > 8.50 && hours < 9.50) || (hours > 22.00 && hours < 23.00);
 
   // Configuración del día Lunes, Sábado y Domingo con números (recuerda que en inglés comienza la semana en Domingo=0, Lunes=1,...
   bool dayCondition = (weekDay == 1 || weekDay == 6 || weekDay == 0); 
   if (hourCondition && dayCondition)
   {
      return true;
   }
   return false;
}
 
void loop() {
   DateTime now = rtc.now();
 
   if (state == false && isScheduledON(now))      // Apagado
   {
      digitalWrite(outputPin, HIGH);
      state = true;
      Serial.print("Activado");
   }
   else if (state == true && !isScheduledON(now))  // Encendido
   {
      digitalWrite(outputPin, LOW);
      state = false;
      Serial.print("Desactivado");
   }
 
   delay(3000);
}


Fii primul care comenteaza

Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.