DS3231: real time na orasan at kalendaryo para sa iyong Arduino

DS3231

Sa ilang mga proyekto kinakailangan na magkaroon ng katibayan ng oras, oras, o petsa. Alinman sa pangangailangan na magsagawa ng ilang mga pag-andar batay sa oras, upang mapanatili ang isang kalendaryo ng mga kaganapan o pagpaparehistro, upang mapanatili ang oras sa isang system, o lamang upang lumikha ng isang digital na orasan kasama si Arduino. May ang DS3231 makukuha mo ito, isa pa sa piraso na idaragdag namin sa listahan.

Ang DS3231 ay ang module na iyong hinahanap, at dito makikita mo ang lahat ng kailangan mo para sa kontrol nito at ipapakita ko rin sa iyo ang isang halimbawa kung paano isama ito sa Arduino na may isang praktikal na halimbawa ...

Ano ang DS3231?

DS3231

Una sa lahat, dapat mong malaman kung ano ang a RTC (Real Time Clock), o real time na orasan. Ang mga chips na ito ay napakadalas sa maraming mga application, sa katunayan, ang iyong PC ay may isa sa mga ito sa iyong motherboard, at pinalakas din ito ng isang Baterya ng CR2032 din Ito ang nagpapanatili ng oras at pagsasaayos sa BIOS / UEFI at kung saan kinukuha ng operating system kapag nag-boot upang maging nasa oras (bagaman ngayon, sa Internet, ang pag-synchronize sa mga server ay maaaring magamit para sa mas tumpak, ngunit ito ay isa pang kwento ...).

Ang ginagawa ng RTC ay kumuha ng mga pagsukat ng oras, na simple. Ang pagkakaiba mula sa iba pang mga uri ng mga elektronikong relo ay simple lamang sila sukatin ang oras, at ginagawa ito sa pamamagitan ng pagbibilang ng mga pulso ng signal ng orasan, alam ang dalas at mga panahon nito. Bilang karagdagan sa oras, pinapayagan ka rin ng isang RTC na itago ang isang account ng mga araw, linggo, buwan at taon. Iyon ay, ang buong petsa ...

Upang maging posible ito, ang RTC ay dapat na may kasamang a Xtal o quartz na kristal na kung saan ay kikilos bilang isang resonator, ang isa na nagbibigay ng dalas. Bilang karagdagan, kailangan mo ng electronic circuitry na may kakayahang bilangin at itago ang petsa sa isang memorya. Ang circuitry ay dapat may kakayahang bilangin ang mga segundo, minuto, oras, araw, linggo, buwan at taon.

ESA pabagu-bago ng memoryaIyon ang dahilan kung bakit kailangan nito ang baterya, upang magkaroon ng palaging lakas. Kung wala kang baterya o naubos ito, mabubura ... Iyon ang nangyayari sa mga PC kapag naubos ang baterya, nagbibigay sila ng hindi tamang oras. Kung i-configure mo ito habang nakabukas ang PC, ang oras ay itatago, dahil ang RTC ay pinapatakbo, ngunit ito ay sa panahon ng mga proseso kung saan ito patayin kapag kailangan ang baterya na iyon ...

Para sa mga proyekto sa DIY, karaniwang gumagamit ang mga gumagawa ng dalawang karaniwang RTC chip, na alin ang DS1307 at DS3231. Parehong ginawa ng Maxim (dating Dallas Semiconductor), at ang DS3231 ay mas tumpak sa dalawa, dahil hindi ito apektado ng mga pagkakaiba-iba ng temperatura tulad ng dati. Samakatuwid, hindi ito nagbabagu-bago nang labis depende sa temperatura, at pinapanatili nitong mas tumpak ang oras.

Sa mga oras, na may kapansin-pansin na mga pagkakaiba sa temperatura, ang DS1307 ay maaaring mahuli ng 1 o 2 minuto bawat araw. Isang bagay na hindi matiis para sa ilang mga application.

Ang DS3231 ay hindi naapektuhan ng mga pagkakaiba-iba, ngunit mayroon itong built-in na pagsukat ng temperatura at mga sistema ng pagbabayad upang matiyak ang isang kawastuhan ng 2ppm, na magiging katumbas ng isang tagal ng oras ng tungkol sa 172ms sa isang araw, iyon ay, isang maliit na higit sa 1 segundo sa isang linggo na higit pa. At sa pagsasagawa, karaniwang nag-iiba lamang sila ng 1 o 2 segundo sa isang buwan.

Para naman sa paraan makipag-usap sa RTC DS3131 upang makuha ang mga halaga ng petsa na nakukuha nito, ginagawa ito ng I2C bus. At para sa lakas, maaari mong gamitin ang 2.3 hanggang 5.5v para sa DS3231, na kung saan ay mas mababa kaysa sa 4.5 hanggang 5.5v para sa DS1307, kaya maaari itong maging mas mahusay sa enerhiya at gawing mas matagal ang baterya.

Gayundin, dapat mong malaman na ang mga modyul na ito ay karaniwang may a EEPROM karagdagang AT24C32 upang mag-imbak ng ilang mga talaan at mga nakaraang pagsukat, na medyo praktikal.

aplikasyon

Tulad ng para sa mga application, nabanggit ko na ang ilan, tulad ng upang magpatupad ng isang orasan kasama ang Arduino, upang lumikha ng isang system na kumikilos batay sa Ang oras Ano pa man, upang mapanatili ang oras sa mga kagamitan tulad ng PC at maraming iba pang mga elektronikong aparato at kagamitan na may oras, atbp.

Maaari ring magamit sa mga proyekto upang lumikha ng mga timer para sa pag-iilaw, mga sistema ng irigasyon, datalogger, atbp. Ang mga application ay maaaring ang pinaka ...

Bumili ng isang RTC DS3231

Ang modyul Mura ang DS3131, at mahahanap mo ito sa ilang mga dalubhasang tindahan ng electronics o sa malalaking tindahan tulad ng eBay, AliExpress, Amazon, atbp. Kung interesado kang magkaroon ng isa, narito ang ilang mga rekomendasyon:

DS3231 Arduino Pagsasama

Screenshot ng Arduino IDE

Kung nais mong isama ang iyong DS3231 sa iyong Arduino board at simulang lumikha ng mga proyekto na "nag-time", dapat mo munang gawin ang mga naaangkop na koneksyon. Upang maiugnay ito, ito ay kasing simple ng:

  • Ang SLC pin ng DS3231 board ay dapat na konektado sa A5 ng iyong Arduino UNO.
  • Ang SDA ng DS3231 ay konektado sa A4 ng Arduino.
  • Ang Vcc mula sa module ay pupunta sa 5V mula sa Arduino.
  • GND sa GND.
Tandaan na mai-install ang silid-aklatan upang magamit ang RTC DS3231 sa iyong Arduino IDE o hindi gagana ang code ...

Ngayon ay nakakonekta ang system, ang susunod na bagay ay isulat ang sketch source code upang mai-program ito. Maaari mong baguhin ang mga code at iakma ang mga ito sa iyong mga pangangailangan, ngunit maaari kang magsimula sa pamamagitan lamang ng pagkuha ng petsa mula sa isang RTC DS3231 na konektado sa 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
}

At upang magamit ang petsa ng RTC sa iskedyul ang ilang gawain, tulad ng pag-on o pag-on ng mga ilaw, para sa awtomatikong pagtutubig, o para sa tunog ng alarma, atbp. Tandaan na upang mahawakan ang mas mataas na mga aparato ng boltahe maaari kang gumamit ng mga transistor o relay:

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


Maging una sa komento

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.