DS3231: realtidsklocka och kalender för din Arduino

DS3231

I vissa projekt är det nödvändigt att ha bevis på tid, timme eller datum. Antingen på grund av behovet av att utföra vissa funktioner baserat på tid, att hålla en kalender för händelser eller registrering, att hålla tiden i ett system eller helt enkelt att skapa en digital klocka med Arduino. Med DS3231 du kan få det, en annan av komponenter som vi lägger till i listan.

DS3231 är den modul du letade efter, och här hittar du allt du behöver för dess kontroll och jag kommer också att visa dig ett exempel på hur integrera den med Arduino med ett praktiskt exempel ...

Vad är DS3231?

DS3231

Först och främst borde du veta vad en RTC (realtidsklocka)eller realtidsklocka. Dessa marker är mycket frekventa i en mängd applikationer, faktiskt har din dator en av dem på ditt moderkort, och den drivs också av en CR2032 batteri också. Det är den som bibehåller tiden och konfigurationen i BIOS / UEFI och från vilken operativsystemet tar det när det startas för att vara i tid (även om nu, med Internet, kan synkronisering med servrar användas för större precision, men detta är en annan historia ...).

Vad RTC gör är att få tidsmätningar, så enkelt. Skillnaden från andra typer av elektroniska klockor är att de helt enkelt mäta tiden, och det gör det genom att räkna klocksignalpulser, känna frekvensen och perioderna för den. Förutom tiden tillåter en RTC dig också att redovisa dagar, veckor, månader och år. Det vill säga hela dagen ...

För att detta ska vara möjligt måste RTC åtföljas av a Xtal eller kvartskristall som fungerar som en resonator, den som ger frekvensen. Dessutom behöver du elektroniska kretsar som kan räkna och lagra datumet i ett minne. Kretsarna måste kunna räkna sekunder, minuter, timmar, dagar, veckor, månader och år.

Det minnet är flyktigtDet är därför det behöver batteriet för att ha konstant ström. Om du inte har ett batteri eller det tar slut raderas det ... Det är vad som händer med datorer när batteriet tar slut, de ger en felaktig tid. Om du konfigurerar den medan datorn är på kommer tiden att sparas eftersom RTC är påslagen, men det är under de processer under vilka den är avstängd när batteriet behövs ...

För DIY-projekt använder tillverkare vanligtvis två vanliga RTC-marker, som är DS1307 och DS3231. Båda är gjorda av Maxim (tidigare Dallas Semiconductor), och DS3231 är den mer exakta av de två, eftersom den inte påverkas lika av temperaturvariationer som den tidigare gör. Därför fluktuerar det inte så mycket beroende på temperaturen och det håller tiden mer exakt.

Ibland, med märkbara temperaturskillnader, kan DS1307 vara så försenad som 1 eller 2 minuter per dag. Något oacceptabelt för vissa applikationer.

DS3231 är inte att den inte påverkas av variationer, utan att den har inbyggda temperaturmätnings- och kompensationssystem för att säkerställa en noggrannhet på 2 ppm, vilket skulle motsvara en tidsfördröjning på cirka 172ms per dag, det vill säga lite mer än 1 sekund per vecka. Och i praktiken varierar de vanligtvis bara 1 eller 2 sekunder per månad.

När det gäller vägen kommunicera med RTC DS3131 för att erhålla datumvärdena det görs görs av I2C-buss. Och för ström kan du använda 2.3 till 5.5 v för DS3231, vilket är något lägre än 4.5 till 5.5 v för DS1307, så det kan vara mer energieffektivt och få batteriet att hålla längre.

Du bör också veta att dessa moduler vanligtvis har en EEPROM ytterligare AT24C32 för att lagra några poster och tidigare mätningar, vilket är ganska praktiskt.

tillämpningar

När det gäller applikationerna har jag redan nämnt några, som att implementera en klocka med Arduino, för att skapa ett system som fungerar baserat på Tiden Oavsett, för att hålla tiden på utrustning som datorer och många andra elektroniska enheter och apparater som har tid, etc.

Kan också användas i projekt att skapa timers för belysning, bevattningssystem, datalogger, etc. Applikationerna kan vara de många ...

Köp en RTC DS3231

Modulen DS3131 är billigt, och du kan hitta den i vissa specialiserade elektronikbutiker eller stora butiker som eBay, AliExpress, Amazon, etc. Om du är intresserad av att ha en, här är några rekommendationer:

DS3231 Arduino-integration

Skärmdump av Arduino IDE

Om du vill integrera din DS3231 med ditt Arduino-kort och börja skapa "tidsbestämda" projekt måste du först skapa lämpliga anslutningar. För att kunna ansluta det är det så enkelt som:

  • SLC-stiftet på DS3231-kortet måste anslutas till din A5 Arduino UNO.
  • SDA på DS3231 är ansluten till Arduino A4.
  • Vcc från modulen går till 5V från Arduino.
  • GND till GND.
Kom ihåg att installera biblioteket för att använda RTC DS3231 i din Arduino IDE eller så fungerar inte koden ...

Nu har du anslutit systemet, nästa sak är att skriva skiss källkod för att programmera det. Du kan ändra koderna och anpassa dem efter dina behov, men du kan börja med att helt enkelt få datumet från en RTC DS3231 ansluten till 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
}

Och för att använda RTC-datumet till schemalägga någon uppgift, t.ex. för att tända eller släcka lampor, för automatisk bevattning eller för att ett alarm ska ljuda etc. Kom ihåg att för att hantera enheter med högre spänning kan du använda transistorer eller relä:

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


Innehållet i artikeln följer våra principer om redaktionell etik. Klicka på för att rapportera ett fel här.

Bli först att kommentera

Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.