DS3231: Ora dhe kalendari në kohë reale për Arduino tuaj

DS3231

Në disa projekte është e nevojshme të keni dëshmi për kohën, orën ose datën. Ose për shkak të nevojës për të kryer funksione të caktuara bazuar në kohë, për të mbajtur një kalendar të ngjarjeve ose regjistrimit, për të mbajtur kohën në një sistem, ose thjesht për të krijuar një orë dixhitale me Arduino. me DS3231 mund ta merrni, një tjetër nga komponentët që i shtojmë listës.

DS3231 është moduli që po kërkoni, dhe këtu do të gjeni gjithçka që ju nevojitet për kontrollin e tij dhe unë gjithashtu do t'ju tregoj një shembull se si integrojeni atë me Arduino me një shembull praktik ...

Çfarë është DS3231?

DS3231

Para së gjithash, ju duhet të dini se çfarë a RTC (Ora në kohë reale), ose ora në kohë reale. Këto patate të skuqura janë shumë të shpeshta në një mori aplikacionesh, në fakt, PC juaj ka njërën prej tyre në pllakën tuaj amë, dhe gjithashtu mundësohet nga një Bateri CR2032 gjithashtu. Theshtë ai që ruan kohën dhe konfigurimin në BIOS / UEFI dhe nga i cili sistemi operativ e merr atë gjatë nisjes që të jetë në kohë (edhe pse tani, me internet, sinkronizimi me serverat mund të përdoret për një precizitet më të madh, por kjo është një histori tjetër…).

Ajo që bën RTC është marrja e matjeve të kohës, aq e thjeshtë. Dallimi nga llojet e tjera të orëve elektronike është se ato thjesht mat kohën, dhe e bën këtë duke numëruar impulset e sinjalit të orës, duke ditur frekuencën dhe periudhat e tij. Përveç kohës, një RTC gjithashtu ju lejon të mbani një llogari të ditëve, javëve, muajve dhe viteve. Kjo është, data e plotë ...

Që kjo të jetë e mundur, RTC duhet të shoqërohet nga a Kristal Xtal ose kuarc i cili do të veprojë si një rezonator, ai që siguron frekuencën. Për më tepër, ju keni nevojë për qark elektronik të aftë për të numëruar dhe ruajtur datën në një memorie. Qarqet duhet të jenë të afta të numërojnë sekonda, minuta, orë, ditë, javë, muaj dhe vite.

kujtesa është e paqëndrueshmeKjo është arsyeja pse i duhet bateria, që të ketë energji konstante. Nëse nuk keni një bateri ose mbaron, ajo do të fshihet ... Kjo është ajo që ndodh me PC kur mbaron bateria, ato japin një kohë të pasaktë. Nëse e konfiguroni ndërsa PC është e ndezur, koha do të mbahet, pasi RTC po mundësohet, por është gjatë proceseve gjatë të cilave është fikur kur të nevojitet ajo bateri ...

Për projektet DIY, krijuesit zakonisht përdorin dy patate të skuqura të zakonshme RTC, të cilat janë ato DS1307 dhe DS3231. Të dyja janë prodhuar nga Maxim (ish Dallas Semiconductor), dhe DS3231 është më i saktë nga të dy, pasi nuk ndikohet nga ndryshimet e temperaturës si i pari. Prandaj, nuk luhatet aq shumë në varësi të temperaturës, dhe e mban kohën më saktësisht.

Ndonjëherë, me ndryshime të dukshme të temperaturës, DS1307 mund të mbetet aq i lagësht sa 1 ose 2 min në ditë. Diçka e patolerueshme për disa aplikacione.

DS3231 nuk është se nuk ndikohet nga variacionet, por që ka sisteme të integruara të matjes dhe kompensimit të temperaturës për të siguruar një saktësi prej 2ppm, e cila do të ishte ekuivalente me një vonesa në kohë prej rreth 172ms në ditë, domethënë, pak më shumë se 1 sekondë në javë më së shumti. Dhe në praktikë, ato zakonisht ndryshojnë vetëm 1 ose 2 sekonda në muaj.

Sa për mënyrën komunikojnë me RTC DS3131 për të marrë vlerat e datës që merr, bëhet nga Autobusi I2C. Dhe për energji, ju mund të përdorni 2.3 deri 5.5v për DS3231, i cili është disi më i ulët se 4.5 në 5.5v për DS1307, kështu që mund të jetë më efikas në energji dhe ta bëjë baterinë të zgjasë më shumë.

Gjithashtu, duhet të dini se këto module zakonisht kanë një EEPROM shtesë AT24C32 për të ruajtur disa regjistra dhe matje të mëparshme, e cila është mjaft praktike.

aplikimet

Lidhur me aplikacionet, unë kam përmendur tashmë disa, të tilla si për të zbatuar një orë me Arduino, për të krijuar një sistem që vepron bazuar në Koha Sido që të jetë, për të mbajtur kohën në pajisje të tilla si PC dhe shumë pajisje të tjera elektronike dhe pajisje që kanë kohë, etj.

Mund të përdoret gjithashtu në Projektet për të krijuar kohëmatës për ndriçimin, sistemet e ujitjes, regjistruesin e të dhënave, etj. Aplikimet mund të jenë më të shumtat ...

Blini një RTC DS3231

Moduli DS3131 është i lirë, dhe mund ta gjeni në disa dyqane të specializuara elektronike ose në dyqane të mëdha si eBay, AliExpress, Amazon, etj. Nëse jeni të interesuar të keni një, këtu janë disa rekomandime:

DS3231 Integrimi Arduino

Foto nga Arduino IDE

Nëse ju doni integroni DS3231 tuaj me bordin tuaj Arduino dhe filloni të krijoni projekte "me kohë", së pari duhet të bëni lidhjet e duhura. Për të qenë në gjendje ta lidhni, është aq e thjeshtë sa:

  • PIN-i SLC i bordit DS3231 duhet të jetë i lidhur me A5-në tuaj Arduino UNO.
  • SDA e DS3231 është e lidhur me A4 të Arduino.
  • Vcc nga moduli do të shkojë në 5V nga Arduino.
  • GND në GND.
Mos harroni të instaloni bibliotekën për të përdorur RTC DS3231 në Arduino IDE tuaj, ose kodi nuk do të funksionojë ...

Tani e keni të lidhur sistemin, gjëja tjetër është të shkruani skica e kodit burimor për ta programuar atë. Ju mund të modifikoni kodet dhe t'i përshtatni ato me nevojat tuaja, por mund të filloni duke marrë thjesht datën nga një RTC DS3231 i lidhur me 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
}

Dhe në mënyrë që të përdorni datën RTC në caktoni disa detyra, të tilla si për ndezjen ose çaktivizimin e dritave, për ujitje automatike ose që të bie një alarm, etj. Mos harroni se për të trajtuar pajisjet e tensionit të lartë mund të përdorni transistorë ose stafetë:

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


Bëhu i pari që komenton

Lini komentin tuaj

Adresa juaj e emailit nuk do të publikohet. Fusha e kërkuar janë shënuar me *

*

*

  1. Përgjegjës për të dhënat: Miguel Ángel Gatón
  2. Qëllimi i të dhënave: Kontrolloni SPAM, menaxhimin e komenteve.
  3. Legjitimimi: Pëlqimi juaj
  4. Komunikimi i të dhënave: Të dhënat nuk do t'u komunikohen palëve të treta përveç me detyrim ligjor.
  5. Ruajtja e të dhënave: Baza e të dhënave e organizuar nga Occentus Networks (BE)
  6. Të drejtat: Në çdo kohë mund të kufizoni, rikuperoni dhe fshini informacionin tuaj.